[jnigen] fixed the problem with annotations containing enums + reg tests (https://github.com/dart-lang/jnigen/issues/150)
diff --git a/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java b/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java index bb52e46..d128815 100644 --- a/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java +++ b/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java
@@ -95,11 +95,10 @@ var val = values.get(key); var obj = val.getValue(); // TODO(#23): Accurately represent more complex annotation values - if (obj instanceof String || obj instanceof Number) { + if (obj instanceof Number) { annotation.properties.put(key.getSimpleName().toString(), obj); } else { - annotation.properties.put( - key.getSimpleName().toString(), val.accept(new AnnotationVisitor(this), null)); + annotation.properties.put(key.getSimpleName().toString(), obj.toString()); } } return annotation;
diff --git a/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java b/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java index e8ba624..89460bc 100644 --- a/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java +++ b/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java
@@ -13,8 +13,8 @@ public Map<String, Object> properties = new HashMap<>(); public static class EnumVal { - String enumClass; - String value; + public String enumClass; + public String value; public EnumVal(String enumClass, String value) { this.enumClass = enumClass;
diff --git a/pkgs/jnigen/test/bindings_test.dart b/pkgs/jnigen/test/bindings_test.dart index cb0aa97..772d034 100644 --- a/pkgs/jnigen/test/bindings_test.dart +++ b/pkgs/jnigen/test/bindings_test.dart
@@ -45,6 +45,8 @@ join(group, 'generics', 'StringStack.java'), join(group, 'generics', 'StringValuedMap.java'), join(group, 'generics', 'StringKeyedMap.java'), + join(group, 'annotations', 'JsonSerializable.java'), + join(group, 'annotations', 'MyDataClass.java'), join(group, 'pkg2', 'C2.java'), join(group, 'pkg2', 'Example.java'), ],
diff --git a/pkgs/jnigen/test/simple_package_test/generate.dart b/pkgs/jnigen/test/simple_package_test/generate.dart index 99eb0c1..657dd90 100644 --- a/pkgs/jnigen/test/simple_package_test/generate.dart +++ b/pkgs/jnigen/test/simple_package_test/generate.dart
@@ -31,6 +31,8 @@ join(javaPrefix, 'generics', 'StringStack.java'), join(javaPrefix, 'generics', 'StringValuedMap.java'), join(javaPrefix, 'generics', 'StringKeyedMap.java'), + join(javaPrefix, 'annotations', 'JsonSerializable.java'), + join(javaPrefix, 'annotations', 'MyDataClass.java'), ]; void compileJavaSources(String workingDir, List<String> files) async { @@ -52,6 +54,7 @@ 'com.github.dart_lang.jnigen.simple_package', 'com.github.dart_lang.jnigen.pkg2', 'com.github.dart_lang.jnigen.generics', + 'com.github.dart_lang.jnigen.annotations', ], logLevel: Level.INFO, outputConfig: OutputConfig(
diff --git a/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/JsonSerializable.java b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/JsonSerializable.java new file mode 100644 index 0000000..af7071e --- /dev/null +++ b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/JsonSerializable.java
@@ -0,0 +1,19 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.github.dart_lang.jnigen.annotations; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.TYPE) +public @interface JsonSerializable { + public static enum Case { + SNAKE_CASE, + KEBAB_CASE, + CAMEL_CASE + } + + public Case value(); +}
diff --git a/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/MyDataClass.java b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/MyDataClass.java new file mode 100644 index 0000000..ff71b69 --- /dev/null +++ b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/MyDataClass.java
@@ -0,0 +1,8 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.github.dart_lang.jnigen.annotations; + +@JsonSerializable(JsonSerializable.Case.CAMEL_CASE) +public class MyDataClass {}
diff --git a/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart b/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart index 841cabe..aa79dbe 100644 --- a/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart +++ b/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart
@@ -1525,3 +1525,106 @@ (this as jni.JArray<jni.JObject>)[index] = value; } } + +/// from: com.github.dart_lang.jnigen.annotations.JsonSerializable$Case +class JsonSerializable_Case extends jni.JObject { + late final jni.JObjType? _$type; + @override + jni.JObjType get $type => _$type ??= type; + + JsonSerializable_Case.fromRef( + jni.JObjectPtr ref, + ) : super.fromRef(ref); + + /// The type which includes information such as the signature of this class. + static const type = $JsonSerializable_CaseType(); + + static final _values = + jniLookup<ffi.NativeFunction<jni.JniResult Function()>>( + "JsonSerializable_Case__values") + .asFunction<jni.JniResult Function()>(); + + /// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case[] values() + /// The returned object must be deleted after use, by calling the `delete` method. + static jni.JArray<JsonSerializable_Case> values() => + const jni.JArrayType($JsonSerializable_CaseType()) + .fromRef(_values().object); + + static final _valueOf = jniLookup< + ffi.NativeFunction< + jni.JniResult Function( + ffi.Pointer<ffi.Void>)>>("JsonSerializable_Case__valueOf") + .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>(); + + /// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case valueOf(java.lang.String name) + /// The returned object must be deleted after use, by calling the `delete` method. + static JsonSerializable_Case valueOf(jni.JString name) => + const $JsonSerializable_CaseType() + .fromRef(_valueOf(name.reference).object); +} + +class $JsonSerializable_CaseType extends jni.JObjType<JsonSerializable_Case> { + const $JsonSerializable_CaseType(); + + @override + String get signature => + r"Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;"; + + @override + JsonSerializable_Case fromRef(jni.JObjectPtr ref) => + JsonSerializable_Case.fromRef(ref); +} + +extension $JsonSerializable_CaseArray on jni.JArray<JsonSerializable_Case> { + JsonSerializable_Case operator [](int index) { + return (elementType as $JsonSerializable_CaseType) + .fromRef(elementAt(index, jni.JniCallType.objectType).object); + } + + void operator []=(int index, JsonSerializable_Case value) { + (this as jni.JArray<jni.JObject>)[index] = value; + } +} + +/// from: com.github.dart_lang.jnigen.annotations.MyDataClass +class MyDataClass extends jni.JObject { + late final jni.JObjType? _$type; + @override + jni.JObjType get $type => _$type ??= type; + + MyDataClass.fromRef( + jni.JObjectPtr ref, + ) : super.fromRef(ref); + + /// The type which includes information such as the signature of this class. + static const type = $MyDataClassType(); + + static final _ctor = jniLookup<ffi.NativeFunction<jni.JniResult Function()>>( + "MyDataClass__ctor") + .asFunction<jni.JniResult Function()>(); + + /// from: public void <init>() + MyDataClass() : super.fromRef(_ctor().object); +} + +class $MyDataClassType extends jni.JObjType<MyDataClass> { + const $MyDataClassType(); + + @override + String get signature => + r"Lcom/github/dart_lang/jnigen/annotations/MyDataClass;"; + + @override + MyDataClass fromRef(jni.JObjectPtr ref) => MyDataClass.fromRef(ref); +} + +extension $MyDataClassArray on jni.JArray<MyDataClass> { + MyDataClass operator [](int index) { + return (elementType as $MyDataClassType) + .fromRef(elementAt(index, jni.JniCallType.objectType).object); + } + + void operator []=(int index, MyDataClass value) { + (this as jni.JArray<jni.JObject>)[index] = value; + } +}
diff --git a/pkgs/jnigen/test/simple_package_test/src/simple_package.c b/pkgs/jnigen/test/simple_package_test/src/simple_package.c index ba17028..e5937df 100644 --- a/pkgs/jnigen/test/simple_package_test/src/simple_package.c +++ b/pkgs/jnigen/test/simple_package_test/src/simple_package.c
@@ -1190,3 +1190,68 @@ return (JniResult){.result = {.l = to_global_ref(_result)}, .exception = check_exception()}; } + +// com.github.dart_lang.jnigen.annotations.JsonSerializable$Case +jclass _c_JsonSerializable_Case = NULL; + +jmethodID _m_JsonSerializable_Case__values = NULL; +FFI_PLUGIN_EXPORT +JniResult JsonSerializable_Case__values() { + load_env(); + load_class_gr( + &_c_JsonSerializable_Case, + "com/github/dart_lang/jnigen/annotations/JsonSerializable$Case"); + if (_c_JsonSerializable_Case == NULL) + return (JniResult){.result = {.j = 0}, .exception = check_exception()}; + load_static_method( + _c_JsonSerializable_Case, &_m_JsonSerializable_Case__values, "values", + "()[Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;"); + if (_m_JsonSerializable_Case__values == NULL) + return (JniResult){.result = {.j = 0}, .exception = check_exception()}; + jobject _result = (*jniEnv)->CallStaticObjectMethod( + jniEnv, _c_JsonSerializable_Case, _m_JsonSerializable_Case__values); + return (JniResult){.result = {.l = to_global_ref(_result)}, + .exception = check_exception()}; +} + +jmethodID _m_JsonSerializable_Case__valueOf = NULL; +FFI_PLUGIN_EXPORT +JniResult JsonSerializable_Case__valueOf(jobject name) { + load_env(); + load_class_gr( + &_c_JsonSerializable_Case, + "com/github/dart_lang/jnigen/annotations/JsonSerializable$Case"); + if (_c_JsonSerializable_Case == NULL) + return (JniResult){.result = {.j = 0}, .exception = check_exception()}; + load_static_method(_c_JsonSerializable_Case, + &_m_JsonSerializable_Case__valueOf, "valueOf", + "(Ljava/lang/String;)Lcom/github/dart_lang/jnigen/" + "annotations/JsonSerializable$Case;"); + if (_m_JsonSerializable_Case__valueOf == NULL) + return (JniResult){.result = {.j = 0}, .exception = check_exception()}; + jobject _result = (*jniEnv)->CallStaticObjectMethod( + jniEnv, _c_JsonSerializable_Case, _m_JsonSerializable_Case__valueOf, + name); + return (JniResult){.result = {.l = to_global_ref(_result)}, + .exception = check_exception()}; +} + +// com.github.dart_lang.jnigen.annotations.MyDataClass +jclass _c_MyDataClass = NULL; + +jmethodID _m_MyDataClass__ctor = NULL; +FFI_PLUGIN_EXPORT +JniResult MyDataClass__ctor() { + load_env(); + load_class_gr(&_c_MyDataClass, + "com/github/dart_lang/jnigen/annotations/MyDataClass"); + if (_c_MyDataClass == NULL) + return (JniResult){.result = {.j = 0}, .exception = check_exception()}; + load_method(_c_MyDataClass, &_m_MyDataClass__ctor, "<init>", "()V"); + if (_m_MyDataClass__ctor == NULL) + return (JniResult){.result = {.j = 0}, .exception = check_exception()}; + jobject _result = + (*jniEnv)->NewObject(jniEnv, _c_MyDataClass, _m_MyDataClass__ctor); + return (JniResult){.result = {.l = to_global_ref(_result)}, + .exception = check_exception()}; +}