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");
+ }
+ }
+}