Skip to content

Commit 1344d14

Browse files
committed
[XA.Tools.Bytecode] Add KotlinFixup unit tests.
1 parent 212a9f0 commit 1344d14

18 files changed

+158
-8
lines changed

src/Xamarin.Android.Tools.Bytecode/Kotlin/KotlinFixups.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Xamarin.Android.Tools.Bytecode
99
{
10-
static class KotlinFixups
10+
public static class KotlinFixups
1111
{
1212
public static void Fixup (IList<ClassFile> classes)
1313
{
@@ -24,14 +24,17 @@ public static void Fixup (IList<ClassFile> classes)
2424
var metadata = km.ParseMetadata ();
2525

2626
if (metadata is null)
27-
return;
27+
continue;
2828

2929
// Do fixups only valid for full classes
3030
var class_metadata = (metadata as KotlinClass);
3131

3232
if (class_metadata != null) {
3333
FixupClassVisibility (c, class_metadata);
3434

35+
if (!c.AccessFlags.IsPubliclyVisible ())
36+
continue;
37+
3538
foreach (var con in class_metadata.Constructors)
3639
FixupConstructor (FindJavaConstructor (class_metadata, con, c), con);
3740
}
@@ -158,9 +161,9 @@ static void FixupProperty (MethodInfo getter, MethodInfo setter, KotlinProperty
158161
if (setter != null) {
159162
var setter_parameter = setter.GetParameters ().First ();
160163

161-
if (setter_parameter.IsUnnamedParameter () && !metadata.SetterValueParameter.IsUnnamedParameter ()) {
162-
Log.Debug ($"Kotlin: Renaming setter parameter {setter.DeclaringType?.ThisClass.Name.Value} - {setter.Name} - {setter_parameter.Name} -> {metadata.SetterValueParameter.Name}");
163-
setter_parameter.Name = metadata.SetterValueParameter.Name;
164+
if (setter_parameter.IsUnnamedParameter ()) {
165+
Log.Debug ($"Kotlin: Renaming setter parameter {setter.DeclaringType?.ThisClass.Name.Value} - {setter.Name} - {setter_parameter.Name} -> value");
166+
setter_parameter.Name = "value";
164167
}
165168
}
166169
}
@@ -209,9 +212,9 @@ static MethodInfo FindJavaPropertyGetter (KotlinClass kotlinClass, KotlinPropert
209212
static MethodInfo FindJavaPropertySetter (KotlinClass kotlinClass, KotlinProperty property, ClassFile klass)
210213
{
211214
var possible_methods = klass.Methods.Where (method => string.Compare (method.GetMethodNameWithoutSuffix (), $"set{property.Name}", true) == 0 &&
212-
property.SetterValueParameter != null &&
215+
property.ReturnType != null &&
213216
method.GetParameters ().Length == 1 &&
214-
TypesMatch (method.GetParameters () [0].Type, property.SetterValueParameter.Type, kotlinClass));
217+
TypesMatch (method.GetParameters () [0].Type, property.ReturnType, kotlinClass));
215218

216219
return possible_methods.FirstOrDefault ();
217220
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using NUnit.Framework;
7+
using Xamarin.Android.Tools.Bytecode;
8+
9+
namespace Xamarin.Android.Tools.BytecodeTests
10+
{
11+
[TestFixture]
12+
public class KotlinFixupsTests : ClassFileFixture
13+
{
14+
[Test]
15+
public void HideInternalClass ()
16+
{
17+
var klass = LoadClassFile ("InternalClass.class");
18+
19+
Assert.True (klass.AccessFlags.HasFlag (ClassAccessFlags.Public));
20+
21+
KotlinFixups.Fixup (new [] { klass });
22+
23+
Assert.False (klass.AccessFlags.HasFlag (ClassAccessFlags.Public));
24+
}
25+
26+
[Test]
27+
public void HideInternalConstructor ()
28+
{
29+
var klass = LoadClassFile ("InternalConstructor.class");
30+
var ctor = klass.Methods.First (m => m.Name == "<init>");
31+
32+
Assert.True (ctor.AccessFlags.HasFlag (MethodAccessFlags.Public));
33+
34+
KotlinFixups.Fixup (new [] { klass });
35+
36+
Assert.False (ctor.AccessFlags.HasFlag (MethodAccessFlags.Public));
37+
}
38+
39+
[Test]
40+
public void HideImplementationMethod ()
41+
{
42+
var klass = LoadClassFile ("MethodImplementation.class");
43+
var method = klass.Methods.First (m => m.Name == "toString-impl");
44+
45+
Assert.True (method.AccessFlags.HasFlag (MethodAccessFlags.Public));
46+
47+
KotlinFixups.Fixup (new [] { klass });
48+
49+
Assert.False (method.AccessFlags.HasFlag (MethodAccessFlags.Public));
50+
}
51+
52+
[Test]
53+
public void RenameExtensionParameter ()
54+
{
55+
var klass = LoadClassFile ("RenameExtensionParameterKt.class");
56+
var method = klass.Methods.First (m => m.Name == "toUtf8String");
57+
var p = method.GetParameters () [0];
58+
59+
Assert.AreEqual ("$this$toUtf8String", p.Name);
60+
61+
KotlinFixups.Fixup (new [] { klass });
62+
63+
Assert.AreEqual ("obj", p.Name);
64+
}
65+
66+
[Test]
67+
public void HideInternalMethod ()
68+
{
69+
var klass = LoadClassFile ("InternalMethod.class");
70+
var method = klass.Methods.First (m => m.Name == "take$main");
71+
72+
Assert.True (method.AccessFlags.HasFlag (MethodAccessFlags.Public));
73+
74+
KotlinFixups.Fixup (new [] { klass });
75+
76+
Assert.False (method.AccessFlags.HasFlag (MethodAccessFlags.Public));
77+
}
78+
79+
[Test]
80+
public void ParameterName ()
81+
{
82+
var klass = LoadClassFile ("ParameterName.class");
83+
var method = klass.Methods.First (m => m.Name == "take");
84+
var p = method.GetParameters () [0];
85+
86+
Assert.AreEqual ("p0", p.Name);
87+
88+
KotlinFixups.Fixup (new [] { klass });
89+
90+
Assert.AreEqual ("count", p.Name);
91+
}
92+
93+
[Test]
94+
public void HideInternalProperty ()
95+
{
96+
var klass = LoadClassFile ("InternalProperty.class");
97+
var getter = klass.Methods.First (m => m.Name == "getCity$main");
98+
var setter = klass.Methods.First (m => m.Name == "setCity$main");
99+
100+
Assert.True (getter.AccessFlags.HasFlag (MethodAccessFlags.Public));
101+
Assert.True (setter.AccessFlags.HasFlag (MethodAccessFlags.Public));
102+
103+
KotlinFixups.Fixup (new [] { klass });
104+
105+
Assert.False (getter.AccessFlags.HasFlag (MethodAccessFlags.Public));
106+
Assert.False (setter.AccessFlags.HasFlag (MethodAccessFlags.Public));
107+
}
108+
109+
[Test]
110+
public void RenameSetterParameter ()
111+
{
112+
var klass = LoadClassFile ("SetterParameterName.class");
113+
var setter = klass.Methods.First (m => m.Name == "setCity");
114+
var p = setter.GetParameters () [0];
115+
116+
Assert.AreEqual ("p0", p.Name);
117+
118+
KotlinFixups.Fixup (new [] { klass });
119+
120+
Assert.AreEqual ("value", p.Name);
121+
}
122+
}
123+
}

src/Xamarin.Android.Tools.Bytecode/Tests/Xamarin.Android.Tools.Bytecode-Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
<Compile Include="ExpectedMethodDeclaration.cs" />
4747
<Compile Include="ExpectedTypeDeclaration.cs" />
4848
<Compile Include="IJavaInterfaceTests.cs" />
49+
<Compile Include="KotlinFixupsTests.cs" />
4950
<Compile Include="KotlinMetadataTests.cs" />
5051
<Compile Include="JavaAnnotationTests.cs" />
5152
<Compile Include="JavaEnumTests.cs" />

src/Xamarin.Android.Tools.Bytecode/Tests/Xamarin.Android.Tools.Bytecode-Tests.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
Outputs="@(TestKotlinJar->'%(RecursiveDir)%(Filename).class')"
2828
Condition=" '$(KotlinCPath)' != '' ">
2929
<Exec
30-
Command="&quot;$(KotlinCPath)&quot; @(TestKotlinJar->'%(Identity)', ' ') -d &quot;kotlin&quot;"
30+
Command="&quot;$(KotlinCPath)&quot; -Xinline-classes @(TestKotlinJar->'%(Identity)', ' ') -d &quot;kotlin&quot;"
3131
/>
3232
</Target>
3333
</Project>
570 Bytes
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class InternalConstructor internal constructor (private var myInt : Int)
570 Bytes
Binary file not shown.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class InternalMethod {
2+
internal fun take()
3+
{
4+
}
5+
}
1.05 KB
Binary file not shown.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class InternalProperty {
2+
internal var city: String = "London"
3+
}

0 commit comments

Comments
 (0)