From: aclement Date: Wed, 21 Dec 2005 10:58:06 +0000 (+0000) Subject: helens fixes for AST and ITDs - uses declared modifiers so the AST consumer doesn... X-Git-Tag: POST_MEMORY_CHANGES~201 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=94cb3e9bcdb5beae6db3a32280bc42e03dbb31a8;p=aspectj.git helens fixes for AST and ITDs - uses declared modifiers so the AST consumer doesn't see mangled names. pr110465 --- diff --git a/org.aspectj.ajdt.core/src/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.java b/org.aspectj.ajdt.core/src/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.java index 98fc374b6..1e569ce2b 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.java @@ -20,6 +20,7 @@ import org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration; import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration; import org.aspectj.ajdt.internal.compiler.ast.DeclareDeclaration; import org.aspectj.ajdt.internal.compiler.ast.InterTypeConstructorDeclaration; +import org.aspectj.ajdt.internal.compiler.ast.InterTypeDeclaration; import org.aspectj.ajdt.internal.compiler.ast.InterTypeFieldDeclaration; import org.aspectj.ajdt.internal.compiler.ast.InterTypeMethodDeclaration; import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration; @@ -204,7 +205,6 @@ public class AjASTConverter extends ASTConverter { return convert((org.aspectj.org.eclipse.jdt.internal.compiler.ast.AnnotationMethodDeclaration) methodDeclaration); } MethodDeclaration methodDecl = new MethodDeclaration(this.ast); - setModifiers(methodDecl, methodDeclaration); boolean isConstructor = methodDeclaration.isConstructor(); methodDecl.setConstructor(isConstructor); @@ -225,12 +225,23 @@ public class AjASTConverter extends ASTConverter { } ///////////////////////// + // set modifiers after checking whether we're an itd, otherwise + // the modifiers are not set on the correct object. + setModifiers(methodDecl, methodDeclaration); + + // for ITD's use the declaredSelector final SimpleName methodName = new SimpleName(this.ast); - methodName.internalSetIdentifier(new String(methodDeclaration.selector)); + if (methodDeclaration instanceof InterTypeDeclaration) { + InterTypeDeclaration itd = (InterTypeDeclaration) methodDeclaration; + methodName.internalSetIdentifier(new String(itd.getDeclaredSelector())); + } else { + methodName.internalSetIdentifier(new String(methodDeclaration.selector)); + } int start = methodDeclaration.sourceStart; int end = retrieveIdentifierEndPosition(start, methodDeclaration.sourceEnd); methodName.setSourceRange(start, end - start + 1); methodDecl.setName(methodName); + org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference[] thrownExceptions = methodDeclaration.thrownExceptions; if (thrownExceptions != null) { int thrownExceptionsLength = thrownExceptions.length; @@ -3580,7 +3591,7 @@ public class AjASTConverter extends ASTConverter { // ajh02: method added switch(this.ast.apiLevel) { case AST.JLS2_INTERNAL : - fieldDeclaration.internalSetModifiers(fieldDecl.modifiers & CompilerModifiers.AccJustFlag); + fieldDeclaration.internalSetModifiers(fieldDecl.declaredModifiers & CompilerModifiers.AccJustFlag); if (fieldDecl.annotations != null) { fieldDeclaration.setFlags(fieldDeclaration.getFlags() | ASTNode.MALFORMED); } @@ -3615,7 +3626,11 @@ public class AjASTConverter extends ASTConverter { protected void setModifiers(MethodDeclaration methodDecl, AbstractMethodDeclaration methodDeclaration) { switch(this.ast.apiLevel) { case AST.JLS2_INTERNAL : - methodDecl.internalSetModifiers(methodDeclaration.modifiers & CompilerModifiers.AccJustFlag); + if (methodDeclaration instanceof InterTypeDeclaration) { + methodDecl.internalSetModifiers(((InterTypeDeclaration)methodDeclaration).declaredModifiers & CompilerModifiers.AccJustFlag); + } else { + methodDecl.internalSetModifiers(methodDeclaration.modifiers & CompilerModifiers.AccJustFlag); + } if (methodDeclaration.annotations != null) { methodDecl.setFlags(methodDecl.getFlags() | ASTNode.MALFORMED); } diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/ASTitdTest.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/ASTitdTest.java new file mode 100644 index 000000000..2c18f05dd --- /dev/null +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/ASTitdTest.java @@ -0,0 +1,94 @@ +/******************************************************************** + * Copyright (c) 2005 Contributors. All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: IBM Corporation - initial API and implementation + * Helen Hawkins - iniital version + *******************************************************************/ +package org.aspectj.tools.ajc; + +import java.lang.reflect.Modifier; +import java.util.HashMap; + +import junit.framework.TestCase; + +import org.aspectj.org.eclipse.jdt.core.dom.AST; +import org.aspectj.org.eclipse.jdt.core.dom.ASTParser; +import org.aspectj.org.eclipse.jdt.core.dom.AjASTVisitor; +import org.aspectj.org.eclipse.jdt.core.dom.CompilationUnit; +import org.aspectj.org.eclipse.jdt.core.dom.InterTypeFieldDeclaration; +import org.aspectj.org.eclipse.jdt.core.dom.InterTypeMethodDeclaration; +import org.aspectj.org.eclipse.jdt.core.dom.MethodDeclaration; + +public class ASTitdTest extends TestCase { + + public void testAspectWithPublicMethodITD() { + checkNameAndModifiers("aspect A{ public void B.x(){} }","name = x, modifier = public"); + } + + public void testAspectWithPrivateMethodITD() { + checkNameAndModifiers("aspect A{ private void B.x(){} }","name = x, modifier = private"); + } + + public void testAspectWithPublicAbstractMethodITD() { + checkNameAndModifiers("aspect A{ public abstract void B.x(){} }","name = x, modifier = public abstract"); + } + + public void testAspectWithConstructorITD() { + checkNameAndModifiers("class A {}aspect B {public A.new(){}}","name = A_new, modifier = public"); + } + + public void testAspectWithPublicFieldITD() { + checkNameAndModifiers("class A {}aspect B {public int A.a;}","name = a, modifier = public"); + } + + private void checkNameAndModifiers(String source, String expectedOutput){ + ASTParser parser = ASTParser.newParser(AST.JLS2); // ajh02: need to use 2 for returnType - in 3 it has "returnType2" + parser.setCompilerOptions(new HashMap());//JavaCore.getOptions()); + parser.setSource(source.toCharArray()); + CompilationUnit cu2 = (CompilationUnit) parser.createAST(null); + ITDTestVisitor visitor = new ITDTestVisitor(); + cu2.accept(visitor); + String result = visitor.toString(); + //System.err.println("actual:\n" + result); + assertTrue("Expected:\n"+ expectedOutput + "====Actual:\n" + result, + expectedOutput.equals(result)); + } + +} + +class ITDTestVisitor extends AjASTVisitor { + + StringBuffer b = new StringBuffer(); + boolean visitDocTags; + + ITDTestVisitor() { + this(false); + } + + public String toString(){ + return b.toString(); + } + + ITDTestVisitor(boolean visitDocTags) { + super(visitDocTags); + this.visitDocTags = visitDocTags; + } + + public boolean visit(MethodDeclaration node) { + if (node instanceof InterTypeMethodDeclaration) + return visit((InterTypeMethodDeclaration)node); + return true; + } + public boolean visit(InterTypeFieldDeclaration node) { + b.append("name = " + node.fragments().get(0) + ", modifier = " + Modifier.toString(node.getModifiers())); + return true; + } + public boolean visit(InterTypeMethodDeclaration node) { + b.append("name = " + node.getName() + ", modifier = " + Modifier.toString(node.getModifiers())); + return true; + } +} diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTests.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTests.java index 86e0e3b6c..90121f113 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTests.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTests.java @@ -27,6 +27,7 @@ public class AjcTests extends TestCase { TestSuite suite = new TestSuite(AjcTests.class.getName()); suite.addTestSuite(org.aspectj.tools.ajc.MainTest.class); suite.addTestSuite(ASTVisitorTest.class); + suite.addTestSuite(ASTitdTest.class); return suite; }