diff options
29 files changed, 461 insertions, 33 deletions
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ParserConfiguration.java b/javaparser-core/src/main/java/com/github/javaparser/ParserConfiguration.java index 05afde2fb..15585a95d 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ParserConfiguration.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ParserConfiguration.java @@ -23,22 +23,46 @@ package com.github.javaparser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Node; -import com.github.javaparser.ast.validator.Java8Validator; -import com.github.javaparser.ast.validator.ProblemReporter; -import com.github.javaparser.ast.validator.Validator; +import com.github.javaparser.ast.validator.*; import com.github.javaparser.printer.lexicalpreservation.LexicalPreservingPrinter; import com.github.javaparser.resolution.SymbolResolver; +import com.github.javaparser.version.Java10Processor; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import static com.github.javaparser.utils.Utils.assertNotNull; + /** * The configuration that is used by the parser. * Note that this can be changed even when reusing the same JavaParser instance. * It will pick up the changes. */ public class ParserConfiguration { + public enum LanguageLevel { + ANY(null, null), + JAVA_1_0(new Java1_0Validator(), null), + JAVA_1_1(new Java1_1Validator(), null), + JAVA_1_2(new Java1_2Validator(), null), + JAVA_1_3(new Java1_3Validator(), null), + JAVA_1_4(new Java1_4Validator(), null), + JAVA_5(new Java5Validator(), null), + JAVA_6(new Java6Validator(), null), + JAVA_7(new Java7Validator(), null), + JAVA_8(new Java8Validator(), null), + JAVA_9(new Java9Validator(), null), + JAVA_10(null, new Java10Processor()); + + final Validator validator; + final ParseResult.PostProcessor postProcessor; + + LanguageLevel(Validator validator, ParseResult.PostProcessor postProcessor) { + this.validator = validator; + this.postProcessor = postProcessor; + } + } + private boolean storeTokens = true; private boolean attributeComments = true; private boolean doNotAssignCommentsPrecedingEmptyLines = true; @@ -46,7 +70,8 @@ public class ParserConfiguration { private boolean lexicalPreservationEnabled = false; private SymbolResolver symbolResolver = null; private int tabSize = 1; - private Validator validator = new Java8Validator(); + private LanguageLevel languageLevel; + private final List<ParseResult.PostProcessor> postProcessors = new ArrayList<>(); public ParserConfiguration() { @@ -64,9 +89,15 @@ public class ParserConfiguration { new CommentsInserter(configuration).insertComments(resultNode, comments.copy().getComments()))); } }); - postProcessors.add((result, configuration) -> - getValidator().ifPresent(validator -> - validator.accept(result.getResult().get(), new ProblemReporter(newProblem -> result.getProblems().add(newProblem))))); + postProcessors.add((result, configuration) -> { + LanguageLevel languageLevel = getLanguageLevel(); + if (languageLevel.postProcessor != null) { + languageLevel.postProcessor.process(result, configuration); + } + if (languageLevel.validator != null) { + languageLevel.validator.accept(result.getResult().get(), new ProblemReporter(newProblem -> result.getProblems().add(newProblem))); + } + }); postProcessors.add((result, configuration) -> configuration.getSymbolResolver().ifPresent(symbolResolver -> result.ifSuccessful(resultNode -> { if (resultNode instanceof CompilationUnit) { @@ -74,6 +105,7 @@ public class ParserConfiguration { } }) )); + setLanguageLevel(LanguageLevel.JAVA_8); } public boolean isAttributeComments() { @@ -132,18 +164,20 @@ public class ParserConfiguration { return this; } + /** + * @deprecated use getLanguageLevel + */ + @Deprecated public Optional<Validator> getValidator() { - return Optional.of(validator); + throw new IllegalStateException("method is deprecated"); } /** - * The language level validator to run directly after parsing. - * By default it is {@link Java8Validator} - * If it is null, all validation is turned off and only hard parse errors will be reported. + * @deprecated use setLanguageLevel, or getPostProcessors if you use a custom validator. */ + @Deprecated public ParserConfiguration setValidator(Validator validator) { - this.validator = validator; - return this; + throw new IllegalStateException("method is deprecated"); } /** @@ -178,4 +212,13 @@ public class ParserConfiguration { public List<ParseResult.PostProcessor> getPostProcessors() { return postProcessors; } + + public ParserConfiguration setLanguageLevel(LanguageLevel languageLevel) { + this.languageLevel = assertNotNull(languageLevel); + return this; + } + + public LanguageLevel getLanguageLevel() { + return languageLevel; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java b/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java index 400777dd9..285c2385f 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java @@ -108,11 +108,13 @@ public abstract class Node implements Cloneable, HasParentNode<Node>, Visitable, /** * Notify exclusively for changes happening on this node alone. */ - JUST_THIS_NODE, /** + JUST_THIS_NODE, + /** * Notify for changes happening on this node and all its descendants existing at the moment in * which the observer was registered. Nodes attached later will not be observed. */ - THIS_NODE_AND_EXISTING_DESCENDANTS, /** + THIS_NODE_AND_EXISTING_DESCENDANTS, + /** * Notify for changes happening on this node and all its descendants. The descendants existing at the moment in * which the observer was registered will be observed immediately. As new nodes are attached later they are * automatically registered to be observed. diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/AssignExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/AssignExpr.java index db03718ae..fbb46874d 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/AssignExpr.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/AssignExpr.java @@ -24,19 +24,14 @@ import com.github.javaparser.ast.AllFieldsConstructor; import com.github.javaparser.ast.observer.ObservableProperty; import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.VoidVisitor; - import static com.github.javaparser.utils.Utils.assertNotNull; - import com.github.javaparser.ast.Node; import com.github.javaparser.ast.visitor.CloneVisitor; import com.github.javaparser.metamodel.AssignExprMetaModel; import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.printer.Printable; - import javax.annotation.Generated; - import com.github.javaparser.TokenRange; - import java.util.function.Consumer; import java.util.Optional; @@ -78,7 +73,7 @@ public final class AssignExpr extends Expression { } public Optional<BinaryExpr.Operator> toBinaryOperator() { - switch (this) { + switch(this) { case PLUS: return Optional.of(BinaryExpr.Operator.PLUS); case MINUS: diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/BinaryExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/BinaryExpr.java index ac4729ac9..5ec79c0af 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/BinaryExpr.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/BinaryExpr.java @@ -24,19 +24,14 @@ import com.github.javaparser.ast.AllFieldsConstructor; import com.github.javaparser.ast.observer.ObservableProperty; import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.VoidVisitor; - import static com.github.javaparser.utils.Utils.assertNotNull; - import com.github.javaparser.ast.Node; import com.github.javaparser.ast.visitor.CloneVisitor; import com.github.javaparser.metamodel.BinaryExprMetaModel; import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.printer.Printable; - import javax.annotation.Generated; - import com.github.javaparser.TokenRange; - import java.util.function.Consumer; import java.util.Optional; @@ -83,7 +78,7 @@ public final class BinaryExpr extends Expression { } public Optional<AssignExpr.Operator> toAssignOperator() { - switch (this) { + switch(this) { case BINARY_OR: return Optional.of(AssignExpr.Operator.BINARY_OR); case BINARY_AND: diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/ObjectCreationExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/ObjectCreationExpr.java index 7b702c581..c4fe045b7 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/ObjectCreationExpr.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/ObjectCreationExpr.java @@ -32,8 +32,6 @@ import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.ast.type.Type; import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.VoidVisitor; -import java.util.Arrays; -import java.util.List; import java.util.Optional; import static com.github.javaparser.utils.Utils.assertNotNull; import com.github.javaparser.ast.Node; @@ -44,7 +42,6 @@ import javax.annotation.Generated; import com.github.javaparser.TokenRange; import com.github.javaparser.metamodel.OptionalProperty; import com.github.javaparser.resolution.declarations.ResolvedConstructorDeclaration; -import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; import java.util.function.Consumer; /** diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/type/ArrayType.java b/javaparser-core/src/main/java/com/github/javaparser/ast/type/ArrayType.java index 05452bdc8..76dba1f3f 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/type/ArrayType.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/type/ArrayType.java @@ -61,7 +61,8 @@ public final class ArrayType extends ReferenceType implements NodeWithAnnotation /** * The [] were found on the name, like "int a[]" or "String abc()[][]" */ - NAME, /** + NAME, + /** * The [] were found on the type, like "int[] a" or "String[][] abc()" */ TYPE diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/type/Type.java b/javaparser-core/src/main/java/com/github/javaparser/ast/type/Type.java index b28db1db4..acaf5a9ed 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/type/Type.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/type/Type.java @@ -349,4 +349,23 @@ public abstract class Type extends Node implements Resolvable<Object> { public Optional<WildcardType> toWildcardType() { return Optional.empty(); } + + @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") + public boolean isVarType() { + return false; + } + + @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") + public VarType asVarType() { + throw new IllegalStateException(f("%s is not an VarType", this)); + } + + @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") + public Optional<VarType> toVarType() { + return Optional.empty(); + } + + @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") + public void ifVarType(Consumer<VarType> action) { + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java b/javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java new file mode 100644 index 000000000..0d6296655 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/type/VarType.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser. + * Copyright (C) 2011, 2013-2016 The JavaParser Team. + * + * This file is part of JavaParser. + * + * JavaParser can be used either under the terms of + * a) the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * b) the terms of the Apache License + * + * You should have received a copy of both licenses in LICENCE.LGPL and + * LICENCE.APACHE. Please refer to those files for details. + * + * JavaParser is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ +package com.github.javaparser.ast.type; + +import com.github.javaparser.TokenRange; +import com.github.javaparser.ast.AllFieldsConstructor; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.NodeList; +import com.github.javaparser.ast.expr.AnnotationExpr; +import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations; +import com.github.javaparser.ast.visitor.CloneVisitor; +import com.github.javaparser.ast.visitor.GenericVisitor; +import com.github.javaparser.ast.visitor.VoidVisitor; +import com.github.javaparser.metamodel.JavaParserMetaModel; +import com.github.javaparser.metamodel.VoidTypeMetaModel; +import com.github.javaparser.resolution.types.ResolvedVoidType; +import javax.annotation.Generated; +import java.util.Optional; +import java.util.function.Consumer; +import com.github.javaparser.metamodel.VarTypeMetaModel; + +public final class VarType extends Type { + + @AllFieldsConstructor + public VarType() { + this(null); + } + + /** + * This constructor is used by the parser and is considered private. + */ + @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator") + public VarType(TokenRange tokenRange) { + super(tokenRange); + customInitialization(); + } + + @Override + public VarType setAnnotations(NodeList<AnnotationExpr> annotations) { + return (VarType) super.setAnnotations(annotations); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") + public boolean remove(Node node) { + if (node == null) + return false; + return super.remove(node); + } + + @Override + public String asString() { + return "var"; + } + + @Override + @Generated("com.github.javaparser.generator.core.node.CloneGenerator") + public VarType clone() { + return (VarType) accept(new CloneVisitor(), null); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator") + public VarTypeMetaModel getMetaModel() { + return JavaParserMetaModel.varTypeMetaModel; + } + + @Override + @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") + public boolean replace(Node node, Node replacementNode) { + if (node == null) + return false; + return super.replace(node, replacementNode); + } + + @Override + public ResolvedVoidType resolve() { + return getSymbolResolver().toResolvedType(this, ResolvedVoidType.class); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") + public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { + return v.visit(this, arg); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") + public <A> void accept(final VoidVisitor<A> v, final A arg) { + v.visit(this, arg); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") + public boolean isVarType() { + return true; + } + + @Override + @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") + public VarType asVarType() { + return this; + } + + @Override + @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") + public Optional<VarType> toVarType() { + return Optional.of(this); + } + + @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") + public void ifVarType(Consumer<VarType> action) { + action.accept(this); + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/CloneVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/CloneVisitor.java index e5b88e1a1..4ae343ac6 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/CloneVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/CloneVisitor.java @@ -1068,4 +1068,13 @@ public class CloneVisitor implements GenericVisitor<Visitable, Object> { r.setComment(comment); return r; } + + @Override + public Visitable visit(final VarType n, final Object arg) { + NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg); + Comment comment = cloneNode(n.getComment(), arg); + VarType r = new VarType(n.getTokenRange().orElse(null)); + r.setComment(comment); + return r; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/EqualsVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/EqualsVisitor.java index 49a2ee278..2062185a1 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/EqualsVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/EqualsVisitor.java @@ -1376,4 +1376,14 @@ public class EqualsVisitor implements GenericVisitor<Boolean, Visitable> { return false; return true; } + + @Override + public Boolean visit(final VarType n, final Visitable arg) { + final VarType n2 = (VarType) arg; + if (!nodesEquals(n.getAnnotations(), n2.getAnnotations())) + return false; + if (!nodeEquals(n.getComment(), n2.getComment())) + return false; + return true; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericListVisitorAdapter.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericListVisitorAdapter.java index 14ae6c5b5..2defdfa9f 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericListVisitorAdapter.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericListVisitorAdapter.java @@ -2041,4 +2041,21 @@ public abstract class GenericListVisitorAdapter<R, A> implements GenericVisitor< } return result; } + + @Override + public List<R> visit(final VarType n, final A arg) { + List<R> result = new ArrayList<>(); + List<R> tmp; + { + tmp = n.getAnnotations().accept(this, arg); + if (tmp != null) + result.addAll(tmp); + } + if (n.getComment().isPresent()) { + tmp = n.getComment().get().accept(this, arg); + if (tmp != null) + result.addAll(tmp); + } + return result; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitor.java index 3fa06f343..494013cc3 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitor.java @@ -314,4 +314,6 @@ public interface GenericVisitor<R, A> { @Generated("com.github.javaparser.generator.core.visitor.GenericVisitorGenerator") R visit(ReceiverParameter n, A arg); + + R visit(VarType n, A arg); } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorAdapter.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorAdapter.java index 5b4bf55c0..3d5de4fbb 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorAdapter.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorAdapter.java @@ -2035,4 +2035,20 @@ public abstract class GenericVisitorAdapter<R, A> implements GenericVisitor<R, A } return null; } + + @Override + public R visit(final VarType n, final A arg) { + R result; + { + result = n.getAnnotations().accept(this, arg); + if (result != null) + return result; + } + if (n.getComment().isPresent()) { + result = n.getComment().get().accept(this, arg); + if (result != null) + return result; + } + return null; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorWithDefaults.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorWithDefaults.java index 1f9362860..2cd9a0fdc 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorWithDefaults.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorWithDefaults.java @@ -595,4 +595,9 @@ public abstract class GenericVisitorWithDefaults<R, A> implements GenericVisitor public R visit(final ReceiverParameter n, final A arg) { return defaultAction(n, arg); } + + @Override + public R visit(final VarType n, final A arg) { + return defaultAction(n, arg); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/HashCodeVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/HashCodeVisitor.java index 2a12b7f69..92da13e8f 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/HashCodeVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/HashCodeVisitor.java @@ -510,4 +510,9 @@ public class HashCodeVisitor implements GenericVisitor<Integer, Void> { public Integer visit(final ReceiverParameter n, final Void arg) { return (n.getAnnotations().accept(this, arg)) * 31 + (n.getName().accept(this, arg)) * 31 + (n.getType().accept(this, arg)) * 31 + (n.getComment().isPresent() ? n.getComment().get().accept(this, arg) : 0); } + + @Override + public Integer visit(final VarType n, final Void arg) { + return (n.getAnnotations().accept(this, arg)) * 31 + (n.getComment().isPresent() ? n.getComment().get().accept(this, arg) : 0); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitor.java index ae82fc282..c7808641d 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitor.java @@ -1285,4 +1285,13 @@ public class ModifierVisitor<A> implements GenericVisitor<Visitable, A> { n.setComment(comment); return n; } + + @Override + public Visitable visit(final VarType n, final A arg) { + NodeList<AnnotationExpr> annotations = modifyList(n.getAnnotations(), arg); + Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null); + n.setAnnotations(annotations); + n.setComment(comment); + return n; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentEqualsVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentEqualsVisitor.java index 8e6862995..b3c1dceff 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentEqualsVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentEqualsVisitor.java @@ -1143,4 +1143,12 @@ public class NoCommentEqualsVisitor implements GenericVisitor<Boolean, Visitable return false; return true; } + + @Override + public Boolean visit(final VarType n, final Visitable arg) { + final VarType n2 = (VarType) arg; + if (!nodesEquals(n.getAnnotations(), n2.getAnnotations())) + return false; + return true; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentHashCodeVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentHashCodeVisitor.java index 914391c90..774e5d914 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentHashCodeVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentHashCodeVisitor.java @@ -502,4 +502,9 @@ public class NoCommentHashCodeVisitor implements GenericVisitor<Integer, Void> { public Integer visit(final ReceiverParameter n, final Void arg) { return (n.getAnnotations().accept(this, arg)) * 31 + (n.getName().accept(this, arg)) * 31 + (n.getType().accept(this, arg)); } + + @Override + public Integer visit(final VarType n, final Void arg) { + return (n.getAnnotations().accept(this, arg)); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityEqualsVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityEqualsVisitor.java index dceeabba3..7c642bbdb 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityEqualsVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityEqualsVisitor.java @@ -588,4 +588,9 @@ public class ObjectIdentityEqualsVisitor implements GenericVisitor<Boolean, Visi public Boolean visit(final ReceiverParameter n, final Visitable arg) { return n == arg; } + + @Override + public Boolean visit(final VarType n, final Visitable arg) { + return n == arg; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityHashCodeVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityHashCodeVisitor.java index 8f7a5e386..c53cf79a8 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityHashCodeVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityHashCodeVisitor.java @@ -502,4 +502,9 @@ public class ObjectIdentityHashCodeVisitor implements GenericVisitor<Integer, Vo public Integer visit(final ReceiverParameter n, final Void arg) { return n.hashCode(); } + + @Override + public Integer visit(final VarType n, final Void arg) { + return n.hashCode(); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java index e797d8ef4..37c9c1c3b 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java @@ -309,4 +309,6 @@ public interface VoidVisitor<A> { @Generated("com.github.javaparser.generator.core.visitor.VoidVisitorGenerator") void visit(ReceiverParameter n, A arg); + + void visit(VarType n, A arg); } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorAdapter.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorAdapter.java index d0cfbe401..1ee82669a 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorAdapter.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorAdapter.java @@ -764,4 +764,10 @@ public abstract class VoidVisitorAdapter<A> implements VoidVisitor<A> { n.getType().accept(this, arg); n.getComment().ifPresent(l -> l.accept(this, arg)); } + + @Override + public void visit(final VarType n, final A arg) { + n.getAnnotations().forEach(p -> p.accept(this, arg)); + n.getComment().ifPresent(l -> l.accept(this, arg)); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorWithDefaults.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorWithDefaults.java index ba5a93db2..6622567e6 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorWithDefaults.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorWithDefaults.java @@ -591,4 +591,9 @@ public abstract class VoidVisitorWithDefaults<A> implements VoidVisitor<A> { public void visit(final ReceiverParameter n, final A arg) { defaultAction(n, arg); } + + @Override + public void visit(final VarType n, final A arg) { + defaultAction(n, arg); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/metamodel/JavaParserMetaModel.java b/javaparser-core/src/main/java/com/github/javaparser/metamodel/JavaParserMetaModel.java index 4d81ec662..bffbd3711 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/metamodel/JavaParserMetaModel.java +++ b/javaparser-core/src/main/java/com/github/javaparser/metamodel/JavaParserMetaModel.java @@ -349,6 +349,7 @@ public final class JavaParserMetaModel { nodeMetaModels.add(unionTypeMetaModel); nodeMetaModels.add(unknownTypeMetaModel); nodeMetaModels.add(unparsableStmtMetaModel); + nodeMetaModels.add(varTypeMetaModel); nodeMetaModels.add(variableDeclarationExprMetaModel); nodeMetaModels.add(variableDeclaratorMetaModel); nodeMetaModels.add(voidTypeMetaModel); @@ -441,7 +442,7 @@ public final class JavaParserMetaModel { fieldDeclarationMetaModel.getDeclaredPropertyMetaModels().add(fieldDeclarationMetaModel.modifiersPropertyMetaModel); fieldDeclarationMetaModel.variablesPropertyMetaModel = new PropertyMetaModel(fieldDeclarationMetaModel, "variables", com.github.javaparser.ast.body.VariableDeclarator.class, Optional.of(variableDeclaratorMetaModel), false, true, true, false, false); fieldDeclarationMetaModel.getDeclaredPropertyMetaModels().add(fieldDeclarationMetaModel.variablesPropertyMetaModel); - fieldDeclarationMetaModel.maximumCommonTypePropertyMetaModel = new PropertyMetaModel(fieldDeclarationMetaModel, "maximumCommonType", com.github.javaparser.ast.type.Type.class, Optional.of(typeMetaModel), false, false, false, false, false); + fieldDeclarationMetaModel.maximumCommonTypePropertyMetaModel = new PropertyMetaModel(fieldDeclarationMetaModel, "maximumCommonType", com.github.javaparser.ast.type.Type.class, Optional.of(typeMetaModel), true, false, false, false, false); fieldDeclarationMetaModel.getDerivedPropertyMetaModels().add(fieldDeclarationMetaModel.maximumCommonTypePropertyMetaModel); initializerDeclarationMetaModel.bodyPropertyMetaModel = new PropertyMetaModel(initializerDeclarationMetaModel, "body", com.github.javaparser.ast.stmt.BlockStmt.class, Optional.of(blockStmtMetaModel), false, false, false, false, false); initializerDeclarationMetaModel.getDeclaredPropertyMetaModels().add(initializerDeclarationMetaModel.bodyPropertyMetaModel); @@ -605,7 +606,7 @@ public final class JavaParserMetaModel { variableDeclarationExprMetaModel.getDeclaredPropertyMetaModels().add(variableDeclarationExprMetaModel.modifiersPropertyMetaModel); variableDeclarationExprMetaModel.variablesPropertyMetaModel = new PropertyMetaModel(variableDeclarationExprMetaModel, "variables", com.github.javaparser.ast.body.VariableDeclarator.class, Optional.of(variableDeclaratorMetaModel), false, true, true, false, false); variableDeclarationExprMetaModel.getDeclaredPropertyMetaModels().add(variableDeclarationExprMetaModel.variablesPropertyMetaModel); - variableDeclarationExprMetaModel.maximumCommonTypePropertyMetaModel = new PropertyMetaModel(variableDeclarationExprMetaModel, "maximumCommonType", com.github.javaparser.ast.type.Type.class, Optional.of(typeMetaModel), false, false, false, false, false); + variableDeclarationExprMetaModel.maximumCommonTypePropertyMetaModel = new PropertyMetaModel(variableDeclarationExprMetaModel, "maximumCommonType", com.github.javaparser.ast.type.Type.class, Optional.of(typeMetaModel), true, false, false, false, false); variableDeclarationExprMetaModel.getDerivedPropertyMetaModels().add(variableDeclarationExprMetaModel.maximumCommonTypePropertyMetaModel); importDeclarationMetaModel.isAsteriskPropertyMetaModel = new PropertyMetaModel(importDeclarationMetaModel, "isAsterisk", boolean.class, Optional.empty(), false, false, false, false, false); importDeclarationMetaModel.getDeclaredPropertyMetaModels().add(importDeclarationMetaModel.isAsteriskPropertyMetaModel); @@ -956,6 +957,8 @@ public final class JavaParserMetaModel { public static final WildcardTypeMetaModel wildcardTypeMetaModel = new WildcardTypeMetaModel(Optional.of(typeMetaModel)); + public static final VarTypeMetaModel varTypeMetaModel = new VarTypeMetaModel(Optional.of(typeMetaModel)); + public static final ModuleRequiresStmtMetaModel moduleRequiresStmtMetaModel = new ModuleRequiresStmtMetaModel(Optional.of(moduleStmtMetaModel)); public static final ModuleExportsStmtMetaModel moduleExportsStmtMetaModel = new ModuleExportsStmtMetaModel(Optional.of(moduleStmtMetaModel)); diff --git a/javaparser-core/src/main/java/com/github/javaparser/metamodel/VarTypeMetaModel.java b/javaparser-core/src/main/java/com/github/javaparser/metamodel/VarTypeMetaModel.java new file mode 100644 index 000000000..1ada830c5 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/metamodel/VarTypeMetaModel.java @@ -0,0 +1,10 @@ +package com.github.javaparser.metamodel; + +import java.util.Optional; + +public class VarTypeMetaModel extends TypeMetaModel { + + VarTypeMetaModel(Optional<BaseNodeMetaModel> superBaseNodeMetaModel) { + super(superBaseNodeMetaModel, com.github.javaparser.ast.type.VarType.class, "VarType", "com.github.javaparser.ast.type", false, false); + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java index 3a09cbf9b..d68f38752 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java @@ -559,6 +559,13 @@ public class PrettyPrintVisitor implements VoidVisitor<Void> { } @Override + public void visit(final VarType n, final Void arg) { + printComment(n.getComment(), arg); + printAnnotations(n.getAnnotations(), false, arg); + printer.print("var"); + } + + @Override public void visit(final ArrayAccessExpr n, final Void arg) { printComment(n.getComment(), arg); n.getName().accept(this, arg); diff --git a/javaparser-core/src/main/java/com/github/javaparser/version/Java10Processor.java b/javaparser-core/src/main/java/com/github/javaparser/version/Java10Processor.java new file mode 100644 index 000000000..411ce72b2 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/version/Java10Processor.java @@ -0,0 +1,28 @@ +package com.github.javaparser.version; + +import com.github.javaparser.ParseResult; +import com.github.javaparser.ParserConfiguration; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.type.ClassOrInterfaceType; +import com.github.javaparser.ast.type.VarType; +import com.github.javaparser.ast.visitor.ModifierVisitor; +import com.github.javaparser.ast.visitor.Visitable; + +/** + * Processes the generic AST into a Java 10 AST and validates it. + */ +public class Java10Processor implements ParseResult.PostProcessor { + @Override + public void process(ParseResult<? extends Node> result, ParserConfiguration configuration) { + result.getResult().get().accept( + new ModifierVisitor<Void>() { + @Override + public Visitable visit(ClassOrInterfaceType n, Void arg) { + if (n.getNameAsString().equals("var")) { + return new VarType(n.getTokenRange().orElse(null)); + } + return super.visit(n, arg); + } + }, null); + } +} diff --git a/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java index 15772b3e5..43d9112fd 100644 --- a/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java +++ b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java @@ -140,6 +140,7 @@ public class MetaModelGenerator { add(UnknownType.class); add(VoidType.class); add(WildcardType.class); + add(VarType.class); add(ModuleRequiresStmt.class); add(ModuleExportsStmt.class); diff --git a/javaparser-testing/src/test/java/com/github/javaparser/version/Java10ProcessorTest.java b/javaparser-testing/src/test/java/com/github/javaparser/version/Java10ProcessorTest.java new file mode 100644 index 000000000..6ebb89cfb --- /dev/null +++ b/javaparser-testing/src/test/java/com/github/javaparser/version/Java10ProcessorTest.java @@ -0,0 +1,85 @@ +package com.github.javaparser.version; + +import com.github.javaparser.JavaParser; +import com.github.javaparser.ParseResult; +import com.github.javaparser.ParserConfiguration; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.stmt.Statement; +import org.junit.Test; + +import static com.github.javaparser.ParseStart.COMPILATION_UNIT; +import static com.github.javaparser.ParseStart.STATEMENT; +import static com.github.javaparser.ParserConfiguration.LanguageLevel.*; +import static com.github.javaparser.Providers.provider; +import static com.github.javaparser.ast.validator.Java1_1ValidatorTest.allModifiers; +import static com.github.javaparser.utils.TestUtils.assertNoProblems; +import static com.github.javaparser.utils.TestUtils.assertProblems; + +public class Java10ProcessorTest { + public static final JavaParser javaParser = new JavaParser(new ParserConfiguration().setLanguageLevel(JAVA_10)); + + @Test + public void varIsAType() { + ParseResult<Statement> statement = javaParser.parse(STATEMENT, provider("var x=\"\";")); + + } + + @Test + public void underscoreIdentifiers() { + ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("a.b._.c.d = act(_, _ -> _);")); + assertProblems(result, + "(line 1,col 5) '_' is a reserved keyword.", + "(line 1,col 17) '_' is a reserved keyword.", + "(line 1,col 20) '_' is a reserved keyword.", + "(line 1,col 25) '_' is a reserved keyword." + ); + } + + @Test + public void moduleRequires() { + ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("module x{requires " + allModifiers + " a;}")); + assertProblems(result, + "(line 1,col 10) Can have only one of 'public', 'protected', 'private'.", + "(line 1,col 10) Can have only one of 'final', 'abstract'.", + "(line 1,col 10) Can have only one of 'native', 'strictfp'.", + "(line 1,col 10) 'transient' is not allowed here.", + "(line 1,col 10) 'volatile' is not allowed here.", + "(line 1,col 10) 'final' is not allowed here.", + "(line 1,col 10) 'synchronized' is not allowed here.", + "(line 1,col 10) 'default' is not allowed here.", + "(line 1,col 10) 'native' is not allowed here.", + "(line 1,col 10) 'private' is not allowed here.", + "(line 1,col 10) 'protected' is not allowed here.", + "(line 1,col 10) 'strictfp' is not allowed here.", + "(line 1,col 10) 'abstract' is not allowed here.", + "(line 1,col 10) 'public' is not allowed here." + ); + } + + @Test + public void interfaceMethod() { + ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("interface X{" + allModifiers + "int x(){};}")); + assertProblems(result, + "(line 1,col 13) Can have only one of 'public', 'protected', 'private'.", + "(line 1,col 13) Can have only one of 'final', 'abstract'.", + "(line 1,col 13) Can have only one of 'native', 'strictfp'.", + "(line 1,col 13) Cannot be 'abstract' and also 'private', 'static', 'final', 'native', 'strictfp', 'synchronized'.", + "(line 1,col 13) 'transient' is not allowed here.", + "(line 1,col 13) 'volatile' is not allowed here.", + "(line 1,col 13) 'transitive' is not allowed here." + ); + } + + @Test + public void modules() { + ParseResult<CompilationUnit> result = javaParser.parse(COMPILATION_UNIT, provider("open module x {}")); + assertNoProblems(result); + } + + @Test + public void tryWithResourceReference() { + ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("try(a.b.c){}")); + assertNoProblems(result); + } + +} |