Browse Source

Implemented forum-16705: MyBase keyword and code completion in constructors

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2536 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
d6346a6d19
  1. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs
  2. 20
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs
  3. 37
      src/Main/Base/Test/NRefactoryResolverTests.cs
  4. 14
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs
  5. 25
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs

2
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs

@ -186,7 +186,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -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;

20
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs

@ -139,10 +139,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -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 @@ -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 @@ -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 @@ -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);

37
src/Main/Base/Test/NRefactoryResolverTests.cs

@ -878,6 +878,43 @@ namespace A.B { @@ -878,6 +878,43 @@ namespace A.B {
TypeResolveResult trr = Resolve<TypeResolveResult>(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<MemberResolveResult>(program, "mybase.new(\"bb\")", 4);
Assert.AreEqual("B", mrr.ResolvedMember.DeclaringType.FullyQualifiedName);
Assert.IsTrue(((IMethod)mrr.ResolvedMember).IsConstructor);
ResolveResult result = ResolveVB<VBBaseOrThisReferenceInConstructorResolveResult>(program, "mybase", 4);
Assert.AreEqual("B", result.ResolvedType.FullyQualifiedName);
Assert.IsTrue(ContainsMember(result.GetCompletionData(result.CallingClass.ProjectContent), mrr.ResolvedMember.FullyQualifiedName));
result = ResolveVB<ResolveResult>(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<IMember>(input), delegate(IMember m) {
return m.FullyQualifiedName == fullMemberName;
});
}
#endregion
#region Import class tests

14
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

@ -433,6 +433,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -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<IMethod> constructors = new List<IMethod>();
foreach (IMethod m in type.GetMethods()) {
@ -892,6 +898,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -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)

25
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ResolveResult.cs

@ -80,7 +80,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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 @@ -544,4 +544,27 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
#endregion
#region VBBaseOrThisReferenceInConstructorResolveResult
/// <summary>
/// Is used for "MyBase" or "Me" in VB constructors to show "New" in the completion list.
/// </summary>
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
}

Loading…
Cancel
Save