blob: a30f54db324d9da50d58b92c9dd2461f2a6a2a05 [file]
// 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.
import 'dart:io' as io;
import 'package:path/path.dart';
const _license = '''
// 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.
''';
final targetTypes = {
"String": "String",
"Object": "JniObject",
"Boolean": "bool",
"Byte": "int",
"Char": "int",
"Short": "int",
"Int": "int",
"Long": "int",
"Float": "double",
"Double": "double",
"Void": "void"
};
final resultConverters = {
"String": (String resultVar) => "return strRes",
"Object": (String resultVar) =>
"return JniObject.of(_env, $resultVar, nullptr)",
"Boolean": (String resultVar) => "return $resultVar != 0",
};
final invokeResultConverters = {
"String": (String resultVar) => "return strRes",
"Object": (String resultVar) =>
"return JniObject.of(env, $resultVar, nullptr)",
"Boolean": (String resultVar) => "return $resultVar != 0",
};
void main(List<String> args) {
final script = io.Platform.script;
final scriptDir = dirname(script.toFilePath(windows: io.Platform.isWindows));
String getTemplate(String name) {
return io.File(join(scriptDir, 'templates', name)).readAsStringSync();
}
final methodTemplates = getTemplate('jni_object_methods.dart.tmpl');
final fieldTemplates = getTemplate('jni_object_fields.dart.tmpl');
final invokeTemplates = getTemplate('invoke_static_methods.dart.tmpl');
final retrieveTemplates = getTemplate('retrieve_static_fields.dart.tmpl');
final outputDir = join("lib", "src");
final sInst = StringBuffer();
final sStatic = StringBuffer();
final sInvoke = StringBuffer();
final outPutPaths = {
sInst: join(outputDir, "jni_object_methods_generated.dart"),
sStatic: join(outputDir, "jni_class_methods_generated.dart"),
sInvoke: join(outputDir, "direct_methods_generated.dart")
};
for (final s in [sInst, sStatic, sInvoke]) {
s.write(_license);
s.write("// Autogenerated; DO NOT EDIT\n"
"// Generated by running the script in tool/gen_aux_methods.dart\n");
s.write("// coverage:ignore-file\n");
}
sInst.write("part of 'jni_object.dart';\n\n");
sStatic.write("part of 'jni_class.dart';\n\n");
sInvoke.write("part of 'jni.dart';\n\n");
sInst.write("extension JniObjectCallMethods on JniObject {");
sStatic.write("extension JniClassCallMethods on JniClass {");
sInvoke.write("extension JniInvokeMethods on Jni {");
for (final t in targetTypes.keys) {
void write(String template) {
final resultConverter =
resultConverters[t] ?? (resultVar) => "return $resultVar";
final skel = template
.replaceAll("{TYPE}", t == "String" ? "Object" : t)
.replaceAll("{PTYPE}", t)
.replaceAll("{TARGET_TYPE}", targetTypes[t]!)
.replaceAll("{RESULT}", resultConverter("result"))
.replaceAll(
"{STR_REF_DEL}",
t == "String"
? "final strRes = _env.asDartString(result, "
"deleteOriginal: true);"
: "");
final inst_ =
skel.replaceAll("{STATIC}", "").replaceAll("{THIS}", "_obj");
final static_ =
skel.replaceAll("{STATIC}", "Static").replaceAll("{THIS}", "_cls");
sInst.write(inst_);
sStatic.write(static_);
}
write(methodTemplates);
if (t != "Void") {
write(fieldTemplates);
}
final invokeResultConverter =
(invokeResultConverters[t] ?? (String r) => "return $r");
void writeI(String template) {
final replaced = template
.replaceAll("{TYPE}", t == "String" ? "Object" : t)
.replaceAll("{PTYPE}", t)
.replaceAll("{TARGET_TYPE}", targetTypes[t]!)
.replaceAll("{CLS_REF_DEL}",
t == "Object" || t == "String" ? "" : "env.DeleteLocalRef(cls);")
.replaceAll(
"{STR_REF_DEL}",
t == "String"
? "final strRes = env.asDartString(result, "
"deleteOriginal: true);"
: "")
.replaceAll("{INVOKE_RESULT}", invokeResultConverter("result"));
sInvoke.write(replaced);
}
writeI(invokeTemplates);
if (t != "Void") {
writeI(retrieveTemplates);
}
}
sInst.write("}");
sStatic.write("}");
sInvoke.write("}");
for (final s in [sInst, sStatic, sInvoke]) {
final outputFile = io.File(outPutPaths[s]!);
outputFile.writeAsStringSync(s.toString(), flush: true);
}
io.stderr.write("Running dart format..\n");
io.Process.run("dart", ["format", ...outPutPaths.values]);
}