Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Keller2013-05-03 16:49:37 +0000
committerMarkus Keller2013-05-03 16:49:37 +0000
commit04abb6d1e9cce4ccf64496ee5f7d45399d283bd2 (patch)
tree38924c5eb3d49a9d3a10a8b585e5ec8fe1e69340
parent28d58bf6eb942015446b8ffce8f446f86e9686d9 (diff)
downloadeclipse.jdt.core-04abb6d1e9cce4ccf64496ee5f7d45399d283bd2.tar.gz
eclipse.jdt.core-04abb6d1e9cce4ccf64496ee5f7d45399d283bd2.tar.xz
eclipse.jdt.core-04abb6d1e9cce4ccf64496ee5f7d45399d283bd2.zip
Bug 406469: [1.8][dom ast] ASTRewrite support for PackageQualifiedType
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeAnnotationsTest.java125
-rw-r--r--org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java14
-rw-r--r--org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java15
3 files changed, 154 insertions, 0 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeAnnotationsTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeAnnotationsTest.java
index bb1ab58939..258cc383fe 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeAnnotationsTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTypeAnnotationsTest.java
@@ -860,4 +860,129 @@ public class ASTRewritingTypeAnnotationsTest extends ASTRewritingTest {
assertEqualString(preview, buf.toString());
}
+ /**
+ * ASTRewriterTests for PackageQualifiedType
+ * @throws Exception
+ *
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=406469
+ */
+ public void testPackageQualifiedTypeAnnotations() throws Exception {
+ if (this.apiLevel < AST.JLS8) return;
+ IPackageFragment pack1= this.sourceFolder.createPackageFragment("test406469.bug", false, null);
+ String contents = "package test406469.bug;\n" +
+ "import java.lang.annotation.*;\n" +
+ "public class X {\n" +
+ " @Target(ElementType.TYPE_USE)\n" +
+ " @Retention(RetentionPolicy.RUNTIME)\n" +
+ " @Documented\n" +
+ " static @interface NonNull { }\n" +
+ " class Inner {}\n" +
+ " \n" +
+ " /**\n" +
+ " * @param arg \n" +
+ " */\n" +
+ " test406469.bug.@NonNull IOException foo(\n" +
+ " test406469.bug.@NonNull FileNotFoundException arg)\n" +
+ " throws test406469.bug.@NonNull EOFException {\n" +
+ " try {\n" +
+ " test406469.bug.@NonNull IOError e = new test406469.bug.IOError();\n" +
+ " throw e;\n" +
+ " } catch (test406469.bug.@NonNull IOError e) {\n" +
+ " }\n" +
+ " return null;\n" +
+ " } \n" +
+ " test406469.bug.@NonNull X.@NonNull Inner fInner;\n" +
+ "} \n" +
+ "@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE) @interface Marker {} \n" +
+ "\n" +
+ "class Outer {\n" +
+ " public class Inner {\n" +
+ " public class Deeper {}\n" +
+ " }\n" +
+ "}\n" +
+ "class IOException extends Exception {private static final long serialVersionUID=10001L;}\n" +
+ "class FileNotFoundException extends Exception{private static final long serialVersionUID=10002L;}\n" +
+ "class EOFException extends Exception{private static final long serialVersionUID=10003L;}\n" +
+ "class IOError extends Exception{private static final long serialVersionUID=10004L;}\n";
+ StringBuffer buf = new StringBuffer(contents);
+ ICompilationUnit cu= pack1.createCompilationUnit("X.java", buf.toString(), false, null);
+ CompilationUnit astRoot= createAST(cu, /* resolve */ true, false);
+ ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST());
+ AST ast= astRoot.getAST();
+ TypeDeclaration typeDeclaration= findTypeDeclaration(astRoot, "X");
+ MethodDeclaration methodDeclaration= findMethodDeclaration(typeDeclaration, "foo");
+ { //replace an annotation.
+ PackageQualifiedType packageQualifiedType = (PackageQualifiedType) methodDeclaration.getReturnType2();
+ MarkerAnnotation markerAnnotation= ast.newMarkerAnnotation();
+ markerAnnotation.setTypeName(ast.newSimpleName("Marker"));
+ rewrite.replace((ASTNode) packageQualifiedType.annotations().get(0), markerAnnotation, null);
+
+ // remove an annotation
+ SingleVariableDeclaration param = (SingleVariableDeclaration) methodDeclaration.parameters().get(0);
+ packageQualifiedType = (PackageQualifiedType) param.getType();
+ rewrite.remove((ASTNode) packageQualifiedType.annotations().get(0), null);
+
+ // insert an annotation after an existing annotation
+ packageQualifiedType = (PackageQualifiedType) methodDeclaration.thrownExceptionTypes().get(0);
+ markerAnnotation= ast.newMarkerAnnotation();
+ markerAnnotation.setTypeName(ast.newSimpleName("Marker"));
+ rewrite.getListRewrite(packageQualifiedType, PackageQualifiedType.ANNOTATIONS_PROPERTY).insertLast(markerAnnotation, null);
+
+ /* insert an annotation in a type not converted as a PackageQualifiedType. This would involve
+ * creation of a PackageQualifiedType from fields of the existing type.
+ */
+ TryStatement tryStatement = (TryStatement) methodDeclaration.getBody().statements().get(0);
+ VariableDeclarationStatement variableDeclarationStatement = (VariableDeclarationStatement) tryStatement.getBody().statements().get(0);
+ VariableDeclarationFragment variableDeclarationFragment = (VariableDeclarationFragment) variableDeclarationStatement.fragments().get(0);
+ ClassInstanceCreation classInstanceCreation = (ClassInstanceCreation) variableDeclarationFragment.getInitializer();
+ SimpleType simpleType = (SimpleType) classInstanceCreation.getType();
+ QualifiedName qualifiedName = (QualifiedName) simpleType.getName();
+ SimpleName simpleName = ast.newSimpleName(qualifiedName.getName().getIdentifier());
+ qualifiedName = (QualifiedName) qualifiedName.getQualifier();
+ qualifiedName = ast.newQualifiedName(ast.newName(qualifiedName.getQualifier().toString()), ast.newSimpleName(qualifiedName.getName().toString()));
+ packageQualifiedType = ast.newPackageQualifiedType(qualifiedName, simpleName);
+ markerAnnotation= ast.newMarkerAnnotation();
+ markerAnnotation.setTypeName(ast.newSimpleName("Marker"));
+ rewrite.getListRewrite(packageQualifiedType, PackageQualifiedType.ANNOTATIONS_PROPERTY).insertLast(markerAnnotation, null);
+ rewrite.replace(classInstanceCreation.getType(), packageQualifiedType, null);
+ }
+ String preview= evaluateRewrite(cu, rewrite);
+ String contentsmodified = "package test406469.bug;\n" +
+ "import java.lang.annotation.*;\n" +
+ "public class X {\n" +
+ " @Target(ElementType.TYPE_USE)\n" +
+ " @Retention(RetentionPolicy.RUNTIME)\n" +
+ " @Documented\n" +
+ " static @interface NonNull { }\n" +
+ " class Inner {}\n" +
+ " \n" +
+ " /**\n" +
+ " * @param arg \n" +
+ " */\n" +
+ " test406469.bug.@Marker IOException foo(\n" +
+ " FileNotFoundException arg)\n" +
+ " throws test406469.bug.@NonNull @Marker EOFException {\n" +
+ " try {\n" +
+ " test406469.bug.@NonNull IOError e = new test406469.bug.@Marker IOError();\n" +
+ " throw e;\n" +
+ " } catch (test406469.bug.@NonNull IOError e) {\n" +
+ " }\n" +
+ " return null;\n" +
+ " } \n" +
+ " test406469.bug.@NonNull X.@NonNull Inner fInner;\n" +
+ "} \n" +
+ "@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE) @interface Marker {} \n" +
+ "\n" +
+ "class Outer {\n" +
+ " public class Inner {\n" +
+ " public class Deeper {}\n" +
+ " }\n" +
+ "}\n" +
+ "class IOException extends Exception {private static final long serialVersionUID=10001L;}\n" +
+ "class FileNotFoundException extends Exception{private static final long serialVersionUID=10002L;}\n" +
+ "class EOFException extends Exception{private static final long serialVersionUID=10003L;}\n" +
+ "class IOError extends Exception{private static final long serialVersionUID=10004L;}\n";
+ assertEqualString(preview, contentsmodified);
+ }
+
} \ No newline at end of file
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
index 7adedd21b5..fdd430d673 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
@@ -3972,6 +3972,20 @@ public final class ASTRewriteAnalyzer extends ASTVisitor {
return false;
}
/* (non-Javadoc)
+ * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.PackageQualifiedType)
+ */
+ public boolean visit(PackageQualifiedType node) {
+ if (!hasChildrenChanges(node)) {
+ return doVisitUnchangedChildren(node);
+ }
+ rewriteRequiredNode(node, PackageQualifiedType.QUALIFIER_PROPERTY);
+ if (node.getAST().apiLevel() >= AST.JLS8) {
+ rewriteTypeAnnotations(node, PackageQualifiedType.ANNOTATIONS_PROPERTY, node.getStartPosition());
+ }
+ rewriteRequiredNode(node, PackageQualifiedType.NAME_PROPERTY);
+ return false;
+ }
+ /* (non-Javadoc)
* @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ParameterizedType)
*/
public boolean visit(ParameterizedType node) {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
index a031c72045..15cf59bbd2 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java
@@ -1409,6 +1409,21 @@ public class ASTRewriteFlattener extends ASTVisitor {
this.result.append(')');
return false;
}
+
+ /*
+ * @see ASTVisitor#visit(PackageQualifiedType)
+ * @since 3.9 BETA_JAVA8
+ */
+ public boolean visit(PackageQualifiedType node) {
+ getChildNode(node, PackageQualifiedType.QUALIFIER_PROPERTY).accept(this);
+ this.result.append('.');
+ if (node.getAST().apiLevel() >= AST.JLS8) {
+ visitList(node, PackageQualifiedType.ANNOTATIONS_PROPERTY, String.valueOf(' '), Util.EMPTY_STRING, String.valueOf(' '));
+ }
+ getChildNode(node, PackageQualifiedType.NAME_PROPERTY).accept(this);
+ return false;
+ }
+
/*
* @see ASTVisitor#visit(ParameterizedType)
* @since 3.0

Back to the top