Skip to content

Commit 0d100c7

Browse files
[jnigen] fixed the problem with annotations containing enums + reg tests (#150)
1 parent 534e92f commit 0d100c7

File tree

8 files changed

+204
-5
lines changed

8 files changed

+204
-5
lines changed

pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,10 @@ public JavaAnnotation annotation(AnnotationMirror mirror) {
9595
var val = values.get(key);
9696
var obj = val.getValue();
9797
// TODO(#23): Accurately represent more complex annotation values
98-
if (obj instanceof String || obj instanceof Number) {
98+
if (obj instanceof Number) {
9999
annotation.properties.put(key.getSimpleName().toString(), obj);
100100
} else {
101-
annotation.properties.put(
102-
key.getSimpleName().toString(), val.accept(new AnnotationVisitor(this), null));
101+
annotation.properties.put(key.getSimpleName().toString(), obj.toString());
103102
}
104103
}
105104
return annotation;

pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public class JavaAnnotation {
1313
public Map<String, Object> properties = new HashMap<>();
1414

1515
public static class EnumVal {
16-
String enumClass;
17-
String value;
16+
public String enumClass;
17+
public String value;
1818

1919
public EnumVal(String enumClass, String value) {
2020
this.enumClass = enumClass;

pkgs/jnigen/test/bindings_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ Future<void> setupDylibsAndClasses() async {
4545
join(group, 'generics', 'StringStack.java'),
4646
join(group, 'generics', 'StringValuedMap.java'),
4747
join(group, 'generics', 'StringKeyedMap.java'),
48+
join(group, 'annotations', 'JsonSerializable.java'),
49+
join(group, 'annotations', 'MyDataClass.java'),
4850
join(group, 'pkg2', 'C2.java'),
4951
join(group, 'pkg2', 'Example.java'),
5052
],

pkgs/jnigen/test/simple_package_test/generate.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ var javaFiles = [
3131
join(javaPrefix, 'generics', 'StringStack.java'),
3232
join(javaPrefix, 'generics', 'StringValuedMap.java'),
3333
join(javaPrefix, 'generics', 'StringKeyedMap.java'),
34+
join(javaPrefix, 'annotations', 'JsonSerializable.java'),
35+
join(javaPrefix, 'annotations', 'MyDataClass.java'),
3436
];
3537

3638
void compileJavaSources(String workingDir, List<String> files) async {
@@ -52,6 +54,7 @@ Config getConfig([BindingsType bindingsType = BindingsType.cBased]) {
5254
'com.github.dart_lang.jnigen.simple_package',
5355
'com.github.dart_lang.jnigen.pkg2',
5456
'com.github.dart_lang.jnigen.generics',
57+
'com.github.dart_lang.jnigen.annotations',
5558
],
5659
logLevel: Level.INFO,
5760
outputConfig: OutputConfig(
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
package com.github.dart_lang.jnigen.annotations;
6+
7+
import java.lang.annotation.*;
8+
9+
@Retention(RetentionPolicy.SOURCE)
10+
@Target(ElementType.TYPE)
11+
public @interface JsonSerializable {
12+
public static enum Case {
13+
SNAKE_CASE,
14+
KEBAB_CASE,
15+
CAMEL_CASE
16+
}
17+
18+
public Case value();
19+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
package com.github.dart_lang.jnigen.annotations;
6+
7+
@JsonSerializable(JsonSerializable.Case.CAMEL_CASE)
8+
public class MyDataClass {}

pkgs/jnigen/test/simple_package_test/lib/simple_package.dart

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,3 +1525,106 @@ extension $StringValuedMapArray<K extends jni.JObject>
15251525
(this as jni.JArray<jni.JObject>)[index] = value;
15261526
}
15271527
}
1528+
1529+
/// from: com.github.dart_lang.jnigen.annotations.JsonSerializable$Case
1530+
class JsonSerializable_Case extends jni.JObject {
1531+
late final jni.JObjType? _$type;
1532+
@override
1533+
jni.JObjType get $type => _$type ??= type;
1534+
1535+
JsonSerializable_Case.fromRef(
1536+
jni.JObjectPtr ref,
1537+
) : super.fromRef(ref);
1538+
1539+
/// The type which includes information such as the signature of this class.
1540+
static const type = $JsonSerializable_CaseType();
1541+
1542+
static final _values =
1543+
jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
1544+
"JsonSerializable_Case__values")
1545+
.asFunction<jni.JniResult Function()>();
1546+
1547+
/// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case[] values()
1548+
/// The returned object must be deleted after use, by calling the `delete` method.
1549+
static jni.JArray<JsonSerializable_Case> values() =>
1550+
const jni.JArrayType($JsonSerializable_CaseType())
1551+
.fromRef(_values().object);
1552+
1553+
static final _valueOf = jniLookup<
1554+
ffi.NativeFunction<
1555+
jni.JniResult Function(
1556+
ffi.Pointer<ffi.Void>)>>("JsonSerializable_Case__valueOf")
1557+
.asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
1558+
1559+
/// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case valueOf(java.lang.String name)
1560+
/// The returned object must be deleted after use, by calling the `delete` method.
1561+
static JsonSerializable_Case valueOf(jni.JString name) =>
1562+
const $JsonSerializable_CaseType()
1563+
.fromRef(_valueOf(name.reference).object);
1564+
}
1565+
1566+
class $JsonSerializable_CaseType extends jni.JObjType<JsonSerializable_Case> {
1567+
const $JsonSerializable_CaseType();
1568+
1569+
@override
1570+
String get signature =>
1571+
r"Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;";
1572+
1573+
@override
1574+
JsonSerializable_Case fromRef(jni.JObjectPtr ref) =>
1575+
JsonSerializable_Case.fromRef(ref);
1576+
}
1577+
1578+
extension $JsonSerializable_CaseArray on jni.JArray<JsonSerializable_Case> {
1579+
JsonSerializable_Case operator [](int index) {
1580+
return (elementType as $JsonSerializable_CaseType)
1581+
.fromRef(elementAt(index, jni.JniCallType.objectType).object);
1582+
}
1583+
1584+
void operator []=(int index, JsonSerializable_Case value) {
1585+
(this as jni.JArray<jni.JObject>)[index] = value;
1586+
}
1587+
}
1588+
1589+
/// from: com.github.dart_lang.jnigen.annotations.MyDataClass
1590+
class MyDataClass extends jni.JObject {
1591+
late final jni.JObjType? _$type;
1592+
@override
1593+
jni.JObjType get $type => _$type ??= type;
1594+
1595+
MyDataClass.fromRef(
1596+
jni.JObjectPtr ref,
1597+
) : super.fromRef(ref);
1598+
1599+
/// The type which includes information such as the signature of this class.
1600+
static const type = $MyDataClassType();
1601+
1602+
static final _ctor = jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
1603+
"MyDataClass__ctor")
1604+
.asFunction<jni.JniResult Function()>();
1605+
1606+
/// from: public void <init>()
1607+
MyDataClass() : super.fromRef(_ctor().object);
1608+
}
1609+
1610+
class $MyDataClassType extends jni.JObjType<MyDataClass> {
1611+
const $MyDataClassType();
1612+
1613+
@override
1614+
String get signature =>
1615+
r"Lcom/github/dart_lang/jnigen/annotations/MyDataClass;";
1616+
1617+
@override
1618+
MyDataClass fromRef(jni.JObjectPtr ref) => MyDataClass.fromRef(ref);
1619+
}
1620+
1621+
extension $MyDataClassArray on jni.JArray<MyDataClass> {
1622+
MyDataClass operator [](int index) {
1623+
return (elementType as $MyDataClassType)
1624+
.fromRef(elementAt(index, jni.JniCallType.objectType).object);
1625+
}
1626+
1627+
void operator []=(int index, MyDataClass value) {
1628+
(this as jni.JArray<jni.JObject>)[index] = value;
1629+
}
1630+
}

pkgs/jnigen/test/simple_package_test/src/simple_package.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,3 +1190,68 @@ JniResult StringValuedMap__ctor() {
11901190
return (JniResult){.result = {.l = to_global_ref(_result)},
11911191
.exception = check_exception()};
11921192
}
1193+
1194+
// com.github.dart_lang.jnigen.annotations.JsonSerializable$Case
1195+
jclass _c_JsonSerializable_Case = NULL;
1196+
1197+
jmethodID _m_JsonSerializable_Case__values = NULL;
1198+
FFI_PLUGIN_EXPORT
1199+
JniResult JsonSerializable_Case__values() {
1200+
load_env();
1201+
load_class_gr(
1202+
&_c_JsonSerializable_Case,
1203+
"com/github/dart_lang/jnigen/annotations/JsonSerializable$Case");
1204+
if (_c_JsonSerializable_Case == NULL)
1205+
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
1206+
load_static_method(
1207+
_c_JsonSerializable_Case, &_m_JsonSerializable_Case__values, "values",
1208+
"()[Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;");
1209+
if (_m_JsonSerializable_Case__values == NULL)
1210+
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
1211+
jobject _result = (*jniEnv)->CallStaticObjectMethod(
1212+
jniEnv, _c_JsonSerializable_Case, _m_JsonSerializable_Case__values);
1213+
return (JniResult){.result = {.l = to_global_ref(_result)},
1214+
.exception = check_exception()};
1215+
}
1216+
1217+
jmethodID _m_JsonSerializable_Case__valueOf = NULL;
1218+
FFI_PLUGIN_EXPORT
1219+
JniResult JsonSerializable_Case__valueOf(jobject name) {
1220+
load_env();
1221+
load_class_gr(
1222+
&_c_JsonSerializable_Case,
1223+
"com/github/dart_lang/jnigen/annotations/JsonSerializable$Case");
1224+
if (_c_JsonSerializable_Case == NULL)
1225+
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
1226+
load_static_method(_c_JsonSerializable_Case,
1227+
&_m_JsonSerializable_Case__valueOf, "valueOf",
1228+
"(Ljava/lang/String;)Lcom/github/dart_lang/jnigen/"
1229+
"annotations/JsonSerializable$Case;");
1230+
if (_m_JsonSerializable_Case__valueOf == NULL)
1231+
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
1232+
jobject _result = (*jniEnv)->CallStaticObjectMethod(
1233+
jniEnv, _c_JsonSerializable_Case, _m_JsonSerializable_Case__valueOf,
1234+
name);
1235+
return (JniResult){.result = {.l = to_global_ref(_result)},
1236+
.exception = check_exception()};
1237+
}
1238+
1239+
// com.github.dart_lang.jnigen.annotations.MyDataClass
1240+
jclass _c_MyDataClass = NULL;
1241+
1242+
jmethodID _m_MyDataClass__ctor = NULL;
1243+
FFI_PLUGIN_EXPORT
1244+
JniResult MyDataClass__ctor() {
1245+
load_env();
1246+
load_class_gr(&_c_MyDataClass,
1247+
"com/github/dart_lang/jnigen/annotations/MyDataClass");
1248+
if (_c_MyDataClass == NULL)
1249+
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
1250+
load_method(_c_MyDataClass, &_m_MyDataClass__ctor, "<init>", "()V");
1251+
if (_m_MyDataClass__ctor == NULL)
1252+
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
1253+
jobject _result =
1254+
(*jniEnv)->NewObject(jniEnv, _c_MyDataClass, _m_MyDataClass__ctor);
1255+
return (JniResult){.result = {.l = to_global_ref(_result)},
1256+
.exception = check_exception()};
1257+
}

0 commit comments

Comments
 (0)