Browse Source

ResourceToolkit: When resolving on a string literal, directly go back to its beginning instead of retrying every position. Added unit test for a bug fixed by this change. Added some VB.NET resource resolver unit tests.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3284 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Christian Hornung 18 years ago
parent
commit
7895c2ad96
  1. 20
      src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/NRefactoryResourceResolver.cs
  2. 7
      src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs
  3. 3
      src/AddIns/Misc/ResourceToolkit/Test/ResourceToolkit.Tests.csproj
  4. 38
      src/AddIns/Misc/ResourceToolkit/Test/VBNet/AbstractVBNetResourceResolverTestFixture.cs
  5. 110
      src/AddIns/Misc/ResourceToolkit/Test/VBNet/BclNRefactoryResourceResolverTests.cs

20
src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/NRefactoryResourceResolver.cs

@ -17,6 +17,7 @@ using ICSharpCode.NRefactory.Ast; @@ -17,6 +17,7 @@ using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Document;
namespace Hornung.ResourceToolkit.Resolver
@ -116,6 +117,8 @@ namespace Hornung.ResourceToolkit.Resolver @@ -116,6 +117,8 @@ namespace Hornung.ResourceToolkit.Resolver
return null;
}
bool foundStringLiteral = false;
while (true) {
ExpressionResult result = ef.FindFullExpression(document.TextContent, caretOffset);
@ -123,7 +126,7 @@ namespace Hornung.ResourceToolkit.Resolver @@ -123,7 +126,7 @@ namespace Hornung.ResourceToolkit.Resolver
if (result.Expression == null) {
// Try to find an expression to the left, but only
// in the same line.
if (--caretOffset < 0 || document.GetLineNumberForOffset(caretOffset) != caretLine) {
if (foundStringLiteral || --caretOffset < 0 || document.GetLineNumberForOffset(caretOffset) != caretLine) {
return null;
}
continue;
@ -136,11 +139,24 @@ namespace Hornung.ResourceToolkit.Resolver @@ -136,11 +139,24 @@ namespace Hornung.ResourceToolkit.Resolver
return null;
} else if ((pe = expr as PrimitiveExpression) != null) {
if (pe.Value is string) {
if (foundStringLiteral) {
return null;
}
// We are inside a string literal and need to find
// the next outer expression to decide
// whether it is a resource key.
if (--caretOffset < 0) return null;
// Go back to the start of the string literal - 2.
caretOffset = document.PositionToOffset(new TextLocation(result.Region.BeginColumn - 1, result.Region.BeginLine - 1)) - 2;
if (caretOffset < 0) return null;
foundStringLiteral = true;
continue;
} else {
return null;
}
}

7
src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs

@ -205,6 +205,13 @@ class A @@ -205,6 +205,13 @@ class A
TestHelper.CheckReference(rrr, "Test.TestResources", "TestKey", "A", "A.B");
}
[Test]
public void LocalIndexerRMBug1SecondRef()
{
ResourceResolveResult rrr = Resolve(CodeLocalIndexerRMBug1, 15, 31, null);
TestHelper.CheckNoReference(rrr);
}
// ********************************************************************************************************************************
const string CodeLocalSRMDirectInitAlias = @"using SRM = System.Resources.ResourceManager;

3
src/AddIns/Misc/ResourceToolkit/Test/ResourceToolkit.Tests.csproj

@ -58,6 +58,8 @@ @@ -58,6 +58,8 @@
<Compile Include="CSharp\SpecificResourceReferenceFinderTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TestHelper.cs" />
<Compile Include="VBNet\AbstractVBNetResourceResolverTestFixture.cs" />
<Compile Include="VBNet\BclNRefactoryResourceResolverTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj">
@ -89,5 +91,6 @@ @@ -89,5 +91,6 @@
<Name>ResourceToolkit</Name>
</ProjectReference>
<Folder Include="CSharp" />
<Folder Include="VBNet" />
</ItemGroup>
</Project>

38
src/AddIns/Misc/ResourceToolkit/Test/VBNet/AbstractVBNetResourceResolverTestFixture.cs

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Christian Hornung" email="chhornung@googlemail.com"/>
// <version>$Revision$</version>
// </file>
using System;
using System.IO;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Internal.Templates;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using VBNetBinding;
namespace ResourceToolkit.Tests.VBNet
{
public abstract class AbstractVBNetResourceResolverTestFixture : AbstractResourceResolverTestFixture
{
protected override string DefaultFileName {
get { return "a.vb"; }
}
protected override IProject CreateTestProject()
{
ProjectCreateInformation info = new ProjectCreateInformation();
info.ProjectName = "Test";
info.RootNamespace = "Test";
info.OutputProjectFileName = Path.Combine(Path.GetTempPath(), "Test.vbproj");
info.Solution = this.Solution;
VBNetProject p = new VBNetProject(info);
return p;
}
}
}

110
src/AddIns/Misc/ResourceToolkit/Test/VBNet/BclNRefactoryResourceResolverTests.cs

@ -0,0 +1,110 @@ @@ -0,0 +1,110 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Christian Hornung" email="chhornung@googlemail.com"/>
// <version>$Revision$</version>
// </file>
using System;
using Hornung.ResourceToolkit;
using Hornung.ResourceToolkit.Resolver;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Dom;
using NUnit.Framework;
namespace ResourceToolkit.Tests.VBNet
{
[TestFixture]
public sealed class BclNRefactoryResourceResolverTests : AbstractVBNetResourceResolverTestFixture
{
// ********************************************************************************************************************************
const string CodeLocalSRMDirectInitFullName = @"Class A
Sub B
Dim mgr As New System.Resources.ResourceManager(""Test.TestResources"", System.Reflection.Assembly.GetExecutingAssembly())
mgr.GetString(""TestKey"")
End Sub
Sub C
mgr.GetString(""TestKey"")
End Sub
End Class
";
[Test]
public void LocalSRMDirectInitFullNameGetString()
{
ResourceResolveResult rrr = Resolve(CodeLocalSRMDirectInitFullName, 3, 18, null);
TestHelper.CheckReference(rrr, "Test.TestResources", "TestKey", "A", "A.B");
}
[Test]
public void LocalSRMDirectInitFullNameOutOfScope()
{
ResourceResolveResult rrr = Resolve(CodeLocalSRMDirectInitFullName, 7, 18, null);
TestHelper.CheckNoReference(rrr);
}
// ********************************************************************************************************************************
const string CodeLocalSRMDeferredInitUsing = @"Imports System.Resources
Class A
Sub B
Dim mgr As ResourceManager
mgr = New ResourceManager(""Test.TestResources"", System.Reflection.Assembly.GetExecutingAssembly())
mgr.GetString(""TestKey"")
mgr.GetString(
End Sub
End Class
";
[Test]
public void LocalSRMDeferredInitUsingGetString()
{
ResourceResolveResult rrr = Resolve(CodeLocalSRMDeferredInitUsing, 6, 18, null);
TestHelper.CheckReference(rrr, "Test.TestResources", "TestKey", "A", "A.B");
}
[Test]
public void LocalSRMDeferredInitUsingGetStringCompletion()
{
ResourceResolveResult rrr = Resolve(CodeLocalSRMDeferredInitUsing, 7, 16, '(');
TestHelper.CheckReference(rrr, "Test.TestResources", null, "A", "A.B");
}
// ********************************************************************************************************************************
const string CodeStaticPropertySRMFieldDirectInitUsing = @"Imports System.Resources
Class A
Public Shared ReadOnly Property Resources As ResourceManager
Get
Return mgr
End Get
End Property
Private Shared mgr As New ResourceManager(""Test.TestResources"", System.Reflection.Assembly.GetExecutingAssembly())
Sub B()
A.Resources.GetString(""TestKey"")
Resources.GetString(""TestKey"")
End Sub
End Class
";
[Test]
public void StaticPropertySRMFieldDirectInitUsingClassGetString()
{
ResourceResolveResult rrr = Resolve(CodeStaticPropertySRMFieldDirectInitUsing, 11, 25, null);
TestHelper.CheckReference(rrr, "Test.TestResources", "TestKey", "A", "A.B");
}
[Test]
public void StaticPropertySRMFieldDirectInitUsingGetString()
{
ResourceResolveResult rrr = Resolve(CodeStaticPropertySRMFieldDirectInitUsing, 12, 23, null);
TestHelper.CheckReference(rrr, "Test.TestResources", "TestKey", "A", "A.B");
}
}
}
Loading…
Cancel
Save