From 7895c2ad96cfbc93cef1bc203b5698f553a41ae7 Mon Sep 17 00:00:00 2001 From: Christian Hornung Date: Mon, 4 Aug 2008 18:16:30 +0000 Subject: [PATCH] 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 --- .../Resolver/NRefactoryResourceResolver.cs | 20 +++- .../BclNRefactoryResourceResolverTests.cs | 7 ++ .../Test/ResourceToolkit.Tests.csproj | 3 + ...bstractVBNetResourceResolverTestFixture.cs | 38 ++++++ .../BclNRefactoryResourceResolverTests.cs | 110 ++++++++++++++++++ 5 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 src/AddIns/Misc/ResourceToolkit/Test/VBNet/AbstractVBNetResourceResolverTestFixture.cs create mode 100644 src/AddIns/Misc/ResourceToolkit/Test/VBNet/BclNRefactoryResourceResolverTests.cs diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/NRefactoryResourceResolver.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/NRefactoryResourceResolver.cs index d44c38ebc3..ac5e208965 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/NRefactoryResourceResolver.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/NRefactoryResourceResolver.cs @@ -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 return null; } + bool foundStringLiteral = false; + while (true) { ExpressionResult result = ef.FindFullExpression(document.TextContent, caretOffset); @@ -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 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; } } diff --git a/src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs b/src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs index c45f4e3c98..6287cede8a 100644 --- a/src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs +++ b/src/AddIns/Misc/ResourceToolkit/Test/CSharp/BclNRefactoryResourceResolverTests.cs @@ -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; diff --git a/src/AddIns/Misc/ResourceToolkit/Test/ResourceToolkit.Tests.csproj b/src/AddIns/Misc/ResourceToolkit/Test/ResourceToolkit.Tests.csproj index 0de4c40c66..85923b4608 100644 --- a/src/AddIns/Misc/ResourceToolkit/Test/ResourceToolkit.Tests.csproj +++ b/src/AddIns/Misc/ResourceToolkit/Test/ResourceToolkit.Tests.csproj @@ -58,6 +58,8 @@ + + @@ -89,5 +91,6 @@ ResourceToolkit + \ No newline at end of file diff --git a/src/AddIns/Misc/ResourceToolkit/Test/VBNet/AbstractVBNetResourceResolverTestFixture.cs b/src/AddIns/Misc/ResourceToolkit/Test/VBNet/AbstractVBNetResourceResolverTestFixture.cs new file mode 100644 index 0000000000..4d78cf1d4d --- /dev/null +++ b/src/AddIns/Misc/ResourceToolkit/Test/VBNet/AbstractVBNetResourceResolverTestFixture.cs @@ -0,0 +1,38 @@ +// +// +// +// +// $Revision$ +// + +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; + } + } +} diff --git a/src/AddIns/Misc/ResourceToolkit/Test/VBNet/BclNRefactoryResourceResolverTests.cs b/src/AddIns/Misc/ResourceToolkit/Test/VBNet/BclNRefactoryResourceResolverTests.cs new file mode 100644 index 0000000000..6356e41a32 --- /dev/null +++ b/src/AddIns/Misc/ResourceToolkit/Test/VBNet/BclNRefactoryResourceResolverTests.cs @@ -0,0 +1,110 @@ +// +// +// +// +// $Revision$ +// + +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"); + } + } +}