diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs index 5b321c7104..92f1678f56 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs @@ -186,7 +186,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor } } else if (o is IMethod) { IMethod method = (IMethod)o; - if (method.Name != null &&!method.IsConstructor) { + if (method.Name != null) { CodeCompletionData ccd = new CodeCompletionData(method); if (insertedElements[method.Name] == null) { insertedElements[method.Name] = ccd; diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs index 8d8dcb35de..a36a166d9e 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs @@ -139,10 +139,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor public CodeCompletionData(IMethod method) { member = method; + imageIndex = ClassBrowserIconService.GetIcon(method); ambience = AmbienceService.CurrentAmbience; + ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList; + text = ambience.Convert(method); ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; - imageIndex = ClassBrowserIconService.GetIcon(method); - text = method.Name; description = ambience.Convert(method); documentation = method.Documentation; GetPriority(method.DotNetName); @@ -152,9 +153,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor { member = field; ambience = AmbienceService.CurrentAmbience; - ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; imageIndex = ClassBrowserIconService.GetIcon(field); - text = field.Name; + ambience.ConversionFlags = ConversionFlags.None; + text = ambience.Convert(field); + ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; description = ambience.Convert(field); documentation = field.Documentation; GetPriority(field.DotNetName); @@ -164,9 +166,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor { member = property; ambience = AmbienceService.CurrentAmbience; - ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; imageIndex = ClassBrowserIconService.GetIcon(property); - text = property.Name; + ambience.ConversionFlags = ConversionFlags.None; + text = ambience.Convert(property); + ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; description = ambience.Convert(property); documentation = property.Documentation; GetPriority(property.DotNetName); @@ -176,9 +179,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor { member = e; ambience = AmbienceService.CurrentAmbience; - ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; imageIndex = ClassBrowserIconService.GetIcon(e); - text = e.Name; + ambience.ConversionFlags = ConversionFlags.None; + text = ambience.Convert(e); + ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; description = ambience.Convert(e); documentation = e.Documentation; GetPriority(e.DotNetName); diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index ea2027c99f..3626e85ac9 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -878,6 +878,43 @@ namespace A.B { TypeResolveResult trr = Resolve(program, "C", 7); Assert.AreEqual("A.B.C", trr.ResolvedClass.FullyQualifiedName, "trr.ResolvedClass.FullyQualifiedName"); } + + [Test] + public void VBBaseConstructorCall() + { + string program = @"Class A +Inherits B + Sub New() + + End Sub + Sub Test() + + End Sub +End Class +Class B + Sub New(a As String) + End Sub +End Class +"; + MemberResolveResult mrr = ResolveVB(program, "mybase.new(\"bb\")", 4); + Assert.AreEqual("B", mrr.ResolvedMember.DeclaringType.FullyQualifiedName); + Assert.IsTrue(((IMethod)mrr.ResolvedMember).IsConstructor); + + ResolveResult result = ResolveVB(program, "mybase", 4); + Assert.AreEqual("B", result.ResolvedType.FullyQualifiedName); + Assert.IsTrue(ContainsMember(result.GetCompletionData(result.CallingClass.ProjectContent), mrr.ResolvedMember.FullyQualifiedName)); + + result = ResolveVB(program, "mybase", 7); + Assert.AreEqual("B", result.ResolvedType.FullyQualifiedName); + Assert.IsFalse(ContainsMember(result.GetCompletionData(result.CallingClass.ProjectContent), mrr.ResolvedMember.FullyQualifiedName)); + } + + bool ContainsMember(IEnumerable input, string fullMemberName) + { + return Linq.Exists(Linq.OfType(input), delegate(IMember m) { + return m.FullyQualifiedName == fullMemberName; + }); + } #endregion #region Import class 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 027732c912..0b8ce03796 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs @@ -433,6 +433,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (type == null || type.FullyQualifiedName == "") { return null; } + if (language == NR.SupportedLanguage.VBNet + && callingMember is IMethod && (callingMember as IMethod).IsConstructor + && (expr is BaseReferenceExpression || expr is ThisReferenceExpression)) + { + return new VBBaseOrThisReferenceInConstructorResolveResult(callingClass, callingMember, type); + } if (expr is ObjectCreateExpression) { List constructors = new List(); foreach (IMethod m in type.GetMethods()) { @@ -892,6 +898,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (callingClass != null) isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(type.GetUnderlyingClass()); + if (language == NR.SupportedLanguage.VBNet && IsSameName(memberName, "New")) { + foreach (IMethod m in type.GetMethods()) { + if (m.IsConstructor && m.IsAccessible(callingClass, isClassInInheritanceTree)) { + methods.Add(m); + } + } + } + foreach (IMethod m in type.GetMethods()) { if (IsSameName(m.Name, memberName) && m.IsAccessible(callingClass, isClassInInheritanceTree) diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs index 97cce37cc3..695740db35 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs @@ -80,7 +80,7 @@ namespace ICSharpCode.SharpDevelop.Dom if (callingClass != null) isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(resolvedType.GetUnderlyingClass()); foreach (IMethod m in resolvedType.GetMethods()) { - if (language.ShowMember(m, showStatic) && m.IsAccessible(callingClass, isClassInInheritanceTree)) + if (language.ShowMember(m, showStatic) && m.IsAccessible(callingClass, isClassInInheritanceTree) && !m.IsConstructor) res.Add(m); } foreach (IEvent e in resolvedType.GetEvents()) { @@ -544,4 +544,27 @@ namespace ICSharpCode.SharpDevelop.Dom } } #endregion + + #region VBBaseOrThisReferenceInConstructorResolveResult + /// + /// Is used for "MyBase" or "Me" in VB constructors to show "New" in the completion list. + /// + public sealed class VBBaseOrThisReferenceInConstructorResolveResult : ResolveResult + { + public VBBaseOrThisReferenceInConstructorResolveResult(IClass callingClass, IMember callingMember, IReturnType referencedType) + : base(callingClass, callingMember, referencedType) + { + } + + public override ArrayList GetCompletionData(IProjectContent projectContent) + { + ArrayList res = base.GetCompletionData(projectContent); + foreach (IMethod m in this.ResolvedType.GetMethods()) { + if (m.IsConstructor && !m.IsStatic && m.IsAccessible(this.CallingClass, true)) + res.Add(m); + } + return res; + } + } + #endregion }