From 731c46d3bd61cc1e3e4733570dd80ab00cd63c87 Mon Sep 17 00:00:00 2001 From: Danny van Bruggen Date: Sat, 8 Oct 2016 19:45:27 +0200 Subject: [PATCH] change import handling (#491) * change import handling * Handle exceptions better. Now every exception inheriting from Exception will be turned into a Problem. --- .../com/github/javaparser/JavaParser.java | 6 +- .../com/github/javaparser/ParseStart.java | 2 +- .../javaparser/ast/CompilationUnit.java | 19 +- .../javaparser/ast/ImportDeclaration.java | 188 ------------------ .../github/javaparser/ast/expr/NameExpr.java | 3 + .../ast/expr/QualifiedNameExpr.java | 4 + .../ast/imports/EmptyImportDeclaration.java | 29 +++ .../ast/imports/ImportDeclaration.java | 89 +++++++++ .../SingleStaticImportDeclaration.java | 58 ++++++ .../imports/SingleTypeImportDeclaration.java | 45 +++++ .../StaticImportOnDemandDeclaration.java | 45 +++++ .../TypeImportOnDemandDeclaration.java | 63 ++++++ .../javaparser/ast/visitor/CloneVisitor.java | 74 +++++-- .../javaparser/ast/visitor/DumpVisitor.java | 62 ++++-- .../javaparser/ast/visitor/EqualsVisitor.java | 139 ++++++------- .../ast/visitor/GenericVisitor.java | 15 +- .../ast/visitor/GenericVisitorAdapter.java | 69 +++++-- .../ast/visitor/ModifierVisitorAdapter.java | 41 +++- .../javaparser/ast/visitor/VoidVisitor.java | 15 +- .../ast/visitor/VoidVisitorAdapter.java | 36 +++- javaparser-core/src/main/javacc/java_1_8.jj | 38 ++-- .../ast/expr/QualifiedNameExprTest.java | 19 ++ .../bdd/steps/CommentParsingSteps.java | 2 +- .../steps/ExistenceOfParentNodeVerifier.java | 96 ++++++++- .../javaparser/bdd/steps/ParsingSteps.java | 22 +- .../bdd/visitors/PositionTestVisitor.java | 42 +++- .../NodeWithAnnotationsBuildersTest.java | 2 +- .../bdd/comment_parsing_scenarios.story | 2 +- .../javaparser/bdd/dumping_scenarios.story | 32 ++- .../javaparser/bdd/parsing_scenarios.story | 6 +- 30 files changed, 857 insertions(+), 406 deletions(-) delete mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/ImportDeclaration.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/imports/EmptyImportDeclaration.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/imports/ImportDeclaration.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/imports/SingleStaticImportDeclaration.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/imports/SingleTypeImportDeclaration.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/imports/StaticImportOnDemandDeclaration.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/imports/TypeImportOnDemandDeclaration.java create mode 100644 javaparser-testing/src/test/java/com/github/javaparser/ast/expr/QualifiedNameExprTest.java diff --git a/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java b/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java index 7fdc77f21f..0c14c2b177 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java +++ b/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java @@ -22,8 +22,8 @@ package com.github.javaparser; import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.ImportDeclaration; import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.imports.ImportDeclaration; import com.github.javaparser.ast.body.BodyDeclaration; import com.github.javaparser.ast.comments.CommentsCollection; import com.github.javaparser.ast.expr.AnnotationExpr; @@ -93,10 +93,8 @@ public ParseResult parse(ParseStart start, Provider provi commentsInserter.insertComments(resultNode, comments.copy().getComments()); return new ParseResult<>(Optional.of(resultNode), parser.problems, Optional.of(astParser.getTokens()), Optional.of(astParser.getCommentsCollection())); - } catch (ParseException e) { + } catch (Exception e) { return new ParseResult<>(e); - } catch (TokenMgrException e) { - return new ParseResult<>(e); } finally { try { provider.close(); diff --git a/javaparser-core/src/main/java/com/github/javaparser/ParseStart.java b/javaparser-core/src/main/java/com/github/javaparser/ParseStart.java index f94a662820..cb7a03e740 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ParseStart.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ParseStart.java @@ -1,7 +1,7 @@ package com.github.javaparser; import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.ImportDeclaration; +import com.github.javaparser.ast.imports.ImportDeclaration; import com.github.javaparser.ast.body.BodyDeclaration; import com.github.javaparser.ast.expr.AnnotationExpr; import com.github.javaparser.ast.expr.Expression; diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/CompilationUnit.java b/javaparser-core/src/main/java/com/github/javaparser/ast/CompilationUnit.java index 2f30777def..eac3a36967 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/CompilationUnit.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/CompilationUnit.java @@ -21,21 +21,12 @@ package com.github.javaparser.ast; -import static com.github.javaparser.ast.expr.NameExpr.*; -import static com.github.javaparser.utils.Utils.ensureNotNull; - -import java.util.Arrays; -import java.util.EnumSet; -import java.util.List; -import java.util.stream.Collectors; - -import com.github.javaparser.ast.expr.NameExpr; -import com.github.javaparser.utils.ClassUtils; import com.github.javaparser.Range; import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.comments.Comment; import com.github.javaparser.ast.comments.JavadocComment; -import com.github.javaparser.ast.expr.NameExpr; +import com.github.javaparser.ast.imports.*; +import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.VoidVisitor; import com.github.javaparser.utils.ClassUtils; @@ -45,6 +36,7 @@ import java.util.List; import java.util.stream.Collectors; +import static com.github.javaparser.ast.expr.NameExpr.name; import static com.github.javaparser.utils.Utils.ensureNotNull; /** @@ -248,11 +240,10 @@ else if (clazz.isArray() && !ClassUtils.isPrimitiveOrWrapper(clazz.getComponentT * @return this, the {@link CompilationUnit} */ public CompilationUnit addImport(String name, boolean isStatic, boolean isAsterisk) { - if (getImports().stream().anyMatch(i -> i.getName().toString().equals(name))) + final ImportDeclaration importDeclaration = ImportDeclaration.create(Range.UNKNOWN, name(name), isStatic, isAsterisk); + if (getImports().stream().anyMatch(i -> i.toString().equals(importDeclaration.toString()))) return this; else { - ImportDeclaration importDeclaration = new ImportDeclaration(name(name), isStatic, - isAsterisk); getImports().add(importDeclaration); importDeclaration.setParentNode(this); return this; diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/ImportDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/ast/ImportDeclaration.java deleted file mode 100644 index 863c8d3648..0000000000 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/ImportDeclaration.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * 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; - -import com.github.javaparser.Range; -import com.github.javaparser.ast.expr.NameExpr; -import com.github.javaparser.ast.visitor.GenericVisitor; -import com.github.javaparser.ast.visitor.VoidVisitor; - -/** - *

- * This class represents a import declaration or an empty import declaration. Imports are optional for the - * {@link CompilationUnit}. - *

- * The ImportDeclaration is constructed following the syntax:
- *
- * {@code
- * ImportDeclaration ::= "import" ( "static" )? }{@link NameExpr}{@code ( "." "*" )? ";"
- * }
- * 
- * An enmpty import declaration is simply a semicolon among the import declarations. - * @author Julio Vilmar Gesser - */ -public final class ImportDeclaration extends Node { - - private NameExpr name; - private boolean static_; - private boolean asterisk; - private boolean isEmptyImportDeclaration; - - private ImportDeclaration() { - this.isEmptyImportDeclaration = true; - static_ = false; - asterisk = false; - } - - private ImportDeclaration(Range range) { - super(range); - this.isEmptyImportDeclaration = true; - static_ = false; - asterisk = false; - } - - /** - * Create an empty import declaration without specifying its position. - */ - public static ImportDeclaration createEmptyDeclaration(){ - return new ImportDeclaration(); - } - - /** - * Create an empty import declaration specifying its position. - */ - public static ImportDeclaration createEmptyDeclaration(Range range){ - return new ImportDeclaration(range); - } - - public ImportDeclaration(NameExpr name, boolean isStatic, boolean isAsterisk) { - setAsterisk(isAsterisk); - setName(name); - setStatic(isStatic); - this.isEmptyImportDeclaration = false; - } - - public ImportDeclaration(Range range, NameExpr name, boolean isStatic, boolean isAsterisk) { - super(range); - setAsterisk(isAsterisk); - setName(name); - setStatic(isStatic); - this.isEmptyImportDeclaration = false; - } - - /** - * Is this an empty import declaration or a normal import declaration? - */ - public boolean isEmptyImportDeclaration(){ - return this.isEmptyImportDeclaration; - } - - @Override - public R accept(GenericVisitor v, A arg) { - return v.visit(this, arg); - } - - @Override - public void accept(VoidVisitor v, A arg) { - v.visit(this, arg); - } - - /** - * Retrieves the name of the import. - * - * @return the name of the import - * @throws UnsupportedOperationException when invoked on an empty import declaration - */ - public NameExpr getName() { - if (isEmptyImportDeclaration) { - throw new UnsupportedOperationException("Empty import declarations have no name"); - } - return name; - } - - /** - * Return if the import ends with "*". - * - * @return true if the import ends with "*", false - * otherwise - */ - public boolean isAsterisk() { - return asterisk; - } - - /** - * Return if the import is static. - * - * @return true if the import is static, false - * otherwise - */ - public boolean isStatic() { - return static_; - } - - /** - * Sets if this import is asterisk. - * - * @param asterisk - * true if this import is asterisk - * @throws UnsupportedOperationException when setting true on an empty import declaration - */ - public ImportDeclaration setAsterisk(boolean asterisk) { - if (isEmptyImportDeclaration && asterisk) { - throw new UnsupportedOperationException("Empty import cannot have asterisk"); - } - this.asterisk = asterisk; - return this; - } - - /** - * Sets the name this import. - * - * @param name - * the name to set - * @throws UnsupportedOperationException when invoked on an empty import declaration - */ - public ImportDeclaration setName(NameExpr name) { - if (isEmptyImportDeclaration) { - throw new UnsupportedOperationException("Empty import cannot have name"); - } - this.name = name; - setAsParentNodeOf(this.name); - return this; - } - - /** - * Sets if this import is static. - * - * @param static_ - * true if this import is static - * @throws UnsupportedOperationException when setting true on an empty import declaration - */ - public ImportDeclaration setStatic(boolean static_) { - if (isEmptyImportDeclaration && static_) { - throw new UnsupportedOperationException("Empty import cannot be static"); - } - this.static_ = static_; - return this; - } - -} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/NameExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/NameExpr.java index 331fa2af3c..944f70ff2b 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/NameExpr.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/NameExpr.java @@ -82,4 +82,7 @@ public static NameExpr name(String qualifiedName) { return ret; } + public String getQualifiedName() { + return name; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/QualifiedNameExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/QualifiedNameExpr.java index dd906310d5..573f06bf08 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/QualifiedNameExpr.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/QualifiedNameExpr.java @@ -62,4 +62,8 @@ public QualifiedNameExpr setQualifier(final NameExpr qualifier) { setAsParentNodeOf(this.qualifier); return this; } + + public String getQualifiedName() { + return qualifier.getQualifiedName() + "." + getName(); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/imports/EmptyImportDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/EmptyImportDeclaration.java new file mode 100644 index 0000000000..13989e0547 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/EmptyImportDeclaration.java @@ -0,0 +1,29 @@ +package com.github.javaparser.ast.imports; + +import com.github.javaparser.Range; +import com.github.javaparser.ast.visitor.GenericVisitor; +import com.github.javaparser.ast.visitor.VoidVisitor; + +/** + * A stray semicolon between the imports. + * This isn't described in the JLS, but accepted by most or all tools that parse Java. + */ +public class EmptyImportDeclaration extends ImportDeclaration { + @Override + public R accept(GenericVisitor v, A arg) { + return v.visit(this, arg); + } + + @Override + public void accept(VoidVisitor v, A arg) { + v.visit(this, arg); + } + + public EmptyImportDeclaration() { + this(Range.UNKNOWN); + } + + public EmptyImportDeclaration(Range range) { + super(range); + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/imports/ImportDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/ImportDeclaration.java new file mode 100644 index 0000000000..4e82e65ad3 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/ImportDeclaration.java @@ -0,0 +1,89 @@ +/* + * 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.imports; + +import com.github.javaparser.Range; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.expr.NameExpr; +import com.github.javaparser.ast.expr.QualifiedNameExpr; +import com.github.javaparser.ast.type.ClassOrInterfaceType; + +import static com.github.javaparser.utils.Utils.assertNotNull; + +/** + *

+ * This class is a base class for classes representing import declarations. Imports are optional for the + * {@link CompilationUnit}. + *

+ * The ImportDeclaration is constructed following the syntax:
+ *
+ * {@code
+ * ImportDeclaration ::= "import" ( "static" )? }{@link NameExpr}{@code ( "." "*" )? ";"
+ * }
+ * 
+ * An EmptyImportDeclaration is simply a semicolon among the import declarations. + *

JLS 7.5. Import Declarations

+ * + * @author Julio Vilmar Gesser + */ +public abstract class ImportDeclaration extends Node { + public ImportDeclaration() { + super(); + } + + public ImportDeclaration(Range range) { + super(range); + } + + /** + * Factory method for import declarations. + * + * @param range the range the import declaration covers. Range.UNKNOWN if not known. + * @param name the qualified name of the import. + * @param isStatic whether the import is static. + * @param isAsterisk whether the import is on demand. + */ + public static ImportDeclaration create(Range range, NameExpr name, boolean isStatic, boolean isAsterisk) { + assertNotNull(range); + assertNotNull(name); + if (isStatic) { + if (isAsterisk) { + return new StaticImportOnDemandDeclaration(range, new ClassOrInterfaceType(name.getQualifiedName())); + } else { + if (!(name instanceof QualifiedNameExpr)) { + throw new IllegalArgumentException("import static name has only one identifier."); + } + String staticMember = name.getName(); + QualifiedNameExpr qualifiedName = (QualifiedNameExpr) name; + String className = qualifiedName.getQualifier().getQualifiedName(); + return new SingleStaticImportDeclaration(range, new ClassOrInterfaceType(className), staticMember); + } + } else { + if (isAsterisk) { + return new TypeImportOnDemandDeclaration(range, name); + } else { + return new SingleTypeImportDeclaration(range, new ClassOrInterfaceType(name.getQualifiedName())); + } + } + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/imports/SingleStaticImportDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/SingleStaticImportDeclaration.java new file mode 100644 index 0000000000..969a46fa27 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/SingleStaticImportDeclaration.java @@ -0,0 +1,58 @@ +package com.github.javaparser.ast.imports; + +import com.github.javaparser.Range; +import com.github.javaparser.ast.type.ClassOrInterfaceType; +import com.github.javaparser.ast.visitor.GenericVisitor; +import com.github.javaparser.ast.visitor.VoidVisitor; + +import static com.github.javaparser.utils.Utils.assertNotNull; + +/** + * Example: import static com.github.javaparser.JavaParser.parse; + * In the example, "com.github.javaparser.JavaParser" is the type, + * and "parse" is the staticMember. + *

7.5.3. Single-Static-Import Declarations

+ */ +public class SingleStaticImportDeclaration extends ImportDeclaration { + private ClassOrInterfaceType type; + private String staticMember; + + public SingleStaticImportDeclaration() { + this(Range.UNKNOWN, new ClassOrInterfaceType(), ""); + } + + public SingleStaticImportDeclaration(Range range, ClassOrInterfaceType type, String staticMember) { + super(range); + setType(type); + setStaticMember(staticMember); + } + + @Override + public R accept(GenericVisitor v, A arg) { + return v.visit(this, arg); + } + + @Override + public void accept(VoidVisitor v, A arg) { + v.visit(this, arg); + } + + public ClassOrInterfaceType getType() { + return type; + } + + public SingleStaticImportDeclaration setType(ClassOrInterfaceType type) { + this.type = assertNotNull(type); + setAsParentNodeOf(type); + return this; + } + + public String getStaticMember() { + return staticMember; + } + + public SingleStaticImportDeclaration setStaticMember(String staticMember) { + this.staticMember = assertNotNull(staticMember); + return this; + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/imports/SingleTypeImportDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/SingleTypeImportDeclaration.java new file mode 100644 index 0000000000..0a876a6a10 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/SingleTypeImportDeclaration.java @@ -0,0 +1,45 @@ +package com.github.javaparser.ast.imports; + +import com.github.javaparser.Range; +import com.github.javaparser.ast.type.ClassOrInterfaceType; +import com.github.javaparser.ast.visitor.GenericVisitor; +import com.github.javaparser.ast.visitor.VoidVisitor; + +import static com.github.javaparser.utils.Utils.assertNotNull; + +/** + * Example: import com.github.javaparser.JavaParser; + *

JLS 7.5.1. Single-Type-Import Declarations

+ */ +public class SingleTypeImportDeclaration extends ImportDeclaration { + private ClassOrInterfaceType type; + + public SingleTypeImportDeclaration() { + this(Range.UNKNOWN, new ClassOrInterfaceType()); + } + + public SingleTypeImportDeclaration(Range range, ClassOrInterfaceType type) { + super(range); + setType(type); + } + + @Override + public R accept(GenericVisitor v, A arg) { + return v.visit(this, arg); + } + + @Override + public void accept(VoidVisitor v, A arg) { + v.visit(this, arg); + } + + public ClassOrInterfaceType getType() { + return type; + } + + public SingleTypeImportDeclaration setType(ClassOrInterfaceType type) { + this.type = assertNotNull(type); + setAsParentNodeOf(type); + return this; + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/imports/StaticImportOnDemandDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/StaticImportOnDemandDeclaration.java new file mode 100644 index 0000000000..99f38dff2f --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/StaticImportOnDemandDeclaration.java @@ -0,0 +1,45 @@ +package com.github.javaparser.ast.imports; + +import com.github.javaparser.Range; +import com.github.javaparser.ast.type.ClassOrInterfaceType; +import com.github.javaparser.ast.visitor.GenericVisitor; +import com.github.javaparser.ast.visitor.VoidVisitor; + +import static com.github.javaparser.utils.Utils.assertNotNull; + +/** + * Example: import static com.github.javaparser.JavaParser.*; + *

7.5.4. Static-Import-on-Demand Declarations

+ */ +public class StaticImportOnDemandDeclaration extends ImportDeclaration { + private ClassOrInterfaceType type; + + public StaticImportOnDemandDeclaration() { + this(Range.UNKNOWN, new ClassOrInterfaceType()); + } + + public StaticImportOnDemandDeclaration(Range range, ClassOrInterfaceType type) { + super(range); + setType(type); + } + + @Override + public R accept(GenericVisitor v, A arg) { + return v.visit(this, arg); + } + + @Override + public void accept(VoidVisitor v, A arg) { + v.visit(this, arg); + } + + public ClassOrInterfaceType getType() { + return type; + } + + public StaticImportOnDemandDeclaration setType(ClassOrInterfaceType type) { + this.type = assertNotNull(type); + setAsParentNodeOf(type); + return this; + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/imports/TypeImportOnDemandDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/TypeImportOnDemandDeclaration.java new file mode 100644 index 0000000000..0f897c3854 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/imports/TypeImportOnDemandDeclaration.java @@ -0,0 +1,63 @@ +package com.github.javaparser.ast.imports; + +import com.github.javaparser.Range; +import com.github.javaparser.ast.expr.NameExpr; +import com.github.javaparser.ast.visitor.GenericVisitor; +import com.github.javaparser.ast.visitor.VoidVisitor; + +import static com.github.javaparser.ast.expr.NameExpr.*; +import static com.github.javaparser.utils.Utils.assertNotNull; + +/** + * Examples: + * + * import com.github.javaparser.*; + * import com.github.javaparser.JavaParser.*; + * + * Since a parser cannot differentiate between a type name and a package name, we simply store a NameExpr. + *

JLS 7.5.2. Type-Import-on-Demand Declarations

+ */ +public class TypeImportOnDemandDeclaration extends ImportDeclaration { + private NameExpr name; + + public TypeImportOnDemandDeclaration() { + this(Range.UNKNOWN, name("")); + } + + public TypeImportOnDemandDeclaration(Range range, NameExpr name) { + super(range); + setName(name); + } + + @Override + public R accept(GenericVisitor v, A arg) { + return v.visit(this, arg); + } + + @Override + public void accept(VoidVisitor v, A arg) { + v.visit(this, arg); + } + + /** + * Retrieves the name of the import. + * + * @return the name of the import + * @throws UnsupportedOperationException when invoked on an empty import declaration + */ + public NameExpr getName() { + return name; + } + + /** + * Sets the name this import. + * + * @param name + * the name to set + */ + public ImportDeclaration setName(NameExpr name) { + this.name = assertNotNull(name); + setAsParentNodeOf(this.name); + return 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 33ca0e02a7..e3ca153c45 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 @@ -25,6 +25,7 @@ import java.util.List; import com.github.javaparser.ast.*; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.type.TypeParameter; import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.body.AnnotationMemberDeclaration; @@ -135,19 +136,6 @@ public Node visit(PackageDeclaration _n, Object _arg) { return r; } - @Override - public Node visit(ImportDeclaration _n, Object _arg) { - NameExpr name = cloneNodes(_n.getName(), _arg); - Comment comment = cloneNodes(_n.getComment(), _arg); - - ImportDeclaration r = new ImportDeclaration( - _n.getRange(), - name, _n.isStatic(), _n.isAsterisk() - ); - r.setComment(comment); - return r; - } - @Override public Node visit(TypeParameter _n, Object _arg) { List typeBound = visit(_n.getTypeBound(), _arg); @@ -1272,6 +1260,66 @@ public Node visit(ArrayBracketPair _n, Object _arg) { return new ArrayBracketPair(_n.getRange(), annotations); } + @Override + public Node visit(EmptyImportDeclaration _n, Object _arg) { + Comment comment = cloneNodes(_n.getComment(), _arg); + return new EmptyImportDeclaration(_n.getRange()).setComment(comment); + } + + @Override + public Node visit(SingleStaticImportDeclaration _n, Object _arg) { + ClassOrInterfaceType type_ = cloneNodes(_n.getType(), _arg); + Comment comment = cloneNodes(_n.getComment(), _arg); + + + SingleStaticImportDeclaration r = new SingleStaticImportDeclaration( + _n.getRange(), + type_, + _n.getStaticMember() + ); + r.setComment(comment); + return r; + } + + @Override + public Node visit(SingleTypeImportDeclaration _n, Object _arg) { + ClassOrInterfaceType type_ = cloneNodes(_n.getType(), _arg); + Comment comment = cloneNodes(_n.getComment(), _arg); + + SingleTypeImportDeclaration r = new SingleTypeImportDeclaration( + _n.getRange(), + type_ + ); + r.setComment(comment); + return r; + } + + @Override + public Node visit(StaticImportOnDemandDeclaration _n, Object _arg) { + ClassOrInterfaceType type_ = cloneNodes(_n.getType(), _arg); + Comment comment = cloneNodes(_n.getComment(), _arg); + + StaticImportOnDemandDeclaration r = new StaticImportOnDemandDeclaration( + _n.getRange(), + type_ + ); + r.setComment(comment); + return r; + } + + @Override + public Node visit(TypeImportOnDemandDeclaration _n, Object _arg) { + NameExpr name = cloneNodes(_n.getName(), _arg); + Comment comment = cloneNodes(_n.getComment(), _arg); + + TypeImportOnDemandDeclaration r = new TypeImportOnDemandDeclaration( + _n.getRange(), + name + ); + r.setComment(comment); + return r; + } + public List visit(List _nodes, Object _arg) { if (_nodes == null) return null; diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/DumpVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/DumpVisitor.java index 569f395161..63b67efcbe 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/DumpVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/DumpVisitor.java @@ -28,6 +28,7 @@ import com.github.javaparser.ast.comments.JavadocComment; import com.github.javaparser.ast.comments.LineComment; import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.nodeTypes.NodeWithTypeArguments; import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.type.*; @@ -266,24 +267,6 @@ public void visit(final QualifiedNameExpr n, final Object arg) { printOrphanCommentsEnding(n); } - @Override - public void visit(final ImportDeclaration n, final Object arg) { - printJavaComment(n.getComment(), arg); - if (!n.isEmptyImportDeclaration()) { - printer.print("import "); - if (n.isStatic()) { - printer.print("static "); - } - n.getName().accept(this, arg); - if (n.isAsterisk()) { - printer.print(".*"); - } - } - printer.printLn(";"); - - printOrphanCommentsEnding(n); - } - @Override public void visit(final ClassOrInterfaceDeclaration n, final Object arg) { printJavaComment(n.getComment(), arg); @@ -1594,6 +1577,49 @@ public void visit(ArrayBracketPair arrayBracketPair, Object arg) { printer.print("[]"); } + @Override + public void visit(EmptyImportDeclaration n, Object arg) { + printer.printLn(";"); + } + + @Override + public void visit(SingleStaticImportDeclaration n, Object arg) { + printJavaComment(n.getComment(), arg); + printer.print("import static "); + n.getType().accept(this, arg); + printer.print("."); + printer.print(n.getStaticMember()); + printer.printLn(";"); + printOrphanCommentsEnding(n); + } + + @Override + public void visit(SingleTypeImportDeclaration n, Object arg) { + printJavaComment(n.getComment(), arg); + printer.print("import "); + n.getType().accept(this, arg); + printer.printLn(";"); + printOrphanCommentsEnding(n); + } + + @Override + public void visit(StaticImportOnDemandDeclaration n, Object arg) { + printJavaComment(n.getComment(), arg); + printer.print("import static "); + n.getType().accept(this, arg); + printer.printLn(".*;"); + printOrphanCommentsEnding(n); + } + + @Override + public void visit(TypeImportOnDemandDeclaration n, Object arg) { + printJavaComment(n.getComment(), arg); + printer.print("import "); + n.getName().accept(this, arg); + printer.printLn(".*;"); + printOrphanCommentsEnding(n); + } + private void printOrphanCommentsBeforeThisChildNode(final Node node) { if (node instanceof Comment) return; 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 e10184ce9c..1537593ce6 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 @@ -21,85 +21,18 @@ package com.github.javaparser.ast.visitor; -import java.util.List; - import com.github.javaparser.ast.*; -import com.github.javaparser.ast.type.TypeParameter; -import com.github.javaparser.ast.body.AnnotationDeclaration; -import com.github.javaparser.ast.body.AnnotationMemberDeclaration; -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; -import com.github.javaparser.ast.body.ConstructorDeclaration; -import com.github.javaparser.ast.body.EmptyMemberDeclaration; -import com.github.javaparser.ast.body.EmptyTypeDeclaration; -import com.github.javaparser.ast.body.EnumConstantDeclaration; -import com.github.javaparser.ast.body.EnumDeclaration; -import com.github.javaparser.ast.body.FieldDeclaration; -import com.github.javaparser.ast.body.InitializerDeclaration; -import com.github.javaparser.ast.body.MethodDeclaration; -import com.github.javaparser.ast.body.Parameter; -import com.github.javaparser.ast.body.VariableDeclarator; -import com.github.javaparser.ast.body.VariableDeclaratorId; +import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.comments.BlockComment; import com.github.javaparser.ast.comments.JavadocComment; import com.github.javaparser.ast.comments.LineComment; -import com.github.javaparser.ast.expr.ArrayAccessExpr; -import com.github.javaparser.ast.expr.ArrayCreationExpr; -import com.github.javaparser.ast.expr.ArrayInitializerExpr; -import com.github.javaparser.ast.expr.AssignExpr; -import com.github.javaparser.ast.expr.BinaryExpr; -import com.github.javaparser.ast.expr.BooleanLiteralExpr; -import com.github.javaparser.ast.expr.CastExpr; -import com.github.javaparser.ast.expr.CharLiteralExpr; -import com.github.javaparser.ast.expr.ClassExpr; -import com.github.javaparser.ast.expr.ConditionalExpr; -import com.github.javaparser.ast.expr.DoubleLiteralExpr; -import com.github.javaparser.ast.expr.EnclosedExpr; -import com.github.javaparser.ast.expr.FieldAccessExpr; -import com.github.javaparser.ast.expr.InstanceOfExpr; -import com.github.javaparser.ast.expr.IntegerLiteralExpr; -import com.github.javaparser.ast.expr.IntegerLiteralMinValueExpr; -import com.github.javaparser.ast.expr.LambdaExpr; -import com.github.javaparser.ast.expr.LongLiteralExpr; -import com.github.javaparser.ast.expr.LongLiteralMinValueExpr; -import com.github.javaparser.ast.expr.MarkerAnnotationExpr; -import com.github.javaparser.ast.expr.MemberValuePair; -import com.github.javaparser.ast.expr.MethodCallExpr; -import com.github.javaparser.ast.expr.MethodReferenceExpr; -import com.github.javaparser.ast.expr.NameExpr; -import com.github.javaparser.ast.expr.NormalAnnotationExpr; -import com.github.javaparser.ast.expr.NullLiteralExpr; -import com.github.javaparser.ast.expr.ObjectCreationExpr; -import com.github.javaparser.ast.expr.QualifiedNameExpr; -import com.github.javaparser.ast.expr.SingleMemberAnnotationExpr; -import com.github.javaparser.ast.expr.StringLiteralExpr; -import com.github.javaparser.ast.expr.SuperExpr; -import com.github.javaparser.ast.expr.ThisExpr; -import com.github.javaparser.ast.expr.TypeExpr; -import com.github.javaparser.ast.expr.UnaryExpr; -import com.github.javaparser.ast.expr.VariableDeclarationExpr; -import com.github.javaparser.ast.stmt.AssertStmt; -import com.github.javaparser.ast.stmt.BlockStmt; -import com.github.javaparser.ast.stmt.BreakStmt; -import com.github.javaparser.ast.stmt.CatchClause; -import com.github.javaparser.ast.stmt.ContinueStmt; -import com.github.javaparser.ast.stmt.DoStmt; -import com.github.javaparser.ast.stmt.EmptyStmt; -import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt; -import com.github.javaparser.ast.stmt.ExpressionStmt; -import com.github.javaparser.ast.stmt.ForStmt; -import com.github.javaparser.ast.stmt.ForeachStmt; -import com.github.javaparser.ast.stmt.IfStmt; -import com.github.javaparser.ast.stmt.LabeledStmt; -import com.github.javaparser.ast.stmt.ReturnStmt; -import com.github.javaparser.ast.stmt.SwitchEntryStmt; -import com.github.javaparser.ast.stmt.SwitchStmt; -import com.github.javaparser.ast.stmt.SynchronizedStmt; -import com.github.javaparser.ast.stmt.ThrowStmt; -import com.github.javaparser.ast.stmt.TryStmt; -import com.github.javaparser.ast.stmt.TypeDeclarationStmt; -import com.github.javaparser.ast.stmt.WhileStmt; +import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.imports.*; +import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.type.*; +import java.util.List; + /** * @author Julio Vilmar Gesser */ @@ -205,16 +138,6 @@ private boolean objEquals(final Object n1, final Object n2) { return true; } - @Override public Boolean visit(final ImportDeclaration n1, final Node arg) { - final ImportDeclaration n2 = (ImportDeclaration) arg; - - if (!nodeEquals(n1.getName(), n2.getName())) { - return false; - } - - return true; - } - @Override public Boolean visit(final TypeParameter n1, final Node arg) { final TypeParameter n2 = (TypeParameter) arg; @@ -1511,4 +1434,54 @@ public Boolean visit(ArrayBracketPair n1, Node arg) { return true; } + + @Override + public Boolean visit(EmptyImportDeclaration n1, Node arg) { + return true; + } + + @Override + public Boolean visit(SingleStaticImportDeclaration n1, Node arg) { + final SingleStaticImportDeclaration n2 = (SingleStaticImportDeclaration) arg; + + if (!nodeEquals(n1.getType(), n2.getType())) { + return false; + } + + if (!objEquals(n1.getStaticMember(), n2.getStaticMember())) { + return false; + } + + return true; + } + + @Override + public Boolean visit(SingleTypeImportDeclaration n1, Node arg) { + final SingleTypeImportDeclaration n2 = (SingleTypeImportDeclaration) arg; + if (!nodeEquals(n1.getType(), n2.getType())) { + return false; + } + + return true; + } + + @Override + public Boolean visit(StaticImportOnDemandDeclaration n1, Node arg) { + final StaticImportOnDemandDeclaration n2 = (StaticImportOnDemandDeclaration) arg; + if (!nodeEquals(n1.getType(), n2.getType())) { + return false; + } + + return true; + } + + @Override + public Boolean visit(TypeImportOnDemandDeclaration n1, Node arg) { + final TypeImportOnDemandDeclaration n2 = (TypeImportOnDemandDeclaration) arg; + if (!nodeEquals(n1.getName(), n2.getName())) { + return false; + } + + return true; + } } 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 9f4e9bc7fa..2c159f941d 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 @@ -24,6 +24,7 @@ import com.github.javaparser.ast.*; import com.github.javaparser.ast.comments.BlockComment; import com.github.javaparser.ast.comments.LineComment; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.type.TypeParameter; import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.body.AnnotationMemberDeclaration; @@ -77,8 +78,6 @@ public interface GenericVisitor { R visit(PackageDeclaration n, A arg); - R visit(ImportDeclaration n, A arg); - R visit(TypeParameter n, A arg); R visit(LineComment n, A arg); @@ -253,5 +252,15 @@ public interface GenericVisitor { R visit(TypeExpr n, A arg); - R visit(ArrayBracketPair arrayBracketPair, A arg); + R visit(ArrayBracketPair n, A arg); + + R visit(EmptyImportDeclaration n, A arg); + + R visit(SingleStaticImportDeclaration n, A arg); + + R visit(SingleTypeImportDeclaration n, A arg); + + R visit(StaticImportOnDemandDeclaration n, A arg); + + R visit(TypeImportOnDemandDeclaration 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 af01fdffba..0948fe4ec4 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 @@ -28,11 +28,10 @@ import com.github.javaparser.ast.comments.JavadocComment; import com.github.javaparser.ast.comments.LineComment; import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.type.*; -import java.util.List; - /** * @author Julio Vilmar Gesser */ @@ -815,18 +814,6 @@ public R visit(final IfStmt n, final A arg) { return null; } - @Override - public R visit(final ImportDeclaration n, final A arg) { - visitComment(n, arg); - { - R result = n.getName().accept(this, arg); - if (result != null) { - return result; - } - } - return null; - } - @Override public R visit(final InitializerDeclaration n, final A arg) { visitComment(n, arg); @@ -1656,6 +1643,60 @@ public R visit(ArrayBracketPair n, A arg) { return null; } + @Override + public R visit(EmptyImportDeclaration n, A arg) { + visitComment(n, arg); + return null; + } + + @Override + public R visit(SingleStaticImportDeclaration n, A arg) { + visitComment(n, arg); + { + R result = n.getType().accept(this, arg); + if (result != null) { + return result; + } + } + return null; + } + + @Override + public R visit(SingleTypeImportDeclaration n, A arg) { + visitComment(n, arg); + { + R result = n.getType().accept(this, arg); + if (result != null) { + return result; + } + } + return null; + } + + @Override + public R visit(StaticImportOnDemandDeclaration n, A arg) { + visitComment(n, arg); + { + R result = n.getType().accept(this, arg); + if (result != null) { + return result; + } + } + return null; + } + + @Override + public R visit(TypeImportOnDemandDeclaration n, A arg) { + visitComment(n, arg); + { + R result = n.getName().accept(this, arg); + if (result != null) { + return result; + } + } + return null; + } + @Override public R visit(final BlockComment n, final A arg) { return null; diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitorAdapter.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitorAdapter.java index 78b0e29317..878c28f55e 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitorAdapter.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitorAdapter.java @@ -24,6 +24,7 @@ import java.util.List; import com.github.javaparser.ast.*; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.type.TypeParameter; import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.body.AnnotationMemberDeclaration; @@ -631,12 +632,6 @@ private void visitAnnotations(NodeWithAnnotations n, A arg) { return n; } - @Override public Node visit(final ImportDeclaration n, final A arg) { - visitComment(n, arg); - n.setName((NameExpr) n.getName().accept(this, arg)); - return n; - } - @Override public Node visit(final InitializerDeclaration n, final A arg) { visitComment(n, arg); n.setBlock((BlockStmt) n.getBlock().accept(this, arg)); @@ -1131,6 +1126,40 @@ public Node visit(ArrayBracketPair n, A arg) { return n; } + @Override + public Node visit(EmptyImportDeclaration n, A arg) { + visitComment(n, arg); + return n; + } + + @Override + public Node visit(SingleStaticImportDeclaration n, A arg) { + visitComment(n, arg); + n.setType((ClassOrInterfaceType) n.getType().accept(this, arg)); + return n; + } + + @Override + public Node visit(SingleTypeImportDeclaration n, A arg) { + visitComment(n, arg); + n.setType((ClassOrInterfaceType) n.getType().accept(this, arg)); + return n; + } + + @Override + public Node visit(StaticImportOnDemandDeclaration n, A arg) { + visitComment(n, arg); + n.setType((ClassOrInterfaceType) n.getType().accept(this, arg)); + return n; + } + + @Override + public Node visit(TypeImportOnDemandDeclaration n, A arg) { + visitComment(n, arg); + n.setName((NameExpr) n.getName().accept(this, arg)); + return n; + } + @Override public Node visit(final BlockComment n, final A arg) { return n; 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 ec1d0f6a61..30443a37b5 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 @@ -24,6 +24,7 @@ import com.github.javaparser.ast.*; import com.github.javaparser.ast.comments.BlockComment; import com.github.javaparser.ast.comments.LineComment; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.type.TypeParameter; import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.body.AnnotationMemberDeclaration; @@ -77,8 +78,6 @@ public interface VoidVisitor { void visit(PackageDeclaration n, A arg); - void visit(ImportDeclaration n, A arg); - void visit(TypeParameter n, A arg); void visit(LineComment n, A arg); @@ -253,5 +252,15 @@ public interface VoidVisitor { void visit(TypeExpr n, A arg); - void visit(ArrayBracketPair arrayBracketPair, A arg); + void visit(ArrayBracketPair n, A arg); + + void visit(EmptyImportDeclaration n, A arg); + + void visit(SingleStaticImportDeclaration n, A arg); + + void visit(SingleTypeImportDeclaration n, A arg); + + void visit(StaticImportOnDemandDeclaration n, A arg); + + void visit(TypeImportOnDemandDeclaration 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 cab3ef4962..d3335287f6 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 @@ -22,6 +22,7 @@ package com.github.javaparser.ast.visitor; import com.github.javaparser.ast.*; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.type.TypeParameter; import com.github.javaparser.ast.body.AnnotationDeclaration; @@ -412,11 +413,6 @@ public abstract class VoidVisitorAdapter implements VoidVisitor { } } - @Override public void visit(final ImportDeclaration n, final A arg) { - visitComment(n.getComment(), arg); - n.getName().accept(this, arg); - } - @Override public void visit(final InitializerDeclaration n, final A arg) { visitComment(n.getComment(), arg); n.getBlock().accept(this, arg); @@ -792,6 +788,36 @@ public void visit(ArrayBracketPair n, A arg) { visitAnnotations(n, arg); } + @Override + public void visit(EmptyImportDeclaration n, A arg) { + visitComment(n.getComment(), arg); + + } + + @Override + public void visit(SingleStaticImportDeclaration n, A arg) { + visitComment(n.getComment(), arg); + n.getType().accept(this, arg); + } + + @Override + public void visit(SingleTypeImportDeclaration n, A arg) { + visitComment(n.getComment(), arg); + n.getType().accept(this, arg); + } + + @Override + public void visit(StaticImportOnDemandDeclaration n, A arg) { + visitComment(n.getComment(), arg); + n.getType().accept(this, arg); + } + + @Override + public void visit(TypeImportOnDemandDeclaration n, A arg) { + visitComment(n.getComment(), arg); + n.getName().accept(this, arg); + } + private void visitComment(final Comment n, final A arg) { if (n != null) { n.accept(this, arg); diff --git a/javaparser-core/src/main/javacc/java_1_8.jj b/javaparser-core/src/main/javacc/java_1_8.jj index 54b9c11e79..e1869a9005 100644 --- a/javaparser-core/src/main/javacc/java_1_8.jj +++ b/javaparser-core/src/main/javacc/java_1_8.jj @@ -49,6 +49,7 @@ import java.util.*; import com.github.javaparser.ast.*; import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.comments.*; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.type.*; @@ -1276,22 +1277,12 @@ CompilationUnit CompilationUnit(): } { [ LOOKAHEAD(PackageDeclaration()) pakage = PackageDeclaration() {begin = begin.orIfInvalid(pakage.getBegin());} ] - ( in = ImportDeclaration() { begin = begin.orIfInvalid(in.getBegin()); imports = add(imports, in); } | - in = EmptyImportDeclaration() { begin = begin.orIfInvalid(in.getBegin()); imports = add(imports, in); } )* + ( in = ImportDeclaration() { begin = begin.orIfInvalid(in.getBegin()); imports = add(imports, in); } )* ( tn = TypeDeclaration() { begin = begin.orIfInvalid(tn.getBegin()); types = add(types, tn); } )* ( | "\u001A" /** ctrl+z char **/) { return new CompilationUnit(begin.invalid() ? Range.UNKNOWN : range(begin, tokenEnd()), pakage, imports, types); } } -ImportDeclaration EmptyImportDeclaration(): -{ - Position begin; -} -{ - ";" {begin = tokenBegin();} - { return ImportDeclaration.createEmptyDeclaration(range(begin, tokenEnd())); } -} - PackageDeclaration PackageDeclaration(): { List annotations = null; @@ -1306,17 +1297,24 @@ PackageDeclaration PackageDeclaration(): ImportDeclaration ImportDeclaration(): { - NameExpr name; - boolean isStatic = false; - boolean isAsterisk = false; - Position begin; + NameExpr name; + boolean isStatic = false; + boolean isAsterisk = false; + Position begin; + ImportDeclaration ret; } { - "import" {begin = tokenBegin();} - [ "static" { isStatic = true; } ] - name = Name() - [ "." "*" { isAsterisk = true; } ] ";" - { return new ImportDeclaration(range(begin, tokenEnd()),name, isStatic, isAsterisk); } + ( + "import" {begin = tokenBegin();} + [ "static" { isStatic = true; } ] + name = Name() + [ "." "*" { isAsterisk = true; } ] ";" + { ret = ImportDeclaration.create(range(begin, tokenEnd()), name, isStatic, isAsterisk); } + | + ";" {begin = tokenBegin();} + { ret = new EmptyImportDeclaration(range(begin, tokenEnd())); } + ) + { return ret; } } /* diff --git a/javaparser-testing/src/test/java/com/github/javaparser/ast/expr/QualifiedNameExprTest.java b/javaparser-testing/src/test/java/com/github/javaparser/ast/expr/QualifiedNameExprTest.java new file mode 100644 index 0000000000..4fc10a55b8 --- /dev/null +++ b/javaparser-testing/src/test/java/com/github/javaparser/ast/expr/QualifiedNameExprTest.java @@ -0,0 +1,19 @@ +package com.github.javaparser.ast.expr; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class QualifiedNameExprTest { + @Test + public void outerNameExprIsTheRightMostIdentifier() { + NameExpr name = NameExpr.name("a.b.c"); + assertEquals("c", name.getName()); + } + + @Test + public void parsingAndUnparsingWorks() { + NameExpr name = NameExpr.name("a.b.c"); + assertEquals("a.b.c", name.getQualifiedName()); + } +} \ No newline at end of file diff --git a/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/CommentParsingSteps.java b/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/CommentParsingSteps.java index f88818b0e3..1fb576e94c 100644 --- a/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/CommentParsingSteps.java +++ b/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/CommentParsingSteps.java @@ -95,7 +95,7 @@ public void whenTheClassIsParsedByTheJavaParser() { compilationUnit = new JavaParser(configuration).parse(COMPILATION_UNIT, provider(sourceUnderTest)).getResult().get(); } - @Then("the Java parser cannot parse it because of lexical errors") + @Then("the Java parser cannot parse it because of an error") public void javaParserCannotParseBecauseOfLexicalErrors() { ParseResult result = new JavaParser(configuration).parse(COMPILATION_UNIT, provider(sourceUnderTest)); if(result.isSuccessful()){ diff --git a/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/ExistenceOfParentNodeVerifier.java b/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/ExistenceOfParentNodeVerifier.java index 562c77ff00..ab133a9d83 100644 --- a/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/ExistenceOfParentNodeVerifier.java +++ b/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/ExistenceOfParentNodeVerifier.java @@ -23,7 +23,11 @@ import com.github.javaparser.ast.*; import com.github.javaparser.ast.body.*; +import com.github.javaparser.ast.comments.BlockComment; +import com.github.javaparser.ast.comments.JavadocComment; +import com.github.javaparser.ast.comments.LineComment; import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.type.*; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; @@ -94,6 +98,11 @@ public void visit(BinaryExpr n, Void arg) { super.visit(n, arg); } + @Override + public void visit(BlockComment n, Void arg) { + super.visit(n, arg); + } + @Override public void visit(BlockStmt n, Void arg) { assertParentIsSet(n); @@ -148,6 +157,11 @@ public void visit(ClassOrInterfaceType n, Void arg) { super.visit(n, arg); } + @Override + public void visit(CompilationUnit n, Void arg) { + super.visit(n, arg); + } + @Override public void visit(ConditionalExpr n, Void arg) { assertParentIsSet(n); @@ -256,12 +270,6 @@ public void visit(IfStmt n, Void arg) { super.visit(n, arg); } - @Override - public void visit(ImportDeclaration n, Void arg) { - assertParentIsSet(n); - super.visit(n, arg); - } - @Override public void visit(InitializerDeclaration n, Void arg) { assertParentIsSet(n); @@ -286,12 +294,22 @@ public void visit(IntegerLiteralMinValueExpr n, Void arg) { super.visit(n, arg); } + @Override + public void visit(JavadocComment n, Void arg) { + super.visit(n, arg); + } + @Override public void visit(LabeledStmt n, Void arg) { assertParentIsSet(n); super.visit(n, arg); } + @Override + public void visit(LineComment n, Void arg) { + super.visit(n, arg); + } + @Override public void visit(LambdaExpr n, Void arg) { assertParentIsSet(n); @@ -388,6 +406,30 @@ public void visit(QualifiedNameExpr n, Void arg) { super.visit(n, arg); } + @Override + public void visit(ArrayType n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + + @Override + public void visit(ArrayCreationLevel n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + + @Override + public void visit(IntersectionType n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + + @Override + public void visit(UnionType n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + @Override public void visit(ReturnStmt n, Void arg) { assertParentIsSet(n); @@ -460,6 +502,42 @@ public void visit(TypeExpr n, Void arg) { super.visit(n, arg); } + @Override + public void visit(ArrayBracketPair n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + + @Override + public void visit(EmptyImportDeclaration n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + + @Override + public void visit(SingleStaticImportDeclaration n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + + @Override + public void visit(SingleTypeImportDeclaration n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + + @Override + public void visit(StaticImportOnDemandDeclaration n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + + @Override + public void visit(TypeImportOnDemandDeclaration n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + @Override public void visit(TypeParameter n, Void arg) { assertParentIsSet(n); @@ -472,6 +550,12 @@ public void visit(UnaryExpr n, Void arg) { super.visit(n, arg); } + @Override + public void visit(UnknownType n, Void arg) { + assertParentIsSet(n); + super.visit(n, arg); + } + @Override public void visit(VariableDeclarationExpr n, Void arg) { assertParentIsSet(n); diff --git a/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/ParsingSteps.java b/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/ParsingSteps.java index d50f052a42..2963077951 100644 --- a/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/ParsingSteps.java +++ b/javaparser-testing/src/test/java/com/github/javaparser/bdd/steps/ParsingSteps.java @@ -21,6 +21,8 @@ package com.github.javaparser.bdd.steps; +import static com.github.javaparser.ParseStart.*; +import static com.github.javaparser.Providers.provider; import static com.github.javaparser.bdd.steps.SharedSteps.getMemberByTypeAndPosition; import static com.github.javaparser.bdd.steps.SharedSteps.getMethodByPositionAndClassPosition; import static java.lang.String.format; @@ -36,6 +38,8 @@ import java.util.Map; import com.github.javaparser.ParseProblemException; +import com.github.javaparser.ParseResult; +import com.github.javaparser.ParseStart; import org.jbehave.core.annotations.Given; import org.jbehave.core.annotations.Then; import org.jbehave.core.annotations.When; @@ -330,23 +334,11 @@ public void thenTheUsesDiamondOperatorShouldBeBooleanAsString(boolean expectedVa assertEquals(expectedValue, expr.getType().isUsingDiamondOperator()); } - @Then("the Java parser cannot parse it because of lexical errors") + @Then("the Java parser cannot parse it because of an error") public void javaParserCannotParseBecauseOfLexicalErrors() { - try { - JavaParser.parse(sourceUnderTest); + ParseResult result = new JavaParser().parse(COMPILATION_UNIT, provider(sourceUnderTest)); + if(result.isSuccessful()) { fail("Lexical error expected"); - } catch (ParseProblemException e) { - // ok - } - } - - @Then("the Java parser cannot parse it because of a parse error") - public void javaParserCannotParseBecauseOfAParseError() { - try { - JavaParser.parse(sourceUnderTest); - fail("Parse error expected"); - } catch (ParseProblemException e) { - // ok } } diff --git a/javaparser-testing/src/test/java/com/github/javaparser/bdd/visitors/PositionTestVisitor.java b/javaparser-testing/src/test/java/com/github/javaparser/bdd/visitors/PositionTestVisitor.java index fcb0e20209..1bd9b08049 100644 --- a/javaparser-testing/src/test/java/com/github/javaparser/bdd/visitors/PositionTestVisitor.java +++ b/javaparser-testing/src/test/java/com/github/javaparser/bdd/visitors/PositionTestVisitor.java @@ -27,6 +27,7 @@ import com.github.javaparser.ast.comments.JavadocComment; import com.github.javaparser.ast.comments.LineComment; import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.imports.*; import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.type.*; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; @@ -130,6 +131,42 @@ public void visit(TypeExpr n, Object arg) { super.visit(n, arg); } + @Override + public void visit(ArrayBracketPair n, Object arg) { + doTest(n); + super.visit(n, arg); + } + + @Override + public void visit(EmptyImportDeclaration n, Object arg) { + doTest(n); + super.visit(n, arg); + } + + @Override + public void visit(SingleStaticImportDeclaration n, Object arg) { + doTest(n); + super.visit(n, arg); + } + + @Override + public void visit(SingleTypeImportDeclaration n, Object arg) { + doTest(n); + super.visit(n, arg); + } + + @Override + public void visit(StaticImportOnDemandDeclaration n, Object arg) { + doTest(n); + super.visit(n, arg); + } + + @Override + public void visit(TypeImportOnDemandDeclaration n, Object arg) { + doTest(n); + super.visit(n, arg); + } + @Override public void visit(final CharLiteralExpr n, final Object arg) { doTest(n); super.visit(n, arg); @@ -247,11 +284,6 @@ public void visit(TypeExpr n, Object arg) { super.visit(n, arg); } - @Override public void visit(final ImportDeclaration n, final Object arg) { - doTest(n); - super.visit(n, arg); - } - @Override public void visit(final InitializerDeclaration n, final Object arg) { doTest(n); super.visit(n, arg); diff --git a/javaparser-testing/src/test/java/com/github/javaparser/junit/builders/NodeWithAnnotationsBuildersTest.java b/javaparser-testing/src/test/java/com/github/javaparser/junit/builders/NodeWithAnnotationsBuildersTest.java index 1e8dc5bb08..507d1297c6 100644 --- a/javaparser-testing/src/test/java/com/github/javaparser/junit/builders/NodeWithAnnotationsBuildersTest.java +++ b/javaparser-testing/src/test/java/com/github/javaparser/junit/builders/NodeWithAnnotationsBuildersTest.java @@ -35,7 +35,7 @@ public void teardown() { @Test public void testAddAnnotation() { NormalAnnotationExpr annotation = testClass.addAnnotation(hey.class); - assertEquals("com.github.javaparser.junit.builders.NodeWithAnnotationsBuildersTest$hey", cu.getImports().get(0).getName().toString()); + assertEquals("import com.github.javaparser.junit.builders.NodeWithAnnotationsBuildersTest$hey;", cu.getImports().get(0).toString().trim()); assertEquals(1, testClass.getAnnotations().size()); assertEquals(annotation, testClass.getAnnotations().get(0)); assertEquals(NormalAnnotationExpr.class, testClass.getAnnotations().get(0).getClass()); diff --git a/javaparser-testing/src/test/resources/com/github/javaparser/bdd/comment_parsing_scenarios.story b/javaparser-testing/src/test/resources/com/github/javaparser/bdd/comment_parsing_scenarios.story index 78c19bd630..e41d6e4979 100644 --- a/javaparser-testing/src/test/resources/com/github/javaparser/bdd/comment_parsing_scenarios.story +++ b/javaparser-testing/src/test/resources/com/github/javaparser/bdd/comment_parsing_scenarios.story @@ -183,7 +183,7 @@ Then the total number of comments is 0 Given the class: /*/ class Foo {} -Then the Java parser cannot parse it because of lexical errors +Then the Java parser cannot parse it because of an error Scenario: Should recognize /*/ inside a block comment diff --git a/javaparser-testing/src/test/resources/com/github/javaparser/bdd/dumping_scenarios.story b/javaparser-testing/src/test/resources/com/github/javaparser/bdd/dumping_scenarios.story index a47b343514..0fb9cc0d45 100644 --- a/javaparser-testing/src/test/resources/com/github/javaparser/bdd/dumping_scenarios.story +++ b/javaparser-testing/src/test/resources/com/github/javaparser/bdd/dumping_scenarios.story @@ -215,13 +215,41 @@ Then it is dumped to: while (true) { } -Scenario: we can parse imports +Scenario: we can parse static on demand imports Given the import: import static a.b.c.Abc.*; When the import is parsed by the Java parser Then it is dumped to: import static a.b.c.Abc.*; +Scenario: we can parse static type imports +Given the import: +import static a.b.c.Abc; +When the import is parsed by the Java parser +Then it is dumped to: +import static a.b.c.Abc; + +Scenario: we can parse on demand imports +Given the import: +import a.b.c.*; +When the import is parsed by the Java parser +Then it is dumped to: +import a.b.c.*; + +Scenario: we can parse type imports +Given the import: +import a.b.c.Abc; +When the import is parsed by the Java parser +Then it is dumped to: +import a.b.c.Abc; + +Scenario: we can parse empty imports +Given the import: +; +When the import is parsed by the Java parser +Then it is dumped to: +; + Scenario: we can parse annotations Given the annotation: @Abc @@ -492,4 +520,4 @@ interface A extends @X B, @Y C, @Z D { When the class is parsed by the Java parser Then it is dumped to: interface A extends @X B, @Y C, @Z D { -} \ No newline at end of file +} diff --git a/javaparser-testing/src/test/resources/com/github/javaparser/bdd/parsing_scenarios.story b/javaparser-testing/src/test/resources/com/github/javaparser/bdd/parsing_scenarios.story index c26fef20c3..ea564c5564 100644 --- a/javaparser-testing/src/test/resources/com/github/javaparser/bdd/parsing_scenarios.story +++ b/javaparser-testing/src/test/resources/com/github/javaparser/bdd/parsing_scenarios.story @@ -377,7 +377,7 @@ class A { world"; } } -Then the Java parser cannot parse it because of lexical errors +Then the Java parser cannot parse it because of an error Scenario: Chars with unescaped newlines are illegal (issue 211) Given the class: @@ -387,7 +387,7 @@ class A { '; } } -Then the Java parser cannot parse it because of lexical errors +Then the Java parser cannot parse it because of an error Scenario: Diamond Operator information is exposed @@ -476,7 +476,7 @@ class A { } } } -Then the Java parser cannot parse it because of a parse error +Then the Java parser cannot parse it because of an error Scenario: Partially dimensioned arrays are fine