Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@
<None Include="TestCases\VBPretty\Issue1906.vb" />
<None Include="TestCases\VBPretty\Issue2192.vb" />
<None Include="TestCases\VBPretty\Select.vb" />
<None Include="TestCases\VBPretty\ParameterizedProperties.vb" />
<None Include="TestCases\ILPretty\Unsafe.il" />
<None Include="TestCases\ILPretty\Issue1389.il" />
<None Include="TestCases\ILPretty\SequenceOfNestedIfs.il" />
Expand All @@ -157,6 +158,7 @@
<None Include="TestCases\Disassembler\Pretty\SecurityDeclarations.il" />
<None Include="TestCases\ILPretty\Issue1038.il" />
<None Include="TestCases\ILPretty\Issue1145.il" />
<None Include="TestCases\ILPretty\NoAccessorProperties.il" />
<None Include="TestCases\ILPretty\Issue1047.il" />
<None Include="TestCases\ILPretty\Issue959.il" />
</ItemGroup>
Expand Down Expand Up @@ -201,6 +203,8 @@
<None Include="TestCases\ILPretty\FSharpUsing_Release.cs" />
<Compile Remove="TestCases\ILPretty\GuessAccessors.cs" />
<None Include="TestCases\ILPretty\GuessAccessors.cs" />
<Compile Remove="TestCases\ILPretty\NoAccessorProperties.cs" />
<None Include="TestCases\ILPretty\NoAccessorProperties.cs" />
<Compile Remove="TestCases\ILPretty\Issue1145.cs" />
<None Include="TestCases\ILPretty\Issue1145.cs" />
<Compile Remove="TestCases\ILPretty\Issue1325.cs" />
Expand Down
6 changes: 6 additions & 0 deletions ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,12 @@ public async Task UnknownTypes()
await Run();
}

[Test]
public async Task NoAccessorProperties()
{
await Run();
}

[Test]
public async Task Issue1145()
{
Expand Down
19 changes: 19 additions & 0 deletions ICSharpCode.Decompiler.Tests/Output/CSharpAmbienceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,25 @@ public void DynamicIndexer()
ambience.ConversionFlags = ConversionFlags.All & ~(ConversionFlags.ShowBody | ConversionFlags.PlaceReturnTypeAfterParameterList);
Assert.That(ambience.ConvertSymbol(indexer), Is.EqualTo("public dynamic dynamic.this[int]"));
}

[Test]
public void ParameterizedProperty()
{
// A named property with parameters (VB.NET parameterized property); C# has no
// syntax for it, but signature surfaces show the parameter list in parentheses.
var property = new FakeProperty(compilation) {
Name = "Data",
ReturnType = compilation.FindType(KnownTypeCode.Int32),
DeclaringType = SpecialType.Dynamic,
Parameters = new IParameter[] { new DefaultParameter(compilation.FindType(KnownTypeCode.Int32), "index") },
};

ambience.ConversionFlags = ILSpyMainTreeViewMemberFlags;
Assert.That(ambience.ConvertSymbol(property), Is.EqualTo("Data(int) : int"));

ambience.ConversionFlags = ConversionFlags.All & ~(ConversionFlags.ShowBody | ConversionFlags.PlaceReturnTypeAfterParameterList);
Assert.That(ambience.ConvertSymbol(property), Is.EqualTo("public int dynamic.Data(int index)"));
}
#endregion

#region Test types
Expand Down
16 changes: 9 additions & 7 deletions ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1325.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@ public static void TestCode(Test t, int i)

internal class Test
{
public string Parameterized {
get {
throw new NotImplementedException();
}
set {
throw new NotImplementedException();
}
// C# has no syntax for parameterized property 'Parameterized'.
public string get_Parameterized(int i)
{
throw new NotImplementedException();
}

public void set_Parameterized(int i, string value)
{
throw new NotImplementedException();
}
public string Unparameterized { get; set; }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
public class BrokenProperties
{
private int _field;

public int Touch(int i)
{
return _field + i;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// Property rows without any MethodSemantics accessors (corrupt or hand-written
// metadata). The type system skips such properties, whether parameterized or not;
// decompilation must not crash on them.
.class public auto ansi beforefieldinit BrokenProperties extends [mscorlib]System.Object
{
.field private int32 _field

.property instance int32 Parameterized(int32)
{
} // end of property BrokenProperties::Parameterized

.property instance int32 Plain()
{
} // end of property BrokenProperties::Plain

.method public hidebysig instance int32 Touch (int32 i) cil managed
{
.maxstack 8
ldarg.0
ldfld int32 BrokenProperties::_field
ldarg.1
add
ret
} // end of method BrokenProperties::Touch

.method public hidebysig specialname rtspecialname instance void .ctor () cil managed
{
.maxstack 8
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
} // end of method BrokenProperties::.ctor
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
#pragma warning disable 657
using System;

public interface IParameterized
{
// C# has no syntax for parameterized property 'IndexedValue'.
int get_IndexedValue(int index);
void set_IndexedValue(int index, int Value);
}

public class ParameterizedBase
{
// C# has no syntax for parameterized property 'Virt'.
public virtual int get_Virt(int index)
{
return index;
}

public virtual void set_Virt(int index, int value)
{
}
}

public class ParameterizedDerived : ParameterizedBase
{
// C# has no syntax for parameterized property 'Virt'.
public override int get_Virt(int index)
{
return checked(index + 1);
}

public override void set_Virt(int index, int value)
{
}
}

public class ParameterizedProperties : IParameterized
{
private int _field;

// C# has no syntax for parameterized property 'SharedProp'.
public static int get_SharedProp(int index)
{
return index;
}

public static void set_SharedProp(int index, int value)
{
}

// C# has no syntax for parameterized property 'IndexedValue'.
public int get_IndexedValue(int index)
{
return _field;
}

int IParameterized.get_IndexedValue(int index)
{
//ILSpy generated this explicit interface implementation from .override directive in get_IndexedValue
return this.get_IndexedValue(index);
}

public void set_IndexedValue(int index, int value)
{
_field = value;
}

void IParameterized.set_IndexedValue(int index, int value)
{
//ILSpy generated this explicit interface implementation from .override directive in set_IndexedValue
this.set_IndexedValue(index, value);
}

// C# has no syntax for parameterized property 'ReadOnlyProp'.
public int get_ReadOnlyProp(int index)
{
return index;
}

// C# has no syntax for parameterized property 'SetOnly'.
public void set_SetOnly(int index, int value)
{
_field = checked(index + value);
}

// C# has no syntax for parameterized property 'Attributed'.
// Its 'property:' attributes below are ignored by the compiler (CS0657).
[property: Obsolete("read-write parameterized property")]
public int get_Attributed(int index)
{
return index;
}

public void set_Attributed(int index, int value)
{
}

// C# has no syntax for parameterized property 'Overloaded'.
public int get_Overloaded(int a)
{
return a;
}

// C# has no syntax for parameterized property 'Overloaded'.
public int get_Overloaded(int a, int b)
{
return checked(a + b);
}

public void Use()
{
ParameterizedProperties.set_SharedProp(1, 2);
_field = ParameterizedProperties.get_SharedProp(3);
this.set_IndexedValue(4, 5);
_field = this.get_IndexedValue(6);
((IParameterized)this).set_IndexedValue(7, 8);
_field = ((IParameterized)this).get_IndexedValue(9);
}
}

public class RenamedImplementation : IParameterized
{
private int _value;

// C# has no syntax for parameterized property 'Renamed'.
public int get_Renamed(int index)
{
return _value;
}

int IParameterized.get_IndexedValue(int index)
{
//ILSpy generated this explicit interface implementation from .override directive in get_Renamed
return this.get_Renamed(index);
}

public void set_Renamed(int index, int value)
{
_value = value;
}

void IParameterized.set_IndexedValue(int index, int value)
{
//ILSpy generated this explicit interface implementation from .override directive in set_Renamed
this.set_Renamed(index, value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
Imports System

Public Interface IParameterized
Property IndexedValue(index As Integer) As Integer
End Interface

Public Class ParameterizedProperties
Implements IParameterized

Private _field As Integer

Public Shared Property SharedProp(index As Integer) As Integer
Get
Return index
End Get
Set(value As Integer)
End Set
End Property

Public Property IndexedValue(index As Integer) As Integer Implements IParameterized.IndexedValue
Get
Return _field
End Get
Set(value As Integer)
_field = value
End Set
End Property

Public ReadOnly Property ReadOnlyProp(index As Integer) As Integer
Get
Return index
End Get
End Property

Public WriteOnly Property SetOnly(index As Integer) As Integer
Set(value As Integer)
_field = index + value
End Set
End Property

<Obsolete("read-write parameterized property")>
Public Property Attributed(index As Integer) As Integer
Get
Return index
End Get
Set(value As Integer)
End Set
End Property

Public ReadOnly Property Overloaded(a As Integer) As Integer
Get
Return a
End Get
End Property

Public ReadOnly Property Overloaded(a As Integer, b As Integer) As Integer
Get
Return a + b
End Get
End Property

Public Sub Use()
SharedProp(1) = 2
_field = SharedProp(3)
IndexedValue(4) = 5
_field = IndexedValue(6)
Dim p As IParameterized = Me
p.IndexedValue(7) = 8
_field = p.IndexedValue(9)
End Sub
End Class

Public Class ParameterizedBase
Public Overridable Property Virt(index As Integer) As Integer
Get
Return index
End Get
Set(value As Integer)
End Set
End Property
End Class

Public Class ParameterizedDerived
Inherits ParameterizedBase

Public Overrides Property Virt(index As Integer) As Integer
Get
Return index + 1
End Get
Set(value As Integer)
End Set
End Property
End Class

Public Class RenamedImplementation
Implements IParameterized

Private _value As Integer

Public Property Renamed(index As Integer) As Integer Implements IParameterized.IndexedValue
Get
Return _value
End Get
Set(value As Integer)
_value = value
End Set
End Property
End Class
Loading
Loading