]> source.dussan.org Git - aspectj.git/commitdiff
helens fixes for AST and ITDs - uses declared modifiers so the AST consumer doesn...
authoraclement <aclement>
Wed, 21 Dec 2005 10:58:06 +0000 (10:58 +0000)
committeraclement <aclement>
Wed, 21 Dec 2005 10:58:06 +0000 (10:58 +0000)
org.aspectj.ajdt.core/src/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.java
org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/ASTitdTest.java [new file with mode: 0644]
org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTests.java

index 98fc374b62e5dc7851796361b4f3942360700750..1e569ce2b19b99b7642d611043325ae7c8278017 100644 (file)
@@ -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 (file)
index 0000000..2c18f05
--- /dev/null
@@ -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;
+       }       
+}
index 86e0e3b6c24033e2bd4ae67757b58aac840dbcf4..90121f11381c15f0ace9315a0235a4f7a0ffffa5 100644 (file)
@@ -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;
     }