Browse Source

fix #339 - Incorrect decompilation of VB.NET properties with parameters.

pull/703/head
Siegfried Pammer 9 years ago
parent
commit
f8ac9823dd
  1. 30
      ILSpy/TreeNodes/PropertyTreeNode.cs
  2. 22
      ILSpy/VB/ILSpyEnvironmentProvider.cs
  3. 3
      NRefactory.VB/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

30
ILSpy/TreeNodes/PropertyTreeNode.cs

@ -62,7 +62,35 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -62,7 +62,35 @@ namespace ICSharpCode.ILSpy.TreeNodes
public static object GetText(PropertyDefinition property, Language language, bool? isIndexer = null)
{
return HighlightSearchMatch(language.FormatPropertyName(property, isIndexer), " : " + language.TypeToString(property.PropertyType, false, property));
string name = language.FormatPropertyName(property, isIndexer);
var b = new System.Text.StringBuilder();
if (property.HasParameters)
{
b.Append('(');
for (int i = 0; i < property.Parameters.Count; i++)
{
if (i > 0)
b.Append(", ");
b.Append(language.TypeToString(property.Parameters[i].ParameterType, false, property.Parameters[i]));
}
var method = property.GetMethod ?? property.SetMethod;
if (method.CallingConvention == MethodCallingConvention.VarArg)
{
if (property.HasParameters)
b.Append(", ");
b.Append("...");
}
b.Append(") : ");
}
else
{
b.Append(" : ");
}
b.Append(language.TypeToString(property.PropertyType, false, property));
b.Append(property.MetadataToken.ToSuffixString());
return HighlightSearchMatch(name, b.ToString());
}
public override object Icon

22
ILSpy/VB/ILSpyEnvironmentProvider.cs

@ -106,7 +106,7 @@ namespace ICSharpCode.ILSpy.VB @@ -106,7 +106,7 @@ namespace ICSharpCode.ILSpy.VB
return TypeCode.Object;
}
public Nullable<bool> IsReferenceType(NRefactory.CSharp.Expression expression)
public bool? IsReferenceType(NRefactory.CSharp.Expression expression)
{
if (expression is NRefactory.CSharp.NullReferenceExpression)
return true;
@ -153,5 +153,25 @@ namespace ICSharpCode.ILSpy.VB @@ -153,5 +153,25 @@ namespace ICSharpCode.ILSpy.VB
return false;
}
public NRefactory.CSharp.ParameterDeclaration[] GetParametersForProperty(NRefactory.CSharp.PropertyDeclaration property)
{
var propInfo = property.Annotation<PropertyReference>();
if (propInfo == null)
return new NRefactory.CSharp.ParameterDeclaration[0];
return propInfo.Parameters.Select(p => new NRefactory.CSharp.ParameterDeclaration(AstBuilder.ConvertType(p.ParameterType), p.Name, GetModifiers(p))).ToArray();
}
NRefactory.CSharp.ParameterModifier GetModifiers(ParameterDefinition p)
{
if (p.IsOut && p.IsIn)
return NRefactory.CSharp.ParameterModifier.Ref;
if (p.IsOut)
return NRefactory.CSharp.ParameterModifier.Out;
return NRefactory.CSharp.ParameterModifier.None;
}
}
}

3
NRefactory.VB/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

@ -22,6 +22,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors @@ -22,6 +22,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors
IType ResolveType(AstType type, TypeDeclaration entity = null);
bool IsMethodGroup(CSharp.Expression expression);
bool HasEvent(Expression expression);
CSharp.ParameterDeclaration[] GetParametersForProperty(CSharp.PropertyDeclaration property);
}
/// <summary>
@ -1921,6 +1922,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors @@ -1921,6 +1922,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
if (members.Pop().inIterator) {
decl.Modifiers |= Modifiers.Iterator;
}
ConvertNodes(provider.GetParametersForProperty(propertyDeclaration), decl.Parameters);
return EndNode(propertyDeclaration, decl);
}

Loading…
Cancel
Save