Skip to content

Commit 0881acc

Browse files
grendellojonpryor
authored andcommitted
[generator] Don't omit the extended API description attributes (#262)
`class-parse` emits a number of useful attributes which contain information about the JNI signatures, return and parameter types etc. Currently, API XML adjuster removes them from its output. The information in extended attributes is (will be) useful for code generation and thus this commit makes sure that all of them made it to the adjusted XML.
1 parent 3acf556 commit 0881acc

File tree

4 files changed

+47
-15
lines changed

4 files changed

+47
-15
lines changed

src/Xamarin.Android.Tools.ApiXmlAdjuster/JavaApi.XmlModel.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public JavaPackage (JavaApi parent)
2929
public JavaApi Parent { get; private set; }
3030

3131
public string Name { get; set; }
32+
public string JniName { get; set; }
3233
public IList<JavaType> Types { get; set; }
3334

3435
// Content of this value is not stable.
@@ -166,6 +167,7 @@ protected JavaMember (JavaType parent)
166167
public string Name { get; set; }
167168
public bool Static { get; set; }
168169
public string Visibility { get; set; }
170+
public string ExtendedJniSignature { get; set; }
169171
}
170172

171173
public partial class JavaField : JavaMember
@@ -204,7 +206,6 @@ protected JavaMethodBase (JavaType parent)
204206
public bool ExtendedBridge { get; set; }
205207
public string ExtendedJniReturn { get; set; }
206208
public bool ExtendedSynthetic { get; set; }
207-
// We cannot get 'ExtendedJniSignature' from DLLs, so we don't have it here.
208209

209210
// Content of this value is not stable.
210211
public string ToStringHelper (string returnType, string name, JavaTypeParameters typeParameters)
@@ -266,7 +267,8 @@ public JavaParameter (JavaMethodBase parent)
266267
public JavaMethodBase Parent { get; private set; }
267268
public string Name { get; set; }
268269
public string Type { get; set; }
269-
270+
public string JniType { get; set; }
271+
270272
// Content of this value is not stable.
271273
public override string ToString ()
272274
{
@@ -278,6 +280,7 @@ public partial class JavaException
278280
{
279281
public string Name { get; set; }
280282
public string Type { get; set; }
283+
public string TypeGenericAware { get; set; }
281284
}
282285

283286
public partial class JavaTypeParameters

src/Xamarin.Android.Tools.ApiXmlAdjuster/JavaApiXmlGeneratorExtensions.cs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public static void Save (this JavaApi api, XmlWriter writer)
2929
continue;
3030
writer.WriteStartElement ("package");
3131
writer.WriteAttributeString ("name", pkg.Name);
32+
writer.WriteAttributeString ("jni-name", pkg.JniName);
3233
foreach (var type in pkg.Types) {
3334
if (type.IsReferenceOnly)
3435
continue; // skip reference only types
@@ -44,15 +45,15 @@ public static void Save (this JavaApi api, XmlWriter writer)
4445

4546
static void Save (this JavaClass cls, XmlWriter writer)
4647
{
47-
SaveTypeCommon (cls, writer, "class", XmlConvert.ToString (cls.Abstract), cls.Extends, cls.ExtendsGeneric);
48+
SaveTypeCommon (cls, writer, "class", XmlConvert.ToString (cls.Abstract), cls.Extends, cls.ExtendsGeneric, cls.ExtendedJniExtends);
4849
}
4950

5051
static void Save (this JavaInterface iface, XmlWriter writer)
5152
{
52-
SaveTypeCommon (iface, writer, "interface", "true", null, null);
53+
SaveTypeCommon (iface, writer, "interface", "true", null, null, null);
5354
}
5455

55-
static void SaveTypeCommon (this JavaType cls, XmlWriter writer, string elementName, string abs, string ext, string extgen)
56+
static void SaveTypeCommon (this JavaType cls, XmlWriter writer, string elementName, string abs, string ext, string extgen, string jniExt)
5657
{
5758
writer.WriteStartElement (elementName);
5859
if (abs != null)
@@ -62,15 +63,19 @@ static void SaveTypeCommon (this JavaType cls, XmlWriter writer, string elementN
6263
writer.WriteAttributeString ("extends", ext);
6364
if (ext != null)
6465
writer.WriteAttributeString ("extends-generic-aware", extgen);
66+
if (jniExt != null)
67+
writer.WriteAttributeString ("jni-extends", jniExt);
6568
writer.WriteAttributeString ("final", XmlConvert.ToString (cls.Final));
6669
writer.WriteAttributeString ("name", cls.Name);
6770
writer.WriteAttributeString ("static", XmlConvert.ToString (cls.Static));
6871
writer.WriteAttributeString ("visibility", cls.Visibility);
72+
writer.WriteAttributeString ("jni-signature", cls.ExtendedJniSignature);
6973

7074
foreach (var imp in cls.Implements.OrderBy (i => i.Name, StringComparer.Ordinal)) {
7175
writer.WriteStartElement ("implements");
7276
writer.WriteAttributeString ("name", imp.Name);
7377
writer.WriteAttributeString ("name-generic-aware", imp.NameGeneric);
78+
writer.WriteAttributeString ("jni-type", imp.ExtendedJniType);
7479
writer.WriteString ("\n ");
7580
writer.WriteFullEndElement ();
7681
}
@@ -94,6 +99,11 @@ static void Save (this JavaTypeParameters typeParameters, XmlWriter writer, stri
9499
foreach (var tp in typeParameters.TypeParameters) {
95100
writer.WriteStartElement ("typeParameter");
96101
writer.WriteAttributeString ("name", tp.Name);
102+
writer.WriteAttributeString ("classBound", tp.ExtendedClassBound);
103+
writer.WriteAttributeString ("jni-classBound", tp.ExtendedJniClassBound);
104+
writer.WriteAttributeString ("interfaceBounds", tp.ExtendedInterfaceBounds);
105+
writer.WriteAttributeString ("jni-interfaceBounds", tp.ExtendedJniInterfaceBounds);
106+
97107
if (tp.GenericConstraints != null) {
98108
// If there is only one generic constraint that specifies java.lang.Object,
99109
// that is not really a constraint, so skip that.
@@ -133,12 +143,15 @@ static void Save (this JavaField field, XmlWriter writer)
133143
XmlConvert.ToString (field.Volatile),
134144
null,
135145
null,
146+
null,
147+
null,
148+
null,
136149
null);
137150
}
138151

139152
static void Save (this JavaConstructor ctor, XmlWriter writer)
140153
{
141-
SaveCommon (ctor, writer, "constructor", null, null, null, null, null, ctor.Type ?? ctor.Parent.FullName, null, null, null, ctor.TypeParameters, ctor.Parameters, ctor.Exceptions);
154+
SaveCommon (ctor, writer, "constructor", null, null, null, null, null, ctor.Type ?? ctor.Parent.FullName, null, null, null, ctor.TypeParameters, ctor.Parameters, ctor.Exceptions, ctor.ExtendedBridge, ctor.ExtendedJniReturn, ctor.ExtendedSynthetic);
142155
}
143156

144157
static void Save (this JavaMethod method, XmlWriter writer)
@@ -187,7 +200,10 @@ static void Save (this JavaMethod method, XmlWriter writer)
187200
null,
188201
method.TypeParameters,
189202
method.Parameters,
190-
method.Exceptions);
203+
method.Exceptions,
204+
method.ExtendedBridge,
205+
method.ExtendedJniReturn,
206+
method.ExtendedSynthetic);
191207
}
192208

193209
static void SaveCommon (this JavaMember m, XmlWriter writer, string elementName,
@@ -196,7 +212,8 @@ static void SaveCommon (this JavaMember m, XmlWriter writer, string elementName,
196212
string value, string volat,
197213
JavaTypeParameters typeParameters,
198214
IEnumerable<JavaParameter> parameters,
199-
IEnumerable<JavaException> exceptions)
215+
IEnumerable<JavaException> exceptions,
216+
bool? extBridge, string jniReturn, bool? extSynthetic)
200217
{
201218
// If any of the parameters contain reference to non-public type, it cannot be generated.
202219
if (parameters != null && parameters.Any (p => p.ResolvedType.ReferencedType != null && string.IsNullOrEmpty (p.ResolvedType.ReferencedType.Visibility)))
@@ -208,10 +225,15 @@ static void SaveCommon (this JavaMember m, XmlWriter writer, string elementName,
208225
writer.WriteAttributeString ("deprecated", m.Deprecated);
209226
writer.WriteAttributeString ("final", XmlConvert.ToString (m.Final));
210227
writer.WriteAttributeString ("name", m.Name);
228+
writer.WriteAttributeString ("jni-signature", m.ExtendedJniSignature);
229+
if (extBridge.HasValue)
230+
writer.WriteAttributeString ("bridge", extBridge.Value ? "true" : "false");
211231
if (native != null)
212232
writer.WriteAttributeString ("native", native);
213233
if (ret != null)
214234
writer.WriteAttributeString ("return", ret);
235+
if (jniReturn != null)
236+
writer.WriteAttributeString ("jni-return", jniReturn);
215237
writer.WriteAttributeString ("static", XmlConvert.ToString (m.Static));
216238
if (sync != null)
217239
writer.WriteAttributeString ("synchronized", sync);
@@ -223,6 +245,8 @@ static void SaveCommon (this JavaMember m, XmlWriter writer, string elementName,
223245
writer.WriteAttributeString ("type-generic-aware", typeGeneric);
224246
if (value != null)
225247
writer.WriteAttributeString ("value", value);
248+
if (extSynthetic.HasValue)
249+
writer.WriteAttributeString ("synthetic", extSynthetic.Value ? "true" : "false");
226250
writer.WriteAttributeString ("visibility", m.Visibility);
227251
if (volat != null)
228252
writer.WriteAttributeString ("volatile", volat);
@@ -235,6 +259,7 @@ static void SaveCommon (this JavaMember m, XmlWriter writer, string elementName,
235259
writer.WriteStartElement ("parameter");
236260
writer.WriteAttributeString ("name", p.Name);
237261
writer.WriteAttributeString ("type", p.GetVisibleTypeName ());
262+
writer.WriteAttributeString ("jni-type", p.JniType);
238263
writer.WriteString ("\n ");
239264
writer.WriteFullEndElement ();
240265
}
@@ -245,6 +270,7 @@ static void SaveCommon (this JavaMember m, XmlWriter writer, string elementName,
245270
writer.WriteStartElement ("exception");
246271
writer.WriteAttributeString ("name", e.Name.Substring (e.Name.LastIndexOf ('/') + 1).Replace ('$', '.'));
247272
writer.WriteAttributeString ("type", e.Type);
273+
writer.WriteAttributeString ("type-generic-aware", e.TypeGenericAware);
248274
writer.WriteString ("\n ");
249275
writer.WriteFullEndElement ();
250276
}

src/Xamarin.Android.Tools.ApiXmlAdjuster/JavaApiXmlLoaderExtensions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public static void Load (this JavaPackage package, XmlReader reader, bool isRefe
4949
{
5050
reader.MoveToContent ();
5151
package.Name = XmlUtil.GetRequiredAttribute (reader, "name");
52+
package.JniName = reader.GetAttribute ("jni-name");
5253
if (reader.MoveToFirstAttribute ())
5354
if (reader.LocalName != "name")
5455
throw XmlUtil.UnexpectedAttribute (reader, "package");
@@ -203,6 +204,7 @@ public static void LoadMemberAttributes (this JavaMember member, XmlReader reade
203204
member.Name = XmlUtil.GetRequiredAttribute (reader, "name");
204205
member.Static = XmlConvert.ToBoolean (XmlUtil.GetRequiredAttribute (reader, "static"));
205206
member.Visibility = XmlUtil.GetRequiredAttribute (reader, "visibility");
207+
member.ExtendedJniSignature = XmlUtil.GetRequiredAttribute (reader, "jni-signature");
206208
}
207209

208210
public static void Load (this JavaField field, XmlReader reader)
@@ -222,7 +224,6 @@ static void LoadMethodBase (this JavaMethodBase methodBase, string elementName,
222224
var method = methodBase as JavaMethod; // kind of ugly hack yeah...
223225

224226
methodBase.LoadMemberAttributes (reader);
225-
//methodBase.ExtendedJniSignature = reader.GetAttribute ("jni-signature");
226227
methodBase.ExtendedJniReturn = reader.GetAttribute ("jni-return");
227228
methodBase.ExtendedSynthetic = XmlConvert.ToBoolean (reader.GetAttribute ("synthetic") ?? "false");
228229
methodBase.ExtendedBridge = XmlConvert.ToBoolean (reader.GetAttribute ("bridge") ?? "false");
@@ -282,13 +283,15 @@ internal static void Load (this JavaParameter p, XmlReader reader)
282283
{
283284
p.Name = XmlUtil.GetRequiredAttribute (reader, "name");
284285
p.Type = XmlUtil.GetRequiredAttribute (reader, "type");
286+
p.JniType = XmlUtil.GetRequiredAttribute (reader, "jni-type");
285287
reader.Skip ();
286288
}
287289

288290
internal static void Load (this JavaException e, XmlReader reader)
289291
{
290292
e.Name = XmlUtil.GetRequiredAttribute (reader, "name");
291293
e.Type = XmlUtil.GetRequiredAttribute (reader, "type");
294+
e.Type = XmlUtil.GetRequiredAttribute (reader, "type-generic-aware");
292295
reader.Skip ();
293296
}
294297

src/Xamarin.Android.Tools.ApiXmlAdjuster/Tests/OverrideMarkerTest.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ public void AncestralOverrides ()
3737
{
3838
string xml = @"<api>
3939
<package name='XXX'>
40-
<class abstract='true' deprecated='not deprecated' extends='android.app.ExpandableListActivity' extends-generic-aware='android.app.ExpandableListActivity' final='false' name='SherlockExpandableListActivity' static='false' visibility='public'>
41-
<method abstract='false' deprecated='not deprecated' final='false' name='addContentView' native='false' return='void' static='false' synchronized='false' visibility='public'>
42-
<parameter name = 'view' type='android.view.View'>
40+
<class abstract='true' deprecated='not deprecated' extends='android.app.ExpandableListActivity' extends-generic-aware='android.app.ExpandableListActivity' final='false' name='SherlockExpandableListActivity' static='false' visibility='public' jni-signature='Landroid/app/ExpandableListActivity;'>
41+
<method abstract='false' deprecated='not deprecated' final='false' name='addContentView' native='false' return='void' static='false' synchronized='false' visibility='public' jni-signature='(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V'>
42+
<parameter name = 'view' type='android.view.View' jni-type='Landroid/view/View;'>
4343
</parameter>
44-
<parameter name = 'params' type='android.view.ViewGroup.LayoutParams'>
44+
<parameter name = 'params' type='android.view.ViewGroup.LayoutParams' jni-type='Landroid/view/ViewGroup$LayoutParams;'>
4545
</parameter>
4646
</method>
4747
</class>
@@ -63,8 +63,8 @@ public void GenericConstructors ()
6363
{
6464
string xml = @"<api>
6565
<package name='XXX'>
66-
<class abstract='true' deprecated='not deprecated' final='false' name='GenericConstructors' static='false' visibility='public'>
67-
<constructor deprecated='not deprecated' final='false' name='GenericConstructors' static='false' visibility='public'>
66+
<class abstract='true' deprecated='not deprecated' final='false' name='GenericConstructors' static='false' visibility='public' jni-signature='Landroid/app/GenericConstructors'>
67+
<constructor deprecated='not deprecated' final='false' name='GenericConstructors' static='false' visibility='public' jni-signature='(LTTE;)V'>
6868
<typeParameters>
6969
<typeParameter name='E' interfaceBounds='' jni-interfaceBounds='' />
7070
</typeParameters>

0 commit comments

Comments
 (0)