Skip to content

Commit 10d6639

Browse files
committed
Create intermediate model checkpoint.
1 parent bb422f9 commit 10d6639

File tree

11 files changed

+823
-502
lines changed

11 files changed

+823
-502
lines changed

src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System;
44
using System.Collections.Generic;
55
using System.Diagnostics;
6-
6+
using System.Diagnostics.CodeAnalysis;
77
using Mono.Cecil.Cil;
88

99
namespace Java.Interop.Tools.Diagnostics {
@@ -148,6 +148,7 @@ namespace Java.Interop.Tools.Diagnostics {
148148
//
149149

150150
public static class Diagnostic {
151+
[DoesNotReturn]
151152
public static void Error (int code, SequencePoint? location, string message, params object[] args)
152153
{
153154
throw new XamarinAndroidException (code, message, args) {
@@ -156,11 +157,13 @@ public static void Error (int code, SequencePoint? location, string message, par
156157
}
157158

158159

160+
[DoesNotReturn]
159161
public static void Error (int code, string message, params object[] args)
160162
{
161163
throw new XamarinAndroidException (code, message, args);
162164
}
163165

166+
[DoesNotReturn]
164167
public static void Error (int code, Exception innerException, string message, params object[] args)
165168
{
166169
throw new XamarinAndroidException (code, innerException, message, args);
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
using System;
2+
using System.Text;
3+
using System.Xml.Linq;
4+
using Android.Runtime;
5+
using Java.Interop.Tools.Diagnostics;
6+
using Java.Interop.Tools.JavaCallableWrappers.CallableWrapperMembers;
7+
using Java.Interop.Tools.TypeNameMappings;
8+
using Mono.Cecil;
9+
10+
namespace Java.Interop.Tools.JavaCallableWrappers.Adapters;
11+
12+
class CecilImporter
13+
{
14+
public static CallableWrapperField CreateField (MethodDefinition method, string fieldName, IMetadataResolver resolver)
15+
{
16+
var visibility = JavaCallableWrapperGenerator.GetJavaAccess (method.Attributes & MethodAttributes.MemberAccessMask);
17+
var type_name = JavaNativeTypeManager.ReturnTypeFromSignature (JavaNativeTypeManager.GetJniSignature (method, resolver))?.Type
18+
?? throw new ArgumentException ($"Could not get JNI signature for method `{method.Name}`", nameof (method));
19+
var annotations = JavaCallableWrapperGenerator.GetAnnotationsString ("\t", method.CustomAttributes, resolver);
20+
21+
return new CallableWrapperField (
22+
fieldName: fieldName,
23+
typeName: type_name,
24+
visibility: visibility,
25+
isStatic: method.IsStatic,
26+
initializerName: method.Name,
27+
annotations: annotations);
28+
}
29+
30+
// Temporary conversion function
31+
public static CallableWrapperField CreateField (JavaCallableWrapperGenerator.JavaFieldInfo field)
32+
{
33+
return new CallableWrapperField (
34+
fieldName: field.FieldName,
35+
typeName: field.TypeName,
36+
visibility: field.GetJavaAccess (),
37+
isStatic: field.IsStatic,
38+
initializerName: field.InitializerName,
39+
annotations: field.Annotations);
40+
}
41+
42+
public static CallableWrapperMethod CreateMethod (MethodDefinition method, RegisterAttribute register, IMetadataResolver cache, bool shouldBeDynamicallyRegistered = true)
43+
=> CreateMethod (method, register, null, null, cache, shouldBeDynamicallyRegistered);
44+
45+
public static CallableWrapperMethod CreateMethod (MethodDefinition methodDefinition, RegisterAttribute register, string? managedParameters, string? outerType, IMetadataResolver cache, bool shouldBeDynamicallyRegistered = true)
46+
{
47+
var method = CreateMethod (register.Name, register.Signature, register.Connector, managedParameters, outerType, null);
48+
49+
method.Annotations = JavaCallableWrapperGenerator.GetAnnotationsString ("\t", methodDefinition.CustomAttributes, cache);
50+
method.IsDynamicallyRegistered = shouldBeDynamicallyRegistered;
51+
52+
return method;
53+
}
54+
55+
public static CallableWrapperMethod CreateMethod (MethodDefinition methodDefinition, ExportAttribute export, string? managedParameters, IMetadataResolver resolver)
56+
{
57+
var method = CreateMethod (methodDefinition.Name, JavaNativeTypeManager.GetJniSignature (methodDefinition, resolver), "__export__", null, null, export.SuperArgumentsString);
58+
59+
method.IsExport = true;
60+
method.IsStatic = methodDefinition.IsStatic;
61+
method.JavaAccess = JavaCallableWrapperGenerator.GetJavaAccess (methodDefinition.Attributes & MethodAttributes.MemberAccessMask);
62+
method.ThrownTypeNames = export.ThrownNames;
63+
method.JavaNameOverride = export.Name;
64+
method.ManagedParameters = managedParameters;
65+
method.Annotations = JavaCallableWrapperGenerator.GetAnnotationsString ("\t", methodDefinition.CustomAttributes, resolver);
66+
67+
return method;
68+
}
69+
70+
public static CallableWrapperMethod CreateMethod (MethodDefinition methodDefinition, IMetadataResolver resolver)
71+
{
72+
var method = CreateMethod (methodDefinition.Name, JavaNativeTypeManager.GetJniSignature (methodDefinition, resolver), "__export__", null, null, null);
73+
74+
if (methodDefinition.HasParameters)
75+
Diagnostic.Error (4205, JavaCallableWrapperGenerator.LookupSource (methodDefinition), Localization.Resources.JavaCallableWrappers_XA4205);
76+
if (methodDefinition.ReturnType.MetadataType == MetadataType.Void)
77+
Diagnostic.Error (4208, JavaCallableWrapperGenerator.LookupSource (methodDefinition), Localization.Resources.JavaCallableWrappers_XA4208);
78+
79+
method.IsExport = true;
80+
method.IsStatic = method.IsStatic;
81+
method.JavaAccess = JavaCallableWrapperGenerator.GetJavaAccess (methodDefinition.Attributes & MethodAttributes.MemberAccessMask);
82+
83+
// Annotations are processed within CallableWrapperField, not the initializer method. So we don't generate them here.
84+
85+
return method;
86+
}
87+
88+
public static CallableWrapperMethod CreateMethod (string name, string? signature, string? connector, string? managedParameters, string? outerType, string? superCall)
89+
{
90+
signature = signature ?? throw new ArgumentNullException ("`connector` cannot be null.", nameof (connector));
91+
var method_name = "n_" + name + ":" + signature + ":" + connector;
92+
93+
var method = new CallableWrapperMethod (name, method_name, signature) {
94+
ManagedParameters = managedParameters
95+
};
96+
97+
var jnisig = signature;
98+
var closer = jnisig.IndexOf (')');
99+
var ret = jnisig.Substring (closer + 1);
100+
method.Retval = JavaNativeTypeManager.Parse (ret)?.Type;
101+
102+
var jniparms = jnisig.Substring (1, closer - 1);
103+
104+
if (string.IsNullOrEmpty (jniparms) && string.IsNullOrEmpty (superCall))
105+
return method;
106+
107+
var parms = new StringBuilder ();
108+
var scall = new StringBuilder ();
109+
var acall = new StringBuilder ();
110+
var first = true;
111+
var i = 0;
112+
113+
foreach (var jti in JavaNativeTypeManager.FromSignature (jniparms)) {
114+
if (outerType != null) {
115+
acall.Append (outerType).Append (".this");
116+
outerType = null;
117+
continue;
118+
}
119+
120+
var parmType = jti.Type;
121+
122+
if (!first) {
123+
parms.Append (", ");
124+
scall.Append (", ");
125+
acall.Append (", ");
126+
}
127+
128+
first = false;
129+
parms.Append (parmType).Append (" p").Append (i);
130+
scall.Append ("p").Append (i);
131+
acall.Append ("p").Append (i);
132+
++i;
133+
}
134+
135+
method.Params = parms.ToString ();
136+
method.SuperCall = superCall ?? scall.ToString ();
137+
method.ActivateCall = acall.ToString ();
138+
139+
return method;
140+
}
141+
142+
// Temporary conversion function
143+
public static CallableWrapperMethod CreateMethod (JavaCallableWrapperGenerator.Signature signature)
144+
{
145+
return new CallableWrapperMethod (signature.Name, signature.Method, signature.JniSignature) {
146+
ManagedParameters = signature.ManagedParameters,
147+
JavaNameOverride = signature.JavaNameOverride,
148+
Params = signature.Params,
149+
Retval = signature.Retval,
150+
ThrowsDeclaration = signature.ThrowsDeclaration,
151+
JavaAccess = signature.JavaAccess,
152+
IsExport = signature.IsExport,
153+
IsStatic = signature.IsStatic,
154+
IsDynamicallyRegistered = signature.IsDynamicallyRegistered,
155+
ThrownTypeNames = signature.ThrownTypeNames,
156+
Annotations = signature.Annotations,
157+
SuperCall = signature.SuperCall,
158+
ActivateCall = signature.ActivateCall,
159+
};
160+
}
161+
162+
// Temporary conversion function
163+
public static CallableWrapperConstructor CreateConstructor (JavaCallableWrapperGenerator.Signature signature)
164+
{
165+
return new CallableWrapperConstructor (signature.Name, signature.Method, signature.JniSignature) {
166+
ManagedParameters = signature.ManagedParameters,
167+
JavaNameOverride = signature.JavaNameOverride,
168+
Params = signature.Params,
169+
Retval = signature.Retval,
170+
ThrowsDeclaration = signature.ThrowsDeclaration,
171+
JavaAccess = signature.JavaAccess,
172+
IsExport = signature.IsExport,
173+
IsStatic = signature.IsStatic,
174+
IsDynamicallyRegistered = signature.IsDynamicallyRegistered,
175+
ThrownTypeNames = signature.ThrownTypeNames,
176+
Annotations = signature.Annotations,
177+
SuperCall = signature.SuperCall,
178+
ActivateCall = signature.ActivateCall
179+
};
180+
}
181+
182+
public static CallableWrapperApplicationConstructor? CreateApplicationConstructor (string name, TypeDefinition type, IMetadataResolver resolver)
183+
{
184+
if (!JavaNativeTypeManager.IsApplication (type, resolver))
185+
return null;
186+
187+
return new CallableWrapperApplicationConstructor (name);
188+
}
189+
190+
// Temporary conversion function
191+
public static CallableWrapperType CreateType (JavaCallableWrapperGenerator generator)
192+
{
193+
var type = new CallableWrapperType (generator.name, generator.package) {
194+
Type = generator.type,
195+
Cache = generator.cache,
196+
IsAbstract = generator.type.IsAbstract,
197+
ApplicationJavaClass = generator.ApplicationJavaClass,
198+
Generator = generator,
199+
HasDynamicallyRegisteredMethods = generator.HasDynamicallyRegisteredMethods,
200+
GenerateOnCreateOverrides = generator.GenerateOnCreateOverrides,
201+
MonoRuntimeInitialization = generator.MonoRuntimeInitialization,
202+
};
203+
204+
if (generator.children is not null)
205+
foreach (var nested in generator.children)
206+
type.NestedTypes.Add (CreateType (nested));
207+
208+
return type;
209+
}
210+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.IO;
2+
3+
namespace Java.Interop.Tools.JavaCallableWrappers.CallableWrapperMembers;
4+
5+
class CallableWrapperApplicationConstructor
6+
{
7+
public string Name { get; set; }
8+
9+
public CallableWrapperApplicationConstructor (string name)
10+
{
11+
Name = name;
12+
}
13+
14+
public void Generate (TextWriter sw, CallableWrapperWriterOptions options)
15+
{
16+
sw.WriteLine ();
17+
18+
sw.Write ("\tpublic ");
19+
sw.Write (Name);
20+
sw.WriteLine (" ()");
21+
22+
sw.WriteLine ("\t{");
23+
sw.WriteLine ("\t\tmono.MonoPackageManager.setContext (this);");
24+
sw.WriteLine ("\t}");
25+
}
26+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
using System.IO;
2+
3+
namespace Java.Interop.Tools.JavaCallableWrappers.CallableWrapperMembers;
4+
5+
class CallableWrapperConstructor : CallableWrapperMethod
6+
{
7+
public bool CannotRegisterInStaticConstructor { get; set; }
8+
public string? PartialAssemblyQualifiedName { get; set; }
9+
10+
public CallableWrapperConstructor (string name, string method, string jniSignature) : base (name, method, jniSignature)
11+
{
12+
}
13+
14+
public override void Generate (TextWriter sw, CallableWrapperWriterOptions options)
15+
{
16+
// TODO: we only generate constructors so that Android types w/ no
17+
// default constructor can be subclasses by our generated code.
18+
//
19+
// This does NOT currently allow creating managed types from Java.
20+
sw.WriteLine ();
21+
22+
if (Annotations is not null)
23+
sw.WriteLine (Annotations);
24+
25+
sw.Write ("\tpublic ");
26+
sw.Write (Name);
27+
28+
sw.Write (" (");
29+
sw.Write (Params);
30+
sw.Write (')');
31+
32+
sw.WriteLine (ThrowsDeclaration);
33+
34+
sw.WriteLine ("\t{");
35+
sw.Write ("\t\tsuper (");
36+
sw.Write (SuperCall);
37+
sw.WriteLine (");");
38+
39+
#if MONODROID_TIMING
40+
sw.WriteLine ("\t\tandroid.util.Log.i(\"MonoDroid-Timing\", \"{0}..ctor({1}): time: \"+java.lang.System.currentTimeMillis());", Name, Params);
41+
#endif
42+
43+
if (!CannotRegisterInStaticConstructor) {
44+
45+
sw.Write ("\t\tif (getClass () == ");
46+
sw.Write (Name);
47+
sw.WriteLine (".class) {");
48+
49+
sw.Write ("\t\t\t");
50+
51+
switch (options.CodeGenerationTarget) {
52+
case JavaPeerStyle.JavaInterop1:
53+
sw.Write ("net.dot.jni.ManagedPeer.construct (this, \"");
54+
sw.Write (JniSignature);
55+
sw.Write ("\", new java.lang.Object[] { ");
56+
sw.Write (ActivateCall);
57+
sw.WriteLine (" });");
58+
break;
59+
default:
60+
sw.Write ("mono.android.TypeManager.Activate (\"");
61+
sw.Write (PartialAssemblyQualifiedName);
62+
sw.Write ("\", \"");
63+
sw.Write (ManagedParameters);
64+
sw.Write ("\", this, new java.lang.Object[] { ");
65+
sw.Write (ActivateCall);
66+
sw.WriteLine (" });");
67+
break;
68+
}
69+
70+
sw.WriteLine ("\t\t}");
71+
}
72+
73+
sw.WriteLine ("\t}");
74+
}
75+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System.IO;
2+
3+
namespace Java.Interop.Tools.JavaCallableWrappers.CallableWrapperMembers;
4+
5+
class CallableWrapperField
6+
{
7+
public string FieldName { get; }
8+
public string TypeName { get; }
9+
public string Visibility { get; }
10+
public bool IsStatic { get; }
11+
public string InitializerName { get; }
12+
public string? Annotations { get; }
13+
14+
public CallableWrapperField (string fieldName, string typeName, string visibility, bool isStatic, string initializerName, string? annotations)
15+
{
16+
FieldName = fieldName;
17+
TypeName = typeName;
18+
Visibility = visibility;
19+
IsStatic = isStatic;
20+
InitializerName = initializerName;
21+
Annotations = annotations;
22+
}
23+
24+
public void Generate (TextWriter sw)
25+
{
26+
sw.WriteLine ();
27+
28+
if (Annotations is not null)
29+
sw.WriteLine (Annotations);
30+
31+
sw.Write ("\t");
32+
sw.Write (Visibility);
33+
sw.Write (' ');
34+
35+
if (IsStatic)
36+
sw.Write ("static ");
37+
38+
sw.Write (TypeName);
39+
sw.Write (' ');
40+
41+
sw.Write (FieldName);
42+
sw.Write (" = ");
43+
44+
sw.Write (InitializerName);
45+
sw.WriteLine (" ();");
46+
}
47+
}

0 commit comments

Comments
 (0)