Skip to content

Commit 8f22d3b

Browse files
committed
[Java.Interop.Tools.JavaTypeSystem] Add 'annotated-visibility' for types.
1 parent 07d5595 commit 8f22d3b

File tree

11 files changed

+66
-20
lines changed

11 files changed

+66
-20
lines changed

src/Java.Interop.Tools.JavaTypeSystem/Adapters/JavaXmlApiExporter.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,15 @@ public static void Save (JavaTypeCollection types, XmlWriter writer)
5858
static void SaveType (JavaTypeModel type, XmlWriter writer)
5959
{
6060
if (type is JavaClassModel cls)
61-
SaveType (type, writer, "class", XmlConvert.ToString (cls.IsAbstract), cls.BaseType, cls.BaseTypeGeneric, cls.BaseTypeJni);
61+
SaveType (type, writer, "class", XmlConvert.ToString (cls.IsAbstract), cls.BaseType, cls.BaseTypeGeneric, cls.BaseTypeJni, cls.AnnotatedVisibility);
6262
else
63-
SaveType (type, writer, "interface", "true", null, null, null);
63+
SaveType (type, writer, "interface", "true", null, null, null, type.AnnotatedVisibility);
6464

6565
foreach (var nested in type.NestedTypes)
6666
SaveType (nested, writer);
6767
}
6868

69-
static void SaveType (JavaTypeModel cls, XmlWriter writer, string elementName, string abs, string? ext, string? extgen, string? jniExt)
69+
static void SaveType (JavaTypeModel cls, XmlWriter writer, string elementName, string abs, string? ext, string? extgen, string? jniExt, string annotatedVisibility)
7070
{
7171
writer.WriteStartElement (elementName);
7272

@@ -80,6 +80,7 @@ static void SaveType (JavaTypeModel cls, XmlWriter writer, string elementName, s
8080
writer.WriteAttributeString ("static", XmlConvert.ToString (cls.IsStatic));
8181
writer.WriteAttributeString ("visibility", cls.Visibility);
8282
writer.WriteAttributeStringIfValue ("jni-signature", cls.ExtendedJniSignature);
83+
writer.WriteAttributeStringIfValue ("annotated-visibility", annotatedVisibility);
8384

8485
if (cls.PropertyBag.TryGetValue ("merge.SourceFile", out var source))
8586
writer.WriteAttributeString ("merge.SourceFile", source);

src/Java.Interop.Tools.JavaTypeSystem/Adapters/JavaXmlApiImporter.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ public static JavaClassModel ParseClass (JavaPackage package, XElement element)
113113
javaDeprecated: element.XGetAttribute ("deprecated"),
114114
javaStatic: element.XGetAttributeAsBool ("static"),
115115
jniSignature: element.XGetAttribute ("jni-signature"),
116-
baseTypeJni: element.XGetAttribute ("jni-extends")
116+
baseTypeJni: element.XGetAttribute ("jni-extends"),
117+
annotatedVisibility: element.XGetAttribute ("annotated-visibility")
117118
);
118119

119120
if (element.XGetAttribute ("merge.SourceFile") is string source && source.HasValue ())
@@ -151,8 +152,9 @@ public static JavaInterfaceModel ParseInterface (JavaPackage package, XElement e
151152
var deprecated = element.XGetAttribute ("deprecated");
152153
var is_static = element.XGetAttribute ("static") == "true";
153154
var jni_signature = element.XGetAttribute ("jni-signature");
155+
var annotated_visibility = element.XGetAttribute ("annotated-visibility");
154156

155-
var model = new JavaInterfaceModel (package, nested_name, visibility, deprecated, is_static, jni_signature);
157+
var model = new JavaInterfaceModel (package, nested_name, visibility, deprecated, is_static, jni_signature, annotated_visibility);
156158

157159
if (element.XGetAttribute ("merge.SourceFile") is string source && source.HasValue ())
158160
model.PropertyBag.Add ("merge.SourceFile", source);

src/Java.Interop.Tools.JavaTypeSystem/Adapters/ManagedApiImporter.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ static bool ShouldImport (TypeDefinition td)
114114
javaDeprecated: obs_attr != null ? "deprecated" : "not-deprecated",
115115
javaStatic: false,
116116
jniSignature: FormatJniSignature (package, nested_name),
117-
baseTypeJni: base_jni.HasValue () ? $"L{base_jni};" : string.Empty
117+
baseTypeJni: base_jni.HasValue () ? $"L{base_jni};" : string.Empty,
118+
annotatedVisibility: string.Empty
118119
); ;
119120

120121
ParseImplementedInterfaces (type, model);
@@ -144,7 +145,8 @@ static bool ShouldImport (TypeDefinition td)
144145
javaVisibility: type.IsPublic || type.IsNestedPublic ? "public" : "protected internal",
145146
javaDeprecated: obs_attr != null ? "deprecated" : "not-deprecated",
146147
javaStatic: false,
147-
jniSignature: FormatJniSignature (package, nested_name)
148+
jniSignature: FormatJniSignature (package, nested_name),
149+
annotatedVisibility: ""
148150
);
149151

150152
ParseImplementedInterfaces (type, model);

src/Java.Interop.Tools.JavaTypeSystem/JavaModels/JavaBuiltInType.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Java.Interop.Tools.JavaTypeSystem.Models
66
// Represents a Java built-in type like 'int' or 'float'
77
public class JavaBuiltInType : JavaTypeModel
88
{
9-
public JavaBuiltInType (string name) : base (new JavaPackage ("", "", null), name, "public", false, true, "not deprecated", false, "") { }
9+
public JavaBuiltInType (string name) : base (new JavaPackage ("", "", null), name, "public", false, true, "not deprecated", false, "", "") { }
1010

1111
public override void Resolve (JavaTypeCollection types, ICollection<JavaUnresolvableModel> unresolvables)
1212
{

src/Java.Interop.Tools.JavaTypeSystem/JavaModels/JavaClassModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public class JavaClassModel : JavaTypeModel
1515
public JavaTypeReference? BaseTypeReference { get; private set; }
1616
public List<JavaConstructorModel> Constructors { get; } = new List<JavaConstructorModel> ();
1717

18-
public JavaClassModel (JavaPackage javaPackage, string javaNestedName, string javaVisibility, bool javaAbstract, bool javaFinal, string javaBaseType, string javaBaseTypeGeneric, string javaDeprecated, bool javaStatic, string jniSignature, string baseTypeJni) :
19-
base (javaPackage, javaNestedName, javaVisibility, javaAbstract, javaFinal, javaDeprecated, javaStatic, jniSignature)
18+
public JavaClassModel (JavaPackage javaPackage, string javaNestedName, string javaVisibility, bool javaAbstract, bool javaFinal, string javaBaseType, string javaBaseTypeGeneric, string javaDeprecated, bool javaStatic, string jniSignature, string baseTypeJni, string annotatedVisibility) :
19+
base (javaPackage, javaNestedName, javaVisibility, javaAbstract, javaFinal, javaDeprecated, javaStatic, jniSignature, annotatedVisibility)
2020
{
2121
BaseType = javaBaseType;
2222
BaseTypeGeneric = javaBaseTypeGeneric;

src/Java.Interop.Tools.JavaTypeSystem/JavaModels/JavaInterfaceModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ namespace Java.Interop.Tools.JavaTypeSystem.Models
44
{
55
public class JavaInterfaceModel : JavaTypeModel
66
{
7-
public JavaInterfaceModel (JavaPackage javaPackage, string javaNestedName, string javaVisibility, string javaDeprecated, bool javaStatic, string jniSignature) :
8-
base (javaPackage, javaNestedName, javaVisibility, false, false, javaDeprecated, javaStatic, jniSignature)
7+
public JavaInterfaceModel (JavaPackage javaPackage, string javaNestedName, string javaVisibility, string javaDeprecated, bool javaStatic, string jniSignature, string annotatedVisibility) :
8+
base (javaPackage, javaNestedName, javaVisibility, false, false, javaDeprecated, javaStatic, jniSignature, annotatedVisibility)
99
{
1010
}
1111

src/Java.Interop.Tools.JavaTypeSystem/JavaModels/JavaTypeModel.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public abstract class JavaTypeModel : IJavaResolvable
1717
public string NestedName { get; set; }
1818

1919
public string Visibility { get; }
20+
public string AnnotatedVisibility { get; }
2021
public bool IsAbstract { get; }
2122
public bool IsFinal { get; }
2223
public string Deprecated { get; }
@@ -36,12 +37,13 @@ public abstract class JavaTypeModel : IJavaResolvable
3637

3738
public Dictionary<string, string> PropertyBag { get; } = new Dictionary<string, string> ();
3839

39-
protected JavaTypeModel (JavaPackage javaPackage, string javaNestedName, string javaVisibility, bool javaAbstract, bool javaFinal, string deprecated, bool javaStatic, string jniSignature)
40+
protected JavaTypeModel (JavaPackage javaPackage, string javaNestedName, string javaVisibility, bool javaAbstract, bool javaFinal, string deprecated, bool javaStatic, string jniSignature, string annotatedVisibility)
4041
{
4142
Package = javaPackage;
4243
NestedName = javaNestedName.Replace ('$', '.');
4344
Name = NestedName.LastSubset ('.');
4445
Visibility = javaVisibility;
46+
AnnotatedVisibility = annotatedVisibility;
4547
IsAbstract = javaAbstract;
4648
IsFinal = javaFinal;
4749
Deprecated = deprecated;

tests/Java.Interop.Tools.JavaTypeSystem-Tests/Java.Interop.Tools.JavaTypeSystem-Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<TargetFrameworks>net472;$(DotNetTargetFramework)</TargetFrameworks>
55
<IsPackable>false</IsPackable>
66
<RootNamespace>Java.Interop.Tools.JavaTypeSystem.Tests</RootNamespace>
7+
<LangVersion>8.0</LangVersion>
78
</PropertyGroup>
89

910
<Import Project="..\..\TargetFrameworkDependentValues.props" />

tests/Java.Interop.Tools.JavaTypeSystem-Tests/JavaApiTestHelper.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public static JavaTypeCollection GetLoadedApi ()
1414
return JavaXmlApiImporter.Parse (ApiPath);
1515
}
1616

17-
public static JavaClassModel CreateClass (JavaPackage javaPackage, string javaNestedName, string javaVisibility = "public", bool javaAbstract = false, bool javaFinal = false, string javaBaseType = "java.lang.Object", string javaBaseTypeGeneric = "java.lang.Object", string javaDeprecated = "not deprecated", bool javaStatic = false, string jniSignature = "", string baseTypeJni = "java/lang/Object")
17+
public static JavaClassModel CreateClass (JavaPackage javaPackage, string javaNestedName, string javaVisibility = "public", bool javaAbstract = false, bool javaFinal = false, string javaBaseType = "java.lang.Object", string javaBaseTypeGeneric = "java.lang.Object", string javaDeprecated = "not deprecated", bool javaStatic = false, string jniSignature = "", string baseTypeJni = "java/lang/Object", string annotatedVisibility = "")
1818
{
1919
if (string.IsNullOrWhiteSpace (jniSignature))
2020
jniSignature = $"{(!string.IsNullOrWhiteSpace (javaPackage.Name) ? javaPackage.Name + "." : "")}{javaNestedName}".Replace ('.', '/');
@@ -30,7 +30,8 @@ public static JavaClassModel CreateClass (JavaPackage javaPackage, string javaNe
3030
javaDeprecated: javaDeprecated,
3131
javaStatic: javaStatic,
3232
jniSignature: jniSignature,
33-
baseTypeJni: baseTypeJni
33+
baseTypeJni: baseTypeJni,
34+
annotatedVisibility: annotatedVisibility
3435
);
3536

3637
return klass;

tests/Java.Interop.Tools.JavaTypeSystem-Tests/JavaTypeModelsTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using System.IO;
23
using System.Linq;
4+
using System.Xml;
35
using Java.Interop.Tools.JavaTypeSystem.Models;
46
using NUnit.Framework;
57

@@ -25,5 +27,35 @@ public void TestToString ()
2527
var kls = pkg.Types.First (t => t.FullName == "android.database.ContentObservable");
2628
Assert.AreEqual ("[Class] android.database.ContentObservable", kls.ToString ());
2729
}
30+
31+
[Test]
32+
public void AnnotatedVisibility ()
33+
{
34+
// Ensure the 'annotated-visibility' attribute gets passed through
35+
using var sw = new StringWriter ();
36+
37+
using (var xml = XmlWriter.Create (sw))
38+
JavaXmlApiExporter.Save (api, xml);
39+
40+
var doc = new XmlDocument { XmlResolver = null };
41+
using var sreader = new StringReader (sw.ToString ());
42+
using var reader = XmlReader.Create (sreader, new XmlReaderSettings { XmlResolver = null });
43+
doc.Load (reader);
44+
45+
var annotated_class = doc.SelectSingleNode ("/api/package/class[@name='StateListAnimator']");
46+
Assert.AreEqual ("TESTS", annotated_class.Attributes ["annotated-visibility"].InnerText);
47+
48+
var annotated_ctor = annotated_class ["constructor"];
49+
Assert.AreEqual ("TESTS", annotated_ctor.Attributes ["annotated-visibility"].InnerText);
50+
51+
var annotated_method = annotated_class ["method"];
52+
Assert.AreEqual ("TESTS", annotated_method.Attributes ["annotated-visibility"].InnerText);
53+
54+
var annotated_interface = doc.SelectSingleNode ("/api/package/interface[@name='DrmStore.ConstraintsColumns']");
55+
Assert.AreEqual ("TESTS", annotated_interface.Attributes ["annotated-visibility"].InnerText);
56+
57+
var annotated_field = annotated_interface ["field"];
58+
Assert.AreEqual ("TESTS", annotated_field.Attributes ["annotated-visibility"].InnerText);
59+
}
2860
}
2961
}

0 commit comments

Comments
 (0)