From df2adaa0d506082de8c28809782cbe84e7f1cf7b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 13 Oct 2007 10:47:07 +0000 Subject: [PATCH] Fixed forum-19285: code-completion for nested inner classes git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2715 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- src/Main/Base/Test/NRefactoryResolverTests.cs | 28 +++++++++++++++++++ .../NRefactoryResolver/NRefactoryResolver.cs | 11 -------- .../Src/NRefactoryResolver/TypeVisitor.cs | 16 +++++++++-- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index 0a836d330c..817a3064a8 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -721,6 +721,34 @@ End Class Assert.AreEqual("rectangle", m.Parameters[0].Name); Assert.IsTrue(m.Parameters[0].IsRef); } + + [Test] + public void NestedInnerClasses() + { + string program = @"using System; +public sealed class GL { + void Test() { + + } + + public class Enums + { + public enum BeginMode {QUADS, LINES } + } +} +"; + TypeResolveResult trr = Resolve(program, "GL.Enums.BeginMode", 4); + Assert.AreEqual("GL.Enums.BeginMode", trr.ResolvedClass.FullyQualifiedName); + + trr = Resolve(program, "Enums.BeginMode", 4); + Assert.AreEqual("GL.Enums.BeginMode", trr.ResolvedClass.FullyQualifiedName); + + MemberResolveResult mrr = Resolve(program, "GL.Enums.BeginMode.LINES", 4); + Assert.AreEqual("GL.Enums.BeginMode.LINES", mrr.ResolvedMember.FullyQualifiedName); + + mrr = Resolve(program, "Enums.BeginMode.LINES", 4); + Assert.AreEqual("GL.Enums.BeginMode.LINES", mrr.ResolvedMember.FullyQualifiedName); + } #endregion #region Import namespace tests diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs index 3fa1b426e9..0e0772c2ff 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs @@ -1081,17 +1081,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver #region SearchMember // no methods or indexer - public IReturnType SearchMember(IReturnType type, string memberName) - { - if (type == null) - return null; - IMember member = GetMember(type, memberName); - if (member == null) - return null; - else - return member.ReturnType; - } - public IMember GetMember(IReturnType type, string memberName) { if (type == null) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/TypeVisitor.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/TypeVisitor.cs index 8db9374460..2fdbce440b 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/TypeVisitor.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/TypeVisitor.cs @@ -326,9 +326,21 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return member.ReturnType; } } - return null; + } else { + IMember member = resolver.GetMember(returnType, memberReferenceExpression.FieldName); + if (member != null) { + return member.ReturnType; + } else { + IClass c = returnType.GetUnderlyingClass(); + if (c != null) { + foreach (IClass innerClass in c.InnerClasses) { + if (resolver.IsSameName(innerClass.Name, memberReferenceExpression.FieldName)) { + return innerClass.DefaultReturnType; + } + } + } + } } - return resolver.SearchMember(returnType, memberReferenceExpression.FieldName); } return null; }