diff options
Diffstat (limited to 'javaparser-core-generators/src/main')
8 files changed, 64 insertions, 47 deletions
diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/Generator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/Generator.java index 60ebd3d13..321ae33b2 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/Generator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/Generator.java @@ -1,6 +1,8 @@ package com.github.javaparser.generator; import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.expr.Expression; +import com.github.javaparser.ast.expr.StringLiteralExpr; import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations; import com.github.javaparser.utils.SourceRoot; @@ -21,12 +23,23 @@ public abstract class Generator { public abstract void generate() throws Exception; - protected <T extends Node & NodeWithAnnotations<T>> void markGenerated(T node) { + protected <T extends Node & NodeWithAnnotations<T>> void annotateGenerated(T node) { + annotate(node, Generated.class, new StringLiteralExpr(getClass().getName())); + } + + protected <T extends Node & NodeWithAnnotations<T>> void annotateSuppressWarnings(T node) { + annotate(node, SuppressWarnings.class, new StringLiteralExpr("unchecked")); + } + + private <T extends Node & NodeWithAnnotations<T>> void annotate(T node, Class<?> annotation, Expression content) { node.setAnnotations( node.getAnnotations().stream() - .filter(a -> !a.getNameAsString().equals("Generated")) + .filter(a -> !a.getNameAsString().equals(annotation.getSimpleName())) .collect(toNodeList())); - node.addSingleMemberAnnotation(Generated.class, f("\"%s\"", getClass().getName())); - node.tryAddImportToParentCompilationUnit(Generated.class); + + node.addSingleMemberAnnotation(annotation.getSimpleName(), content); + node.tryAddImportToParentCompilationUnit(annotation); } + + } diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java index eb4f38cef..d15928f5a 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java @@ -40,32 +40,37 @@ public abstract class NodeGenerator extends Generator { /** * Utility method that looks for a method or constructor with an identical signature as "callable" and replaces it - * with callable. If not found, adds callable. + * with callable. If not found, adds callable. When the new callable has no javadoc, any old javadoc will be kept. */ - protected void addOrReplaceWhenSameSignature(ClassOrInterfaceDeclaration nodeCoid, CallableDeclaration callable) { - List<CallableDeclaration> existingCallables = nodeCoid.getCallablesWithSignature(callable.getSignature()); - if (existingCallables.isEmpty()) { - nodeCoid.addMember(callable); - return; - } - if (existingCallables.size() > 1) { - throw new AssertionError(f("Wanted to regenerate a method with signature %s in %s, but found more than one.", callable.getSignature(), nodeCoid.getNameAsString())); - } - nodeCoid.getMembers().replace(existingCallables.get(0), callable); + protected void addOrReplaceWhenSameSignature(ClassOrInterfaceDeclaration containingClassOrInterface, CallableDeclaration<?> callable) { + addMethod(containingClassOrInterface, callable, () -> containingClassOrInterface.addMember(callable)); } /** * Utility method that looks for a method or constructor with an identical signature as "callable" and replaces it - * with callable. If not found, fails. + * with callable. If not found, fails. When the new callable has no javadoc, any old javadoc will be kept. */ - protected void replaceWhenSameSignature(ClassOrInterfaceDeclaration nodeCoid, CallableDeclaration callable) { - List<CallableDeclaration> existingCallables = nodeCoid.getCallablesWithSignature(callable.getSignature()); + protected void replaceWhenSameSignature(ClassOrInterfaceDeclaration containingClassOrInterface, CallableDeclaration<?> callable) { + addMethod(containingClassOrInterface, callable, + () -> { + throw new AssertionError(f("Wanted to regenerate a method with signature %s in %s, but it wasn't there.", callable.getSignature(), containingClassOrInterface.getNameAsString())); + }); + } + + private void addMethod( + ClassOrInterfaceDeclaration containingClassOrInterface, + CallableDeclaration<?> callable, + Runnable onNoExistingMethod) { + List<CallableDeclaration<?>> existingCallables = containingClassOrInterface.getCallablesWithSignature(callable.getSignature()); if (existingCallables.isEmpty()) { - throw new AssertionError(f("Wanted to regenerate a method with signature %s in %s, but it wasn't there.", callable.getSignature(), nodeCoid.getNameAsString())); + onNoExistingMethod.run(); + return; } if (existingCallables.size() > 1) { - throw new AssertionError(f("Wanted to regenerate a method with signature %s in %s, but found more than one.", callable.getSignature(), nodeCoid.getNameAsString())); + throw new AssertionError(f("Wanted to regenerate a method with signature %s in %s, but found more than one.", callable.getSignature(), containingClassOrInterface.getNameAsString())); } - nodeCoid.getMembers().replace(existingCallables.get(0), callable); + final CallableDeclaration<?> existingCallable = existingCallables.get(0); + callable.setJavadocComment(callable.getJavadocComment().orElse(existingCallable.getJavadocComment().orElse(null))); + containingClassOrInterface.getMembers().replace(existingCallable, callable); } } diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/VisitorGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/VisitorGenerator.java index 999c737dd..8d4ab7cce 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/VisitorGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/VisitorGenerator.java @@ -1,6 +1,5 @@ package com.github.javaparser.generator; -import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; @@ -65,7 +64,7 @@ public abstract class VisitorGenerator extends Generator { if (existingVisitMethod.isPresent()) { generateVisitMethodBody(node, existingVisitMethod.get(), compilationUnit); - markGenerated(existingVisitMethod.get()); + annotateGenerated(existingVisitMethod.get()); } else if (createMissingVisitMethods) { MethodDeclaration newVisitMethod = visitorClass.addMethod("visit") .addParameter(node.getTypeNameGenerified(), "n") @@ -77,7 +76,7 @@ public abstract class VisitorGenerator extends Generator { .addModifier(PUBLIC); } generateVisitMethodBody(node, newVisitMethod, compilationUnit); - markGenerated(newVisitMethod); + annotateGenerated(newVisitMethod); } } diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/CloneGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/CloneGenerator.java index 505d70ed0..0cfe52947 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/CloneGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/CloneGenerator.java @@ -25,6 +25,6 @@ public class CloneGenerator extends NodeGenerator { nodeMetaModel.getTypeNameGenerified() )); addOrReplaceWhenSameSignature(nodeCoid, cloneMethod); - markGenerated(cloneMethod); + annotateGenerated(cloneMethod); } } diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/GetMetaModelGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/GetMetaModelGenerator.java index 48ab86b1a..8e16899b5 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/GetMetaModelGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/GetMetaModelGenerator.java @@ -1,9 +1,6 @@ package com.github.javaparser.generator.core.node; -import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.Node; -import com.github.javaparser.ast.body.BodyDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.generator.NodeGenerator; @@ -29,6 +26,6 @@ public class GetMetaModelGenerator extends NodeGenerator { addOrReplaceWhenSameSignature(nodeCoid, getMetaModelMethod); nodeCu.addImport(nodeMetaModel.getClass().getName()); nodeCu.addImport(JavaParserMetaModel.class); - markGenerated(getMetaModelMethod); + annotateGenerated(getMetaModelMethod); } } diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/GetNodeListsGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/GetNodeListsGenerator.java index 85550ce99..dad26234f 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/GetNodeListsGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/GetNodeListsGenerator.java @@ -40,6 +40,6 @@ public class GetNodeListsGenerator extends NodeGenerator { final MethodDeclaration getNodeListsMethod = (MethodDeclaration) parseClassBodyDeclaration(f("@Override public List<NodeList<?>> getNodeLists() {%s}", statement)); addOrReplaceWhenSameSignature(nodeCoid, getNodeListsMethod); - markGenerated(getNodeListsMethod); + annotateGenerated(getNodeListsMethod); } } diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/MainConstructorGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/MainConstructorGenerator.java index 6292c1fdc..d8d4775b7 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/MainConstructorGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/MainConstructorGenerator.java @@ -3,7 +3,6 @@ package com.github.javaparser.generator.core.node; import com.github.javaparser.Range; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Node; -import com.github.javaparser.ast.body.CallableDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.ConstructorDeclaration; import com.github.javaparser.ast.stmt.BlockStmt; @@ -14,7 +13,6 @@ import com.github.javaparser.utils.SeparatedItemStringBuilder; import com.github.javaparser.utils.SourceRoot; import static com.github.javaparser.JavaParser.parseExplicitConstructorInvocationStmt; -import static com.github.javaparser.JavaParser.parseStatement; import static com.github.javaparser.utils.CodeGenerationUtils.f; public class MainConstructorGenerator extends NodeGenerator { @@ -52,6 +50,6 @@ public class MainConstructorGenerator extends NodeGenerator { replaceWhenSameSignature(nodeCoid, constructor); nodeCu.addImport(Range.class); - markGenerated(constructor); + annotateGenerated(constructor); } } diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/PropertyGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/PropertyGenerator.java index 08a24d3fd..1074228c5 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/PropertyGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/node/PropertyGenerator.java @@ -1,6 +1,5 @@ package com.github.javaparser.generator.core.node; -import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; @@ -9,14 +8,16 @@ import com.github.javaparser.ast.body.EnumDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.stmt.BlockStmt; import com.github.javaparser.generator.NodeGenerator; -import com.github.javaparser.utils.SourceRoot; import com.github.javaparser.metamodel.BaseNodeMetaModel; import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.metamodel.PropertyMetaModel; +import com.github.javaparser.utils.SourceRoot; import java.util.*; +import static com.github.javaparser.JavaParser.parseType; import static com.github.javaparser.ast.Modifier.FINAL; +import static com.github.javaparser.ast.Modifier.PUBLIC; import static com.github.javaparser.utils.CodeGenerationUtils.f; import static com.github.javaparser.utils.Utils.camelCaseToScreaming; @@ -39,25 +40,24 @@ public class PropertyGenerator extends NodeGenerator { } private void generateSetter(BaseNodeMetaModel nodeMetaModel, ClassOrInterfaceDeclaration nodeCoid, PropertyMetaModel property) { - final List<MethodDeclaration> setters = nodeCoid.getMethodsBySignature(property.getSetterMethodName(), property.getTypeNameForSetter()); final String name = property.getName(); - if (setters.size() != 1) { - throw new AssertionError(f("Not exactly one setter exists: %s.%s = %s", nodeMetaModel.getTypeName(), name, setters.size())); - } - // Fix parameter name - final MethodDeclaration setter = setters.get(0); - setter.getParameters().clear(); - setter.addAndGetParameter(property.getTypeNameForSetter(), property.getName()) - .addModifier(FINAL); - // Fill body final String observableName = camelCaseToScreaming(name.startsWith("is") ? name.substring(2) : name); declaredProperties.put(observableName, property); + if (property == JavaParserMetaModel.nodeMetaModel.commentPropertyMetaModel) { // Node.comment has a very specific setter that we shouldn't overwrite. return; } + final MethodDeclaration setter = new MethodDeclaration(EnumSet.of(PUBLIC), parseType(property.getContainingNodeMetaModel().getTypeNameGenerified()), property.getSetterMethodName()); + if (property.getContainingNodeMetaModel().hasWildcard()) { + setter.setType(parseType("T")); + } + setter.getParameters().clear(); + setter.addAndGetParameter(property.getTypeNameForSetter(), property.getName()) + .addModifier(FINAL); + final BlockStmt body = setter.getBody().get(); body.getStatements().clear(); @@ -84,6 +84,11 @@ public class PropertyGenerator extends NodeGenerator { } else { body.addStatement(f("return this;")); } + replaceWhenSameSignature(nodeCoid, setter); + if (property.getContainingNodeMetaModel().hasWildcard()) { + annotateSuppressWarnings(setter); + } + annotateGenerated(setter); } private void generateGetter(BaseNodeMetaModel nodeMetaModel, ClassOrInterfaceDeclaration nodeCoid, PropertyMetaModel property) { @@ -100,7 +105,7 @@ public class PropertyGenerator extends NodeGenerator { } } - private void generateObservableProperty(EnumDeclaration observablePropertyEnum, PropertyMetaModel property, boolean derived){ + private void generateObservableProperty(EnumDeclaration observablePropertyEnum, PropertyMetaModel property, boolean derived) { boolean isAttribute = !Node.class.isAssignableFrom(property.getType()); String name = property.getName(); String constantName = camelCaseToScreaming(name.startsWith("is") ? name.substring(2) : name); @@ -140,6 +145,6 @@ public class PropertyGenerator extends NodeGenerator { } observablePropertyEnum.addEnumConstant("RANGE"); observablePropertyEnum.addEnumConstant("COMMENTED_NODE"); - markGenerated(observablePropertyEnum); + annotateGenerated(observablePropertyEnum); } } |