diff options
| author | Markus Keller | 2013-05-03 16:49:37 +0000 |
|---|---|---|
| committer | Markus Keller | 2013-05-03 16:49:37 +0000 |
| commit | 04abb6d1e9cce4ccf64496ee5f7d45399d283bd2 (patch) | |
| tree | 38924c5eb3d49a9d3a10a8b585e5ec8fe1e69340 | |
| parent | 28d58bf6eb942015446b8ffce8f446f86e9686d9 (diff) | |
| download | eclipse.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
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 |
