From 792576aa663c6ca55065ed254bb8402dccff913b Mon Sep 17 00:00:00 2001 From: Natan Date: Wed, 19 Mar 2025 15:26:16 -0300 Subject: [PATCH 1/2] Add enum renaming and fix TestEnumWithinClass javascript native call --- .../xpenatan/jparser/example/app/TestLib.java | 44 ++++++++++++++++++- .../lib/lib-build/src/main/cpp/TestLib.idl | 2 +- .../xpenatan/jparser/cpp/CppCodeParser.java | 4 +- .../github/xpenatan/jparser/idl/IDLEnum.java | 5 ++- .../xpenatan/jparser/idl/IDLEnumItem.java | 21 +++++++++ .../github/xpenatan/jparser/idl/IDLLine.java | 11 ++++- .../idl/parser/IDLDefaultCodeParser.java | 3 +- .../jparser/idl/parser/IDLEnumParser.java | 16 ++++--- .../jparser/teavm/TeaVMCodeParser.java | 13 +++--- 9 files changed, 98 insertions(+), 21 deletions(-) create mode 100644 jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLEnumItem.java diff --git a/example/app/core/src/main/java/com/github/xpenatan/jparser/example/app/TestLib.java b/example/app/core/src/main/java/com/github/xpenatan/jparser/example/app/TestLib.java index e6e20b75..d92efbe9 100644 --- a/example/app/core/src/main/java/com/github/xpenatan/jparser/example/app/TestLib.java +++ b/example/app/core/src/main/java/com/github/xpenatan/jparser/example/app/TestLib.java @@ -5,6 +5,8 @@ import com.github.xpenatan.jparser.example.testlib.DefaultCallbackClass; import com.github.xpenatan.jparser.example.testlib.TestCallbackClass; import com.github.xpenatan.jparser.example.testlib.TestConstructorClass; +import com.github.xpenatan.jparser.example.testlib.TestEnumClassWithinClass; +import com.github.xpenatan.jparser.example.testlib.TestEnumLib; import com.github.xpenatan.jparser.example.testlib.TestMethodClass; import com.github.xpenatan.jparser.example.testlib.TestObjectClass; import com.github.xpenatan.jparser.example.testlib.TestObjectClassArray; @@ -16,7 +18,7 @@ public class TestLib { public static boolean test() { - int eVal = TestEnumWithinClass.e_val; + boolean enumTest = testEnum(); boolean constructorTest = testConstructorClass(); boolean stringConstructorTest = testStringConstructorClass(); boolean attributeTest = testAttributeClass(); @@ -29,6 +31,7 @@ public static boolean test() { boolean namespaceTest = testNamespaceClass(); boolean operatorTest = testOperatorClass(); + System.out.println("enumTest: " + enumTest); System.out.println("constructorTest: " + constructorTest); System.out.println("stringConstructorTest: " + stringConstructorTest); System.out.println("attributeTest: " + attributeTest); @@ -40,11 +43,48 @@ public static boolean test() { System.out.println("namespaceTest: " + namespaceTest); System.out.println("operatorTest: " + operatorTest); - return constructorTest && stringConstructorTest && attributeTest && staticAttributeTest + return enumTest && constructorTest && stringConstructorTest && attributeTest && staticAttributeTest && attributeArrayTest && methodTest && staticMethodTest && callbackTest && callbackTestManual && namespaceTest && operatorTest; } + private static boolean testEnum() { + { + int testEnum = TestEnumClassWithinClass.testEnum; + try { + if(!(testEnum == 35)) { + throw new RuntimeException("testEnum Error: !(testEnum == 35)"); + } + } catch(Throwable e) { + e.printStackTrace(); + return false; + } + } + { + int testDefault = TestEnumLib.TEST_DEFAULT; + try { + if(!(testDefault == 7)) { + throw new RuntimeException("testEnum Error: !(testDefault == 7)"); + } + } catch(Throwable e) { + e.printStackTrace(); + return false; + } + } + { + int eVal = TestEnumWithinClass.e_val_renamed; + try { + if(!(eVal == 34)) { + throw new RuntimeException("testEnum Error: !(eVal == 34)"); + } + } catch(Throwable e) { + e.printStackTrace(); + return false; + } + } + return true; + } + private static boolean testConstructorClass() { { int intValue01 = 40; diff --git a/example/lib/lib-build/src/main/cpp/TestLib.idl b/example/lib/lib-build/src/main/cpp/TestLib.idl index 97f8cd01..c602e85b 100644 --- a/example/lib/lib-build/src/main/cpp/TestLib.idl +++ b/example/lib/lib-build/src/main/cpp/TestLib.idl @@ -233,7 +233,7 @@ interface TestOperatorClass { //[-SUB_PACKAGE=core.op] }; enum TestEnumWithinClass { //[-SUB_PACKAGE=core.enums] - "TestEnumClass::e_val" + "TestEnumClass::e_val" //[-RENAME=e_val_renamed] }; enum TestEnumClassWithinClass { diff --git a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppCodeParser.java b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppCodeParser.java index c037d2c9..c013c12d 100644 --- a/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppCodeParser.java +++ b/jParser/cpp/src/main/java/com/github/xpenatan/jparser/cpp/CppCodeParser.java @@ -19,6 +19,7 @@ import com.github.xpenatan.jparser.idl.IDLAttribute; import com.github.xpenatan.jparser.idl.IDLConstructor; import com.github.xpenatan.jparser.idl.IDLEnum; +import com.github.xpenatan.jparser.idl.IDLEnumItem; import com.github.xpenatan.jparser.idl.IDLFile; import com.github.xpenatan.jparser.idl.IDLHelper; import com.github.xpenatan.jparser.idl.parser.IDLAttributeOperation; @@ -394,7 +395,8 @@ public void onIDLAttributeGenerated(JParser jParser, IDLAttribute idlAttribute, } @Override - public void onIDLEnumMethodGenerated(JParser jParser, IDLEnum idlEnum, ClassOrInterfaceDeclaration classDeclaration, String enumStr, FieldDeclaration fieldDeclaration, MethodDeclaration nativeMethodDeclaration) { + public void onIDLEnumMethodGenerated(JParser jParser, IDLEnum idlEnum, ClassOrInterfaceDeclaration classDeclaration, IDLEnumItem enumItem, FieldDeclaration fieldDeclaration, MethodDeclaration nativeMethodDeclaration) { + String enumStr = enumItem.name; String content = ""; content = ENUM_GET_INT_TEMPLATE.replace(TEMPLATE_TAG_ENUM, enumStr); String header = "[-" + HEADER_CMD + ";" + CMD_NATIVE + "]"; diff --git a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLEnum.java b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLEnum.java index 171fea74..829cf2e9 100644 --- a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLEnum.java +++ b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLEnum.java @@ -8,7 +8,7 @@ public class IDLEnum extends IDLClassOrEnum { public final IDLFile idlFile; - public final ArrayList enums = new ArrayList<>(); + public final ArrayList enums = new ArrayList<>(); public ArrayList settings = new ArrayList<>(); public boolean isNameSpace; @@ -51,7 +51,8 @@ private void setupEnumValues() { if(typePrefix.isEmpty() && enumLine.contains("::")) { typePrefix = enumLine.split("::")[0]; } - enums.add(enumLine); + IDLEnumItem item = new IDLEnumItem(this, enumLine, idlLine); + enums.add(item); } } } diff --git a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLEnumItem.java b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLEnumItem.java new file mode 100644 index 00000000..8afe560e --- /dev/null +++ b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLEnumItem.java @@ -0,0 +1,21 @@ +package com.github.xpenatan.jparser.idl; + +public class IDLEnumItem { + public IDLEnum idlEnum; + public String name; + public IDLLine idlLine; + + public IDLEnumItem(IDLEnum idlEnum, String name, IDLLine idlLine) { + this.idlEnum = idlEnum; + this.name = name; + this.idlLine = idlLine; + } + + public String getRenamedName() { + if(idlLine.containsCommand(IDLLine.CMD_RENAME)) { + String commandValue = idlLine.getCommandValue(IDLLine.CMD_RENAME); + return commandValue; + } + return null; + } +} \ No newline at end of file diff --git a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLLine.java b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLLine.java index a6694760..010e2e57 100644 --- a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLLine.java +++ b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/IDLLine.java @@ -7,6 +7,7 @@ public class IDLLine { public static final String CMD_MEM_OWN = "MEM_OWN"; public static final String CMD_NOT_MEM_OWN = "NOT_MEM_OWN"; public static final String CMD_SUB_PACKAGE = "SUB_PACKAGE"; + public static final String CMD_RENAME = "RENAME"; public final String line; public final String comment; @@ -39,6 +40,14 @@ public IDLLine copy() { } public boolean containsCommand(String command) { + return containsCommand(commands, command); + } + + public String getCommandValue(String command) { + return getCommandValue(commands, command); + } + + public static boolean containsCommand(ArrayList commands, String command) { for(int i = 0; i < commands.size(); i++) { String cmd = commands.get(i); if(cmd.startsWith(command)) { @@ -48,7 +57,7 @@ public boolean containsCommand(String command) { return false; } - public String getCommandValue(String command) { + public static String getCommandValue(ArrayList commands, String command) { for(int i = 0; i < commands.size(); i++) { String cmd = commands.get(i); if(cmd.startsWith(command)) { diff --git a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/parser/IDLDefaultCodeParser.java b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/parser/IDLDefaultCodeParser.java index 7efab6be..c8a52ce4 100644 --- a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/parser/IDLDefaultCodeParser.java +++ b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/parser/IDLDefaultCodeParser.java @@ -20,6 +20,7 @@ import com.github.xpenatan.jparser.idl.IDLClass; import com.github.xpenatan.jparser.idl.IDLConstructor; import com.github.xpenatan.jparser.idl.IDLEnum; +import com.github.xpenatan.jparser.idl.IDLEnumItem; import com.github.xpenatan.jparser.idl.IDLMethod; import com.github.xpenatan.jparser.idl.IDLReader; import java.util.ArrayList; @@ -163,7 +164,7 @@ public void onIDLMethodGenerated(JParser jParser, IDLMethod idlMethod, ClassOrIn public void onIDLAttributeGenerated(JParser jParser, IDLAttribute idlAttribute, boolean isSet, ClassOrInterfaceDeclaration classDeclaration, MethodDeclaration methodDeclaration, MethodDeclaration nativeMethodDeclaration) { } - public void onIDLEnumMethodGenerated(JParser jParser, IDLEnum idlEnum, ClassOrInterfaceDeclaration classDeclaration, String enumStr, FieldDeclaration fieldDeclaration, MethodDeclaration nativeMethodDeclaration) { + public void onIDLEnumMethodGenerated(JParser jParser, IDLEnum idlEnum, ClassOrInterfaceDeclaration classDeclaration, IDLEnumItem enumItem, FieldDeclaration fieldDeclaration, MethodDeclaration nativeMethodDeclaration) { } public void onIDLCallbackGenerated(JParser jParser, IDLClass idlClass, ClassOrInterfaceDeclaration classDeclaration, MethodDeclaration callbackDeclaration, ArrayList>> methods) { diff --git a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/parser/IDLEnumParser.java b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/parser/IDLEnumParser.java index 4f2097bb..5cdbb455 100644 --- a/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/parser/IDLEnumParser.java +++ b/jParser/idl/src/main/java/com/github/xpenatan/jparser/idl/parser/IDLEnumParser.java @@ -10,18 +10,19 @@ import com.github.javaparser.ast.type.Type; import com.github.xpenatan.jparser.core.JParser; import com.github.xpenatan.jparser.idl.IDLEnum; +import com.github.xpenatan.jparser.idl.IDLEnumItem; import java.util.Optional; public class IDLEnumParser { public static void generateEnum(IDLDefaultCodeParser idlParser, JParser jParser, CompilationUnit unit, ClassOrInterfaceDeclaration classDeclaration, IDLEnum idlEnum) { - for(String anEnum : idlEnum.enums) { - generateField(idlParser, jParser, idlEnum, unit, classDeclaration, anEnum); + for(IDLEnumItem enumItem : idlEnum.enums) { + generateField(idlParser, jParser, idlEnum, unit, classDeclaration, enumItem); } } - private static void generateField(IDLDefaultCodeParser idlParser, JParser jParser, IDLEnum idlEnum, CompilationUnit unit, ClassOrInterfaceDeclaration classDeclaration, String enumStr) { - String enumVar = enumStr; + private static void generateField(IDLDefaultCodeParser idlParser, JParser jParser, IDLEnum idlEnum, CompilationUnit unit, ClassOrInterfaceDeclaration classDeclaration, IDLEnumItem enumItem) { + String enumVar = enumItem.name; if(enumVar.contains("::")) { enumVar = enumVar.split("::")[1]; } @@ -34,6 +35,11 @@ private static void generateField(IDLDefaultCodeParser idlParser, JParser jParse String nativeMethodName = enumVar + "_NATIVE"; expression.setName(nativeMethodName); + + String name = enumItem.getRenamedName(); + if(name != null) { + enumVar = name; + } FieldDeclaration fieldDeclaration = classDeclaration.addFieldWithInitializer(intType, enumVar, expression, Modifier.Keyword.PUBLIC, Modifier.Keyword.STATIC, Modifier.Keyword.FINAL); MethodDeclaration nativeMethod = new MethodDeclaration(); @@ -42,7 +48,7 @@ private static void generateField(IDLDefaultCodeParser idlParser, JParser jParse nativeMethod.removeBody(); nativeMethod.setType(intType); classDeclaration.getMembers().add(nativeMethod); - idlParser.onIDLEnumMethodGenerated(jParser, idlEnum, classDeclaration, enumStr, fieldDeclaration, nativeMethod); + idlParser.onIDLEnumMethodGenerated(jParser, idlEnum, classDeclaration, enumItem, fieldDeclaration, nativeMethod); } } } \ No newline at end of file diff --git a/jParser/teavm/src/main/java/com/github/xpenatan/jparser/teavm/TeaVMCodeParser.java b/jParser/teavm/src/main/java/com/github/xpenatan/jparser/teavm/TeaVMCodeParser.java index 01249919..9afa3023 100644 --- a/jParser/teavm/src/main/java/com/github/xpenatan/jparser/teavm/TeaVMCodeParser.java +++ b/jParser/teavm/src/main/java/com/github/xpenatan/jparser/teavm/TeaVMCodeParser.java @@ -42,6 +42,7 @@ import com.github.xpenatan.jparser.idl.IDLClass; import com.github.xpenatan.jparser.idl.IDLConstructor; import com.github.xpenatan.jparser.idl.IDLEnum; +import com.github.xpenatan.jparser.idl.IDLEnumItem; import com.github.xpenatan.jparser.idl.IDLFile; import com.github.xpenatan.jparser.idl.IDLMethod; import com.github.xpenatan.jparser.idl.IDLParameter; @@ -560,7 +561,8 @@ public void onIDLAttributeGenerated(JParser jParser, IDLAttribute idlAttribute, } @Override - public void onIDLEnumMethodGenerated(JParser jParser, IDLEnum idlEnum, ClassOrInterfaceDeclaration classDeclaration, String enumStr, FieldDeclaration fieldDeclaration, MethodDeclaration nativeMethodDeclaration) { + public void onIDLEnumMethodGenerated(JParser jParser, IDLEnum idlEnum, ClassOrInterfaceDeclaration classDeclaration, IDLEnumItem enumItem, FieldDeclaration fieldDeclaration, MethodDeclaration nativeMethodDeclaration) { + String enumStr = enumItem.name; String content = ""; if(enumStr.contains("::")) { String[] split = enumStr.split("::"); @@ -571,13 +573,8 @@ public void onIDLEnumMethodGenerated(JParser jParser, IDLEnum idlEnum, ClassOrIn enumStr = rightName; } else { - if(leftName.equals(idlEnum.name)) { - // enum class cannot have child class name - enumStr = rightName; - } - else { - enumStr = enumStr.replace("::", "."); - } + // enum class cannot have child class name + enumStr = rightName; } } content = ENUM_GET_INT_TEMPLATE.replace(TEMPLATE_TAG_ENUM, enumStr).replace(TEMPLATE_TAG_MODULE, module); From d88f8568ec08d0c0494103c299735e5019b83e09 Mon Sep 17 00:00:00 2001 From: Natan Date: Thu, 20 Mar 2025 07:41:26 -0300 Subject: [PATCH 2/2] Bump version to 1.0.0-b7 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 761b652c..7b4cec1b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ android.useAndroidX=true -version=1.0.0-b6 \ No newline at end of file +version=1.0.0-b7 \ No newline at end of file