diff options
| author | Markus Keller | 2013-10-17 17:10:26 +0000 |
|---|---|---|
| committer | Markus Keller | 2013-10-17 17:15:36 +0000 |
| commit | 6c3b6971f88c7f6d5be3c70fdaf936700dc7f94b (patch) | |
| tree | 5669910d5a525918c341f4e4e1b1efdd1ca1b86f | |
| parent | a2380c5dc7487191ba2f073fdb6868b729cb0c57 (diff) | |
| download | eclipse.jdt.core-6c3b6971f88c7f6d5be3c70fdaf936700dc7f94b.tar.gz eclipse.jdt.core-6c3b6971f88c7f6d5be3c70fdaf936700dc7f94b.tar.xz eclipse.jdt.core-6c3b6971f88c7f6d5be3c70fdaf936700dc7f94b.zip | |
Bug 419748: [1.8][dom ast] MethodDeclaration's receiverType cannot be AnnotatableType
5 files changed, 61 insertions, 15 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java index 7af45d87c4..5d45f927e7 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java @@ -1039,8 +1039,8 @@ public class ASTConverter18Test extends ConverterTestSetup { node = getASTNode(unit, 0, 0); assertEquals("Not a method Declaration", ASTNode.METHOD_DECLARATION, node.getNodeType()); MethodDeclaration method = (MethodDeclaration) node; - AnnotatableType receiver = method.getReceiverType(); - assertEquals("Not an annotatable type", ASTNode.SIMPLE_TYPE, receiver.getNodeType()); + Type receiver = method.getReceiverType(); + assertEquals("Not a simple type", ASTNode.SIMPLE_TYPE, receiver.getNodeType()); assertEquals("Incorrect receiver signature", "@Marker @Marker2 X", ((SimpleType) receiver).toString()); assertEquals("Incorrect annotations on receiver", 2, ((SimpleType) receiver).annotations().size()); assertNull("Incorrect receiver qualfier", method.getReceiverQualifier()); @@ -1067,8 +1067,8 @@ public class ASTConverter18Test extends ConverterTestSetup { TypeDeclaration innerType = (TypeDeclaration) node; assertEquals("Incorrect no of methods", 1, innerType.getMethods().length); MethodDeclaration method = innerType.getMethods()[0]; - AnnotatableType receiver = method.getReceiverType(); - assertEquals("Not an annotatable type", ASTNode.SIMPLE_TYPE, receiver.getNodeType()); + Type receiver = method.getReceiverType(); + assertEquals("Not a simple type", ASTNode.SIMPLE_TYPE, receiver.getNodeType()); assertEquals("Incorrect receiver signature", "@Marker @Marker2 X", ((SimpleType) receiver).toString()); assertEquals("Incorrect annotations on receiver", 2, ((SimpleType) receiver).annotations().size()); assertNotNull("Incorrect receiver qualfier", method.getReceiverQualifier()); @@ -1365,7 +1365,7 @@ public class ASTConverter18Test extends ConverterTestSetup { + "@Target (java.lang.annotation.ElementType.TYPE_USE)\n" + "@interface Marker2 {}\n"; CompilationUnit cu = (CompilationUnit) buildAST(contents, this.workingCopy); - // simple tye for generic type arguments in a generic method or constructor invocation + // simple type for generic type arguments in a generic method or constructor invocation MethodDeclaration methodDeclaration = (MethodDeclaration) getASTNode(cu, 0, 0); List statements = methodDeclaration.getBody().statements(); Statement statement = (Statement)statements.get(0); @@ -2053,8 +2053,8 @@ public class ASTConverter18Test extends ConverterTestSetup { node = (ASTNode) type.bodyDeclarations().get(0); assertEquals("Not a method Declaration", ASTNode.METHOD_DECLARATION, node.getNodeType()); MethodDeclaration method = (MethodDeclaration) node; - AnnotatableType receiver = method.getReceiverType(); - assertEquals("Not an annotatable type", ASTNode.QUALIFIED_TYPE, receiver.getNodeType()); + Type receiver = method.getReceiverType(); + assertEquals("Not a qualified type", ASTNode.QUALIFIED_TYPE, receiver.getNodeType()); assertEquals("Incorrect receiver", "@A X.@B Y", ((QualifiedType) receiver).toString()); assertEquals("Incorrect method signature", "public Z(@A X.@B Y Y.this,String str){\n}\n", method.toString()); @@ -2063,6 +2063,52 @@ public class ASTConverter18Test extends ConverterTestSetup { assertEquals("Incorrect receiver", "@A X.@B Y.@C Z", ((QualifiedType) receiver).toString()); assertEquals("Incorrect method signature", "public void foo(@A X.@B Y.@C Z this,String str){\n}\n", method.toString()); } + public void testParameterizedReceiverType() throws JavaModelException { + String contents = + "import java.lang.annotation.*;\n" + + "public class X<T extends Exception> {\n" + + " class Y<K, V> {\n" + + " class Z {\n" + +//TODO: bad AST node structure: +// " public Z(@A X<T>.@B Y<K, V> Y.this){\n}" + +// " public void foo(@B Y<K, V>.@C Z this){\n}\n" + + " public Z(X<T>.@B Y<K, V> Y.this){\n}" + + " public void foo(Y<K, V>.@C Z this){\n}\n" + + " }\n" + + " }\n" + + "}\n" + + "@Target(ElementType.TYPE_USE)\n" + + "@interface A {}\n" + + "@Target(ElementType.TYPE_USE)\n" + + "@interface B {}\n" + + "@Target(ElementType.TYPE_USE)\n" + + "@interface C {}\n"; + this.workingCopy = getWorkingCopy("/Converter18/src/X.java", true); + ASTNode node = buildAST(contents, this.workingCopy); + assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType()); + CompilationUnit unit = (CompilationUnit) node; + node = getASTNode(unit, 0, 0); + TypeDeclaration type = (TypeDeclaration)node; + node = (ASTNode) type.bodyDeclarations().get(0); + type = (TypeDeclaration) node; + node = (ASTNode) type.bodyDeclarations().get(0); + assertEquals("Not a method Declaration", ASTNode.METHOD_DECLARATION, node.getNodeType()); + MethodDeclaration method = (MethodDeclaration) node; + Type receiver = method.getReceiverType(); +//TODO: bad AST node structure: +// assertEquals("Incorrect receiver", "@A X<T>.@B Y<K,V>", ((QualifiedType) receiver).toString()); +// assertEquals("Incorrect method signature", "public Z(@A X<T>.@B Y<K,V> Y.this){\n}\n", method.toString()); + assertEquals("Incorrect receiver", "X<T>.@B Y<K,V>", ((ParameterizedType) receiver).toString()); + assertEquals("Incorrect method signature", "public Z(X<T>.@B Y<K,V> Y.this){\n}\n", method.toString()); + + method = (MethodDeclaration) type.bodyDeclarations().get(1); + receiver = method.getReceiverType(); +//TODO: bad AST node structure: +// assertEquals("Incorrect receiver", "@B Y<K,V>.@C Z", ((QualifiedType) receiver).toString()); +// assertEquals("Incorrect method signature", "public void foo(@B Y<K,V>.@C Z this){\n}\n", method.toString()); + assertEquals("Incorrect receiver", "Y<K,V>.@C Z", ((QualifiedType) receiver).toString()); + assertEquals("Incorrect method signature", "public void foo(Y<K,V>.@C Z this){\n}\n", method.toString()); + } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=403410 public void testBug403410() throws JavaModelException { String contents = @@ -2229,7 +2275,7 @@ public class ASTConverter18Test extends ConverterTestSetup { assertEquals("Not a method Declaration", ASTNode.METHOD_DECLARATION, node.getNodeType()); MethodDeclaration method = (MethodDeclaration) node; assertEquals("Method should not be malformed", 0, (method.getFlags() & ASTNode.MALFORMED)); - AnnotatableType annotatableType = method.getReceiverType(); + Type annotatableType = method.getReceiverType(); assertTrue(annotatableType.isQualifiedType()); QualifiedType qualifiedType = (QualifiedType) annotatableType; assertEquals("wrong qualified type", "@A X.@B Y", qualifiedType.toString()); diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingMethodDeclTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingMethodDeclTest.java index 89ed05d5f0..c92313a7d9 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingMethodDeclTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingMethodDeclTest.java @@ -3275,7 +3275,7 @@ public class ASTRewritingMethodDeclTest extends ASTRewritingTest { ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST()); AST ast = astRoot.getAST(); MethodDeclaration method = (MethodDeclaration) findTypeDeclaration(astRoot, "X").bodyDeclarations().get(0); - AnnotatableType receiverType = method.getReceiverType(); + Type receiverType = method.getReceiverType(); assertEquals("Invalid receiver type", ASTNode.SIMPLE_TYPE, receiverType.getNodeType()); MarkerAnnotation annot = ast.newMarkerAnnotation(); annot.setTypeName(ast.newSimpleName("Marker")); @@ -3461,7 +3461,7 @@ public class ASTRewritingMethodDeclTest extends ASTRewritingTest { rewrite.set(method4, MethodDeclaration.RECEIVER_QUALIFIER_PROPERTY, null, null); ListRewrite listRewrite = rewrite.getListRewrite(method4.getReceiverType(), SimpleType.ANNOTATIONS_PROPERTY); - listRewrite.remove((ASTNode) method4.getReceiverType().annotations().get(0), null); + listRewrite.remove((ASTNode) ((AnnotatableType) method4.getReceiverType()).annotations().get(0), null); rewrite.set(method5, MethodDeclaration.RECEIVER_TYPE_PROPERTY, null, null); List params = method5.parameters(); diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java index 9d268f3a08..c7261912a7 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java @@ -885,7 +885,7 @@ class ASTConverter { recordNodes(name, receiver); } } - AnnotatableType type = (AnnotatableType) convertType(receiver.type); + Type type = convertType(receiver.type); methodDecl.setReceiverType(type); if (receiver.modifiers != 0) { methodDecl.setFlags(methodDecl.getFlags() | ASTNode.MALFORMED); diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java index c03425b6d1..25063f3614 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java @@ -281,7 +281,7 @@ public class MethodDeclaration extends BodyDeclaration { * Defaults to none. * @since 3.9 BETA_JAVA8 */ - private AnnotatableType optionalReceiverType = null; + private Type optionalReceiverType = null; /** * Qualifying name of the explicit </code>this</code> parameter, or <code>null</code> if none. @@ -734,7 +734,7 @@ public class MethodDeclaration extends BodyDeclaration { * @exception UnsupportedOperationException if this operation is used below JLS8 * @since 3.9 BETA_JAVA8 */ - public AnnotatableType getReceiverType() { + public Type getReceiverType() { unsupportedIn2_3_4(); return this.optionalReceiverType; } @@ -749,7 +749,7 @@ public class MethodDeclaration extends BodyDeclaration { * @exception UnsupportedOperationException if this operation is used below JLS8 * @since 3.9 BETA_JAVA8 */ - public void setReceiverType(AnnotatableType receiverType) { + public void setReceiverType(Type receiverType) { unsupportedIn2_3_4(); ASTNode oldChild = this.optionalReceiverType; preReplaceChild(oldChild, receiverType, RECEIVER_TYPE_PROPERTY); diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java index f3093d3daf..6305d7f757 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java @@ -1049,7 +1049,7 @@ public class NaiveASTFlattener extends ASTVisitor { node.getName().accept(this); this.buffer.append("(");//$NON-NLS-1$ if (node.getAST().apiLevel() >= AST.JLS8) { - AnnotatableType receiverType = node.getReceiverType(); + Type receiverType = node.getReceiverType(); if (receiverType != null) { receiverType.accept(this); this.buffer.append(' '); |
