diff --git a/example/example-build/src/main/java/com/github/xpenatan/jparser/example/Main.java b/example/example-build/src/main/java/com/github/xpenatan/jparser/example/Main.java index 4896666..db8b427 100644 --- a/example/example-build/src/main/java/com/github/xpenatan/jparser/example/Main.java +++ b/example/example-build/src/main/java/com/github/xpenatan/jparser/example/Main.java @@ -1,12 +1,11 @@ package com.github.xpenatan.jparser.example; import com.github.xpenatan.jparser.core.JParser; -import com.github.xpenatan.jparser.core.codeparser.IDLDefaultCodeParser; +import com.github.xpenatan.jparser.core.codeparser.idl.IDLDefaultCodeParser; import com.github.xpenatan.jparser.cpp.CPPBuildHelper; import com.github.xpenatan.jparser.cpp.CppCodeParser; import com.github.xpenatan.jparser.cpp.CppGenerator; import com.github.xpenatan.jparser.cpp.FileCopyHelper; -import com.github.xpenatan.jparser.cpp.NativeCPPGenerator; import com.github.xpenatan.jparser.cpp.NativeCPPGeneratorV2; import com.github.xpenatan.jparser.idl.IDLReader; import java.io.File; diff --git a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/DefaultCodeParser.java b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/DefaultCodeParser.java index 70273c8..750e9ab 100644 --- a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/DefaultCodeParser.java +++ b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/DefaultCodeParser.java @@ -22,8 +22,8 @@ */ public abstract class DefaultCodeParser implements CodeParser { - static final String CMD_HEADER_START = "[-"; - static final String CMD_HEADER_END = "]"; + public static final String CMD_HEADER_START = "[-"; + public static final String CMD_HEADER_END = "]"; public static final String CMD_ADD = "-ADD"; public static final String CMD_ADD_RAW = "-ADD_RAW"; public static final String CMD_REMOVE = "-REMOVE"; diff --git a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/IDLDefaultCodeParser.java b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/IDLDefaultCodeParser.java deleted file mode 100644 index 8930a10..0000000 --- a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/IDLDefaultCodeParser.java +++ /dev/null @@ -1,284 +0,0 @@ -package com.github.xpenatan.jparser.core.codeparser; - -import com.github.javaparser.StaticJavaParser; -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.Modifier.Keyword; -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; -import com.github.javaparser.ast.body.MethodDeclaration; -import com.github.javaparser.ast.body.Parameter; -import com.github.javaparser.ast.comments.BlockComment; -import com.github.javaparser.ast.comments.Comment; -import com.github.javaparser.ast.expr.NameExpr; -import com.github.javaparser.ast.expr.SimpleName; -import com.github.javaparser.ast.stmt.BlockStmt; -import com.github.javaparser.ast.stmt.ReturnStmt; -import com.github.javaparser.ast.type.Type; -import com.github.xpenatan.jparser.core.JParser; -import com.github.xpenatan.jparser.core.JParserHelper; -import com.github.xpenatan.jparser.core.JParserItem; -import com.github.xpenatan.jparser.idl.IDLAttribute; -import com.github.xpenatan.jparser.idl.IDLClass; -import com.github.xpenatan.jparser.idl.IDLMethod; -import com.github.xpenatan.jparser.idl.IDLParameter; -import com.github.xpenatan.jparser.idl.IDLReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -/** - * @author xpenatan - */ -public class IDLDefaultCodeParser extends IDLClassGeneratorParser { - - public static final String CMD_IDL_SKIP = "-IDL_SKIP"; - - protected boolean enableAttributeParsing = true; - - public IDLDefaultCodeParser(String headerCMD, IDLReader idlReader) { - super("", headerCMD, idlReader); - } - - public IDLDefaultCodeParser(String basePackage, String headerCMD, IDLReader idlReader) { - super(basePackage, headerCMD, idlReader); - } - - @Override - protected void setJavaBodyNativeCMD(String content, MethodDeclaration methodDeclaration) { - } - - @Override - protected boolean shouldRemoveCommentBlock(String headerCommands) { - if(super.shouldRemoveCommentBlock(headerCommands)) { - if(headerCommands.contains(CMD_IDL_SKIP)) { - return false; - } - return true; - } - return false; - } - - @Override - public void onParseClassStart(JParser jParser, CompilationUnit unit, ClassOrInterfaceDeclaration classOrInterfaceDeclaration) { - if(idlReader != null) { - SimpleName name = classOrInterfaceDeclaration.getName(); - String nameStr = name.asString(); - IDLClass idlClass = idlReader.getClass(nameStr); - if(idlClass != null) { - ArrayList methods = idlClass.methods; - for(int i = 0; i < methods.size(); i++) { - IDLMethod idlMethod = methods.get(i); - generateMethods(jParser, unit, classOrInterfaceDeclaration, idlClass, idlMethod); - } - if(enableAttributeParsing) { - ArrayList attributes = idlClass.attributes; - for(int i = 0; i < attributes.size(); i++) { - IDLAttribute idlAttribute = attributes.get(i); - generateAttribute(jParser, unit, classOrInterfaceDeclaration, idlClass, idlAttribute); - } - } - } - } - } - - /** - * true to accept the idl method - */ - public boolean filterIDLMethod(IDLClass idlClass, IDLMethod idlMethod) { - return true; - } - - private void generateAttribute(JParser jParser, CompilationUnit unit, ClassOrInterfaceDeclaration classOrInterfaceDeclaration, IDLClass idlClass, IDLAttribute idlAttribute) { - if(idlAttribute.skip) { - return; - } - - String attributeName = idlAttribute.name; - String attributeType = idlAttribute.type; - - Type type = null; - try { - type = StaticJavaParser.parseType(attributeType); - } - catch(Exception e) { - e.printStackTrace(); - return; - } - - JParserItem parserUnitItem = jParser.getParserUnitItem(type.toString()); - if(parserUnitItem != null) { - if(parserUnitItem.notAllowed) { - // skip generating set/get for class that is not allowed to have get and set. Ex Enum - return; - } - } - - boolean addGet = true; - boolean addSet = true; - MethodDeclaration getMethodDeclaration = null; - List getMethods = classOrInterfaceDeclaration.getMethodsBySignature(attributeName); - if(getMethods.size() > 0) { - getMethodDeclaration = getMethods.get(0); - Optional optionalComment = getMethodDeclaration.getComment(); - if(optionalComment.isPresent()) { - Comment comment = optionalComment.get(); - if(comment instanceof BlockComment) { - BlockComment blockComment = (BlockComment)optionalComment.get(); - String headerCommands = CodeParserItem.obtainHeaderCommands(blockComment); - // Skip if method already exist with header code - if(headerCommands != null && headerCommands.startsWith(CMD_HEADER_START + headerCMD)) { - addGet = false; - } - } - } - } - MethodDeclaration setMethodDeclaration = null; - List setMethods = classOrInterfaceDeclaration.getMethodsBySignature(attributeName, attributeType); - if(setMethods.size() > 0) { - setMethodDeclaration = setMethods.get(0); - Optional optionalComment = setMethodDeclaration.getComment(); - if(optionalComment.isPresent()) { - Comment comment = optionalComment.get(); - if(comment instanceof BlockComment) { - BlockComment blockComment = (BlockComment)optionalComment.get(); - String headerCommands = CodeParserItem.obtainHeaderCommands(blockComment); - // Skip if method already exist with header code - if(headerCommands != null && headerCommands.startsWith(CMD_HEADER_START + headerCMD)) { - addSet = false; - } - } - } - } - if(addGet) { - if(getMethodDeclaration != null) { - getMethodDeclaration.remove(); - } - getMethodDeclaration = classOrInterfaceDeclaration.addMethod(attributeName, Keyword.PUBLIC); - getMethodDeclaration.setType(type); - JParserHelper.addMissingImportType(jParser, unit, type); - setDefaultReturnValues(jParser, unit, type, getMethodDeclaration); - onIDLMethodGenerated(jParser, idlClass, null, unit, classOrInterfaceDeclaration, getMethodDeclaration, true); - } - if(addSet) { - if(setMethodDeclaration != null) { - setMethodDeclaration.remove(); - } - setMethodDeclaration = classOrInterfaceDeclaration.addMethod(attributeName, Keyword.PUBLIC); - setMethodDeclaration.setStatic(idlAttribute.isStatic); - Parameter parameter = setMethodDeclaration.addAndGetParameter(type, attributeName); - Type paramType = parameter.getType(); - JParserHelper.addMissingImportType(jParser, unit, paramType); - onIDLMethodGenerated(jParser, idlClass, null, unit, classOrInterfaceDeclaration, setMethodDeclaration, true); - } - } - - private void generateMethods(JParser jParser, CompilationUnit unit, ClassOrInterfaceDeclaration classOrInterfaceDeclaration, IDLClass idlClass, IDLMethod idlMethod) { - if(idlMethod.skip) { - return; - } - - String methodName = idlMethod.name; - - MethodDeclaration containsMethod = containsMethod(classOrInterfaceDeclaration, idlMethod); - if(containsMethod != null) { - boolean isNative = containsMethod.isNative(); - boolean isStatic = containsMethod.isStatic(); - boolean containsBlockComment = false; - Optional optionalComment = containsMethod.getComment(); - if(optionalComment.isPresent()) { - Comment comment = optionalComment.get(); - if(comment instanceof BlockComment) { - BlockComment blockComment = (BlockComment)optionalComment.get(); - String headerCommands = CodeParserItem.obtainHeaderCommands(blockComment); - // Skip if method already exist with header code - if(headerCommands != null) { - if(headerCommands.contains(CMD_NATIVE)) { - return; - } - else { - if(headerCommands.contains(CMD_IDL_SKIP)) { - //If skip is found then remove the method - containsMethod.remove(); - } - return; - } - } - } - } - if(isNative) { - // It's a dummy method. Remove it and let IDL generate it again - containsMethod.remove(); - } - if(!isNative && !isStatic) { - // if a simple method exist, keep it and don't let IDL generate the method. - return; - } - } - - if(!filterIDLMethod(idlClass, idlMethod)) { - return; - } - - ArrayList parameters = idlMethod.parameters; - MethodDeclaration methodDeclaration = classOrInterfaceDeclaration.addMethod(methodName, Keyword.PUBLIC); - methodDeclaration.setStatic(idlMethod.isStaticMethod); - for(int i = 0; i < parameters.size(); i++) { - IDLParameter idlParameter = parameters.get(i); - String paramType = idlParameter.type; - String paramName = idlParameter.name; - Parameter parameter = methodDeclaration.addAndGetParameter(paramType, paramName); - Type type = parameter.getType(); - JParserHelper.addMissingImportType(jParser, unit, type); - } - - Type returnType = StaticJavaParser.parseType(idlMethod.returnType); - methodDeclaration.setType(returnType); - setDefaultReturnValues(jParser, unit, returnType, methodDeclaration); - onIDLMethodGenerated(jParser, idlClass, idlMethod, unit, classOrInterfaceDeclaration, methodDeclaration, false); - } - - private void setDefaultReturnValues(JParser jParser, CompilationUnit unit, Type returnType, MethodDeclaration idlMethodDeclaration) { - if(!returnType.isVoidType()) { - BlockStmt blockStmt = idlMethodDeclaration.getBody().get(); - ReturnStmt returnStmt = new ReturnStmt(); - if(returnType.isPrimitiveType()) { - if(JParserHelper.isLong(returnType) || JParserHelper.isInt(returnType) || JParserHelper.isFloat(returnType) || JParserHelper.isDouble(returnType)) { - NameExpr returnNameExpr = new NameExpr(); - returnNameExpr.setName("0"); - returnStmt.setExpression(returnNameExpr); - } - else if(JParserHelper.isBoolean(returnType)) { - NameExpr returnNameExpr = new NameExpr(); - returnNameExpr.setName("false"); - returnStmt.setExpression(returnNameExpr); - } - } - else { - JParserHelper.addMissingImportType(jParser, unit, returnType); - NameExpr returnNameExpr = new NameExpr(); - returnNameExpr.setName("null"); - returnStmt.setExpression(returnNameExpr); - } - blockStmt.addStatement(returnStmt); - } - } - - protected void onIDLMethodGenerated(JParser jParser, IDLClass idlClass, IDLMethod idlMethod, CompilationUnit unit, ClassOrInterfaceDeclaration classDeclaration, MethodDeclaration idlMethodDeclaration, boolean isAttribute) { - } - - private MethodDeclaration containsMethod(ClassOrInterfaceDeclaration classOrInterfaceDeclaration, IDLMethod idlMethod) { - ArrayList parameters = idlMethod.parameters; - String[] paramTypes = new String[parameters.size()]; - - for(int i = 0; i < parameters.size(); i++) { - IDLParameter parameter = parameters.get(i); - String paramType = parameter.type; - paramTypes[i] = paramType; - } - List methods = classOrInterfaceDeclaration.getMethodsBySignature(idlMethod.name, paramTypes); - - if(methods.size() > 0) { - return methods.get(0); - } - return null; - } -} \ No newline at end of file diff --git a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLAttributeParser.java b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLAttributeParser.java new file mode 100644 index 0000000..61c33df --- /dev/null +++ b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLAttributeParser.java @@ -0,0 +1,107 @@ +package com.github.xpenatan.jparser.core.codeparser.idl; + +import com.github.javaparser.StaticJavaParser; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.Modifier; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.body.Parameter; +import com.github.javaparser.ast.comments.BlockComment; +import com.github.javaparser.ast.comments.Comment; +import com.github.javaparser.ast.type.Type; +import com.github.xpenatan.jparser.core.JParser; +import com.github.xpenatan.jparser.core.JParserHelper; +import com.github.xpenatan.jparser.core.JParserItem; +import com.github.xpenatan.jparser.core.codeparser.CodeParserItem; +import com.github.xpenatan.jparser.core.codeparser.DefaultCodeParser; +import com.github.xpenatan.jparser.idl.IDLAttribute; +import com.github.xpenatan.jparser.idl.IDLClass; +import java.util.List; +import java.util.Optional; + +public class IDLAttributeParser { + + public static void generateAttribute(IDLDefaultCodeParser idlParser, JParser jParser, CompilationUnit unit, ClassOrInterfaceDeclaration classOrInterfaceDeclaration, IDLClass idlClass, IDLAttribute idlAttribute) { + if(idlAttribute.skip) { + return; + } + + String attributeName = idlAttribute.name; + String attributeType = idlAttribute.type; + + Type type = null; + try { + type = StaticJavaParser.parseType(attributeType); + } + catch(Exception e) { + e.printStackTrace(); + return; + } + + JParserItem parserUnitItem = jParser.getParserUnitItem(type.toString()); + if(parserUnitItem != null) { + if(parserUnitItem.notAllowed) { + // skip generating set/get for class that is not allowed to have get and set. Ex Enum + return; + } + } + + boolean addGet = true; + boolean addSet = true; + MethodDeclaration getMethodDeclaration = null; + List getMethods = classOrInterfaceDeclaration.getMethodsBySignature(attributeName); + if(getMethods.size() > 0) { + getMethodDeclaration = getMethods.get(0); + Optional optionalComment = getMethodDeclaration.getComment(); + if(optionalComment.isPresent()) { + Comment comment = optionalComment.get(); + if(comment instanceof BlockComment) { + BlockComment blockComment = (BlockComment)optionalComment.get(); + String headerCommands = CodeParserItem.obtainHeaderCommands(blockComment); + // Skip if method already exist with header code + if(headerCommands != null && headerCommands.startsWith(DefaultCodeParser.CMD_HEADER_START + idlParser.headerCMD)) { + addGet = false; + } + } + } + } + MethodDeclaration setMethodDeclaration = null; + List setMethods = classOrInterfaceDeclaration.getMethodsBySignature(attributeName, attributeType); + if(setMethods.size() > 0) { + setMethodDeclaration = setMethods.get(0); + Optional optionalComment = setMethodDeclaration.getComment(); + if(optionalComment.isPresent()) { + Comment comment = optionalComment.get(); + if(comment instanceof BlockComment) { + BlockComment blockComment = (BlockComment)optionalComment.get(); + String headerCommands = CodeParserItem.obtainHeaderCommands(blockComment); + // Skip if method already exist with header code + if(headerCommands != null && headerCommands.startsWith(DefaultCodeParser.CMD_HEADER_START + idlParser.headerCMD)) { + addSet = false; + } + } + } + } + if(addGet) { + if(getMethodDeclaration != null) { + getMethodDeclaration.remove(); + } + getMethodDeclaration = classOrInterfaceDeclaration.addMethod(attributeName, Modifier.Keyword.PUBLIC); + getMethodDeclaration.setType(type); + JParserHelper.addMissingImportType(jParser, unit, type); + IDLDefaultCodeParser.setDefaultReturnValues(jParser, unit, type, getMethodDeclaration); + idlParser.onIDLMethodGenerated(jParser, idlClass, null, unit, classOrInterfaceDeclaration, getMethodDeclaration, true); + } + if(addSet) { + if(setMethodDeclaration != null) { + setMethodDeclaration.remove(); + } + setMethodDeclaration = classOrInterfaceDeclaration.addMethod(attributeName, Modifier.Keyword.PUBLIC); + setMethodDeclaration.setStatic(idlAttribute.isStatic); + Parameter parameter = setMethodDeclaration.addAndGetParameter(type, attributeName); + Type paramType = parameter.getType(); + JParserHelper.addMissingImportType(jParser, unit, paramType); + idlParser.onIDLMethodGenerated(jParser, idlClass, null, unit, classOrInterfaceDeclaration, setMethodDeclaration, true); + } + } +} diff --git a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/IDLClassGeneratorParser.java b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLClassGeneratorParser.java similarity index 97% rename from jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/IDLClassGeneratorParser.java rename to jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLClassGeneratorParser.java index f34df3b..3898df0 100644 --- a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/IDLClassGeneratorParser.java +++ b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLClassGeneratorParser.java @@ -1,4 +1,4 @@ -package com.github.xpenatan.jparser.core.codeparser; +package com.github.xpenatan.jparser.core.codeparser.idl; import com.github.javaparser.StaticJavaParser; import com.github.javaparser.ast.CompilationUnit; @@ -6,6 +6,7 @@ import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.xpenatan.jparser.core.JParser; import com.github.xpenatan.jparser.core.JParserItem; +import com.github.xpenatan.jparser.core.codeparser.DefaultCodeParser; import com.github.xpenatan.jparser.core.util.CustomFileDescriptor; import com.github.xpenatan.jparser.idl.IDLClass; import com.github.xpenatan.jparser.idl.IDLFile; diff --git a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLConstructorParser.java b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLConstructorParser.java new file mode 100644 index 0000000..359b5e2 --- /dev/null +++ b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLConstructorParser.java @@ -0,0 +1,15 @@ +package com.github.xpenatan.jparser.core.codeparser.idl; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.xpenatan.jparser.core.JParser; +import com.github.xpenatan.jparser.idl.IDLClass; +import com.github.xpenatan.jparser.idl.IDLConstructor; + +public class IDLConstructorParser { + + public static void generateConstructor(IDLDefaultCodeParser idlParser, JParser jParser, CompilationUnit unit, ClassOrInterfaceDeclaration classOrInterfaceDeclaration, IDLClass idlClass, IDLConstructor idlConstructor) { + // TODO + + } +} diff --git a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLDefaultCodeParser.java b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLDefaultCodeParser.java new file mode 100644 index 0000000..9e61d61 --- /dev/null +++ b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLDefaultCodeParser.java @@ -0,0 +1,110 @@ +package com.github.xpenatan.jparser.core.codeparser.idl; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.expr.NameExpr; +import com.github.javaparser.ast.expr.SimpleName; +import com.github.javaparser.ast.stmt.BlockStmt; +import com.github.javaparser.ast.stmt.ReturnStmt; +import com.github.javaparser.ast.type.Type; +import com.github.xpenatan.jparser.core.JParser; +import com.github.xpenatan.jparser.core.JParserHelper; +import com.github.xpenatan.jparser.idl.IDLAttribute; +import com.github.xpenatan.jparser.idl.IDLClass; +import com.github.xpenatan.jparser.idl.IDLConstructor; +import com.github.xpenatan.jparser.idl.IDLMethod; +import com.github.xpenatan.jparser.idl.IDLReader; +import java.util.ArrayList; + +/** + * @author xpenatan + */ +public class IDLDefaultCodeParser extends IDLClassGeneratorParser { + + public static final String CMD_IDL_SKIP = "-IDL_SKIP"; + + protected boolean enableAttributeParsing = true; + + public IDLDefaultCodeParser(String headerCMD, IDLReader idlReader) { + super("", headerCMD, idlReader); + } + + public IDLDefaultCodeParser(String basePackage, String headerCMD, IDLReader idlReader) { + super(basePackage, headerCMD, idlReader); + } + + @Override + protected void setJavaBodyNativeCMD(String content, MethodDeclaration methodDeclaration) { + } + + @Override + protected boolean shouldRemoveCommentBlock(String headerCommands) { + if(super.shouldRemoveCommentBlock(headerCommands)) { + if(headerCommands.contains(CMD_IDL_SKIP)) { + return false; + } + return true; + } + return false; + } + + @Override + public void onParseClassStart(JParser jParser, CompilationUnit unit, ClassOrInterfaceDeclaration classOrInterfaceDeclaration) { + if(idlReader != null) { + SimpleName name = classOrInterfaceDeclaration.getName(); + String nameStr = name.asString(); + IDLClass idlClass = idlReader.getClass(nameStr); + if(idlClass != null) { + ArrayList constructors = idlClass.constructors; + for(int i = 0; i < constructors.size(); i++) { + IDLConstructor idlConstructor = constructors.get(i); + IDLConstructorParser.generateConstructor(this, jParser, unit, classOrInterfaceDeclaration, idlClass, idlConstructor); + } + + ArrayList methods = idlClass.methods; + for(int i = 0; i < methods.size(); i++) { + IDLMethod idlMethod = methods.get(i); + IDLMethodParser.generateMethods(this, jParser, unit, classOrInterfaceDeclaration, idlClass, idlMethod); + } + if(enableAttributeParsing) { + ArrayList attributes = idlClass.attributes; + for(int i = 0; i < attributes.size(); i++) { + IDLAttribute idlAttribute = attributes.get(i); + IDLAttributeParser.generateAttribute(this, jParser, unit, classOrInterfaceDeclaration, idlClass, idlAttribute); + } + } + } + } + } + + public static void setDefaultReturnValues(JParser jParser, CompilationUnit unit, Type returnType, MethodDeclaration idlMethodDeclaration) { + if(!returnType.isVoidType()) { + BlockStmt blockStmt = idlMethodDeclaration.getBody().get(); + ReturnStmt returnStmt = new ReturnStmt(); + if(returnType.isPrimitiveType()) { + if(JParserHelper.isLong(returnType) || JParserHelper.isInt(returnType) || JParserHelper.isFloat(returnType) || JParserHelper.isDouble(returnType)) { + NameExpr returnNameExpr = new NameExpr(); + returnNameExpr.setName("0"); + returnStmt.setExpression(returnNameExpr); + } + else if(JParserHelper.isBoolean(returnType)) { + NameExpr returnNameExpr = new NameExpr(); + returnNameExpr.setName("false"); + returnStmt.setExpression(returnNameExpr); + } + } + else { + JParserHelper.addMissingImportType(jParser, unit, returnType); + NameExpr returnNameExpr = new NameExpr(); + returnNameExpr.setName("null"); + returnStmt.setExpression(returnNameExpr); + } + blockStmt.addStatement(returnStmt); + } + } + + public void onIDLMethodGenerated(JParser jParser, IDLClass idlClass, IDLMethod idlMethod, CompilationUnit unit, ClassOrInterfaceDeclaration classDeclaration, MethodDeclaration idlMethodDeclaration, boolean isAttribute) { + } + +} \ No newline at end of file diff --git a/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLMethodParser.java b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLMethodParser.java new file mode 100644 index 0000000..3e4e2c1 --- /dev/null +++ b/jParser/core/src/main/java/com/github/xpenatan/jparser/core/codeparser/idl/IDLMethodParser.java @@ -0,0 +1,103 @@ +package com.github.xpenatan.jparser.core.codeparser.idl; + +import com.github.javaparser.StaticJavaParser; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.Modifier; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.body.Parameter; +import com.github.javaparser.ast.comments.BlockComment; +import com.github.javaparser.ast.comments.Comment; +import com.github.javaparser.ast.type.Type; +import com.github.xpenatan.jparser.core.JParser; +import com.github.xpenatan.jparser.core.JParserHelper; +import com.github.xpenatan.jparser.core.codeparser.CodeParserItem; +import com.github.xpenatan.jparser.core.codeparser.DefaultCodeParser; +import com.github.xpenatan.jparser.idl.IDLClass; +import com.github.xpenatan.jparser.idl.IDLMethod; +import com.github.xpenatan.jparser.idl.IDLParameter; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class IDLMethodParser { + + public static void generateMethods(IDLDefaultCodeParser idlParser, JParser jParser, CompilationUnit unit, ClassOrInterfaceDeclaration classOrInterfaceDeclaration, IDLClass idlClass, IDLMethod idlMethod) { + if(idlMethod.skip) { + return; + } + + String methodName = idlMethod.name; + + MethodDeclaration containsMethod = containsMethod(classOrInterfaceDeclaration, idlMethod); + if(containsMethod != null) { + boolean isNative = containsMethod.isNative(); + boolean isStatic = containsMethod.isStatic(); + boolean containsBlockComment = false; + Optional optionalComment = containsMethod.getComment(); + if(optionalComment.isPresent()) { + Comment comment = optionalComment.get(); + if(comment instanceof BlockComment) { + BlockComment blockComment = (BlockComment)optionalComment.get(); + String headerCommands = CodeParserItem.obtainHeaderCommands(blockComment); + // Skip if method already exist with header code + if(headerCommands != null) { + if(headerCommands.contains(DefaultCodeParser.CMD_NATIVE)) { + return; + } + else { + if(headerCommands.contains(IDLDefaultCodeParser.CMD_IDL_SKIP)) { + //If skip is found then remove the method + containsMethod.remove(); + } + return; + } + } + } + } + if(isNative) { + // It's a dummy method. Remove it and let IDL generate it again + containsMethod.remove(); + } + if(!isNative && !isStatic) { + // if a simple method exist, keep it and don't let IDL generate the method. + return; + } + } + + ArrayList parameters = idlMethod.parameters; + MethodDeclaration methodDeclaration = classOrInterfaceDeclaration.addMethod(methodName, Modifier.Keyword.PUBLIC); + methodDeclaration.setStatic(idlMethod.isStaticMethod); + for(int i = 0; i < parameters.size(); i++) { + IDLParameter idlParameter = parameters.get(i); + String paramType = idlParameter.type; + String paramName = idlParameter.name; + Parameter parameter = methodDeclaration.addAndGetParameter(paramType, paramName); + Type type = parameter.getType(); + JParserHelper.addMissingImportType(jParser, unit, type); + } + + Type returnType = StaticJavaParser.parseType(idlMethod.returnType); + methodDeclaration.setType(returnType); + IDLDefaultCodeParser.setDefaultReturnValues(jParser, unit, returnType, methodDeclaration); + idlParser.onIDLMethodGenerated(jParser, idlClass, idlMethod, unit, classOrInterfaceDeclaration, methodDeclaration, false); + } + + private static MethodDeclaration containsMethod(ClassOrInterfaceDeclaration classOrInterfaceDeclaration, IDLMethod idlMethod) { + ArrayList parameters = idlMethod.parameters; + String[] paramTypes = new String[parameters.size()]; + + for(int i = 0; i < parameters.size(); i++) { + IDLParameter parameter = parameters.get(i); + String paramType = parameter.type; + paramTypes[i] = paramType; + } + List methods = classOrInterfaceDeclaration.getMethodsBySignature(idlMethod.name, paramTypes); + + if(methods.size() > 0) { + return methods.get(0); + } + return null; + } + +} 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 999d29e..19038fc 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 @@ -1,6 +1,5 @@ package com.github.xpenatan.jparser.cpp; -import com.badlogic.gdx.jnigen.FileDescriptor; import com.github.javaparser.StaticJavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Modifier; @@ -21,7 +20,7 @@ import com.github.xpenatan.jparser.core.JParser; import com.github.xpenatan.jparser.core.JParserHelper; import com.github.xpenatan.jparser.core.JParserItem; -import com.github.xpenatan.jparser.core.codeparser.IDLDefaultCodeParser; +import com.github.xpenatan.jparser.core.codeparser.idl.IDLDefaultCodeParser; import com.github.xpenatan.jparser.idl.IDLClass; import com.github.xpenatan.jparser.idl.IDLMethod; import com.github.xpenatan.jparser.idl.IDLParameter; @@ -119,7 +118,7 @@ public CppCodeParser(CppGenerator cppGenerator, IDLReader idlReader, String base } @Override - protected void onIDLMethodGenerated(JParser jParser, IDLClass idlClass, IDLMethod idlMethod, CompilationUnit unit, ClassOrInterfaceDeclaration classDeclaration, MethodDeclaration idlMethodDeclaration, boolean isAttribute) { + public void onIDLMethodGenerated(JParser jParser, IDLClass idlClass, IDLMethod idlMethod, CompilationUnit unit, ClassOrInterfaceDeclaration classDeclaration, MethodDeclaration idlMethodDeclaration, boolean isAttribute) { // IDL parser generate our empty methods with default return values. // We now modify it to match C++ api calls 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 0c4fb54..c3e06a9 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 @@ -29,7 +29,7 @@ import com.github.javaparser.ast.type.Type; import com.github.xpenatan.jparser.core.JParser; import com.github.xpenatan.jparser.core.JParserHelper; -import com.github.xpenatan.jparser.core.codeparser.IDLDefaultCodeParser; +import com.github.xpenatan.jparser.core.codeparser.idl.IDLDefaultCodeParser; import com.github.xpenatan.jparser.idl.IDLClass; import com.github.xpenatan.jparser.idl.IDLMethod; import com.github.xpenatan.jparser.idl.IDLReader; @@ -236,7 +236,7 @@ private void convertJavaPrimitiveArrayToJavaScriptReferenceArray(NodeList