diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index 968de794f6..072332d71f 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -752,6 +752,26 @@ class TestClass { LocalResolveResult lr = Resolve(program, "a", 5); Assert.AreEqual("System.Collections.ArrayList", lr.ResolvedType.FullyQualifiedName, "a"); } + + [Test] + public void ResolveNamespaceSD2_863() + { + string program = @"using System; +namespace A.C { class D {} } +namespace A.B.C { class D {} } +namespace A.B { + class TestClass { + void Test() { + + } + } +} +"; + NamespaceResolveResult nrr = Resolve(program, "C", 7); + Assert.AreEqual("A.B.C", nrr.Name, "nrr.Name"); + TypeResolveResult trr = Resolve(program, "C.D", 7); + Assert.AreEqual("A.B.C.D", trr.ResolvedClass.FullyQualifiedName, "trr.ResolvedClass.FullyQualifiedName"); + } #endregion #region Import class tests diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs index 200471627b..bc5dc58608 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs @@ -21,7 +21,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver public class NRefactoryASTConvertVisitor : AbstractAstVisitor { ICompilationUnit cu; - Stack currentNamespace = new Stack(); + Stack currentNamespace = new Stack(); Stack currentClass = new Stack(); public ICompilationUnit Cu { @@ -252,7 +252,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (currentNamespace.Count == 0) { name = namespaceDeclaration.Name; } else { - name = (string)currentNamespace.Peek() + '.' + namespaceDeclaration.Name; + name = currentNamespace.Peek() + '.' + namespaceDeclaration.Name; } currentNamespace.Push(name); @@ -300,7 +300,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (currentNamespace.Count == 0) { c.FullyQualifiedName = typeDeclaration.Name; } else { - c.FullyQualifiedName = (string)currentNamespace.Peek() + '.' + typeDeclaration.Name; + c.FullyQualifiedName = currentNamespace.Peek() + '.' + typeDeclaration.Name; } cu.Classes.Add(c); } @@ -403,7 +403,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (currentNamespace.Count == 0) { c.FullyQualifiedName = name; } else { - c.FullyQualifiedName = (string)currentNamespace.Peek() + '.' + name; + c.FullyQualifiedName = currentNamespace.Peek() + '.' + name; } cu.Classes.Add(c); } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs index 176aeadacb..df7f9e9d82 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs @@ -737,22 +737,19 @@ namespace ICSharpCode.SharpDevelop.Dom } } if (curType != null) { - // Try parent namespaces of the current class + // Try relative to current namespace and relative to parent namespaces string fullname = curType.Namespace; - if (fullname != null && fullname.Length > 0) { - string[] namespaces = fullname.Split('.'); - StringBuilder curnamespace = new StringBuilder(); - for (int i = 0; i < namespaces.Length; ++i) { - curnamespace.Append(namespaces[i]); - curnamespace.Append('.'); - - curnamespace.Append(name); - string nameSpace = curnamespace.ToString(); - if (NamespaceExists(nameSpace)) { - return nameSpace; - } - // remove class name again to try next namespace - curnamespace.Length -= name.Length; + while (fullname != null && fullname.Length > 0) { + string nameSpace = fullname + '.' + name; + if (NamespaceExists(nameSpace)) { + return nameSpace; + } + + int pos = fullname.LastIndexOf('.'); + if (pos < 0) { + fullname = null; + } else { + fullname = fullname.Substring(0, pos); } } }