aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-12-21 10:58:06 +0000
committeraclement <aclement>2005-12-21 10:58:06 +0000
commit94cb3e9bcdb5beae6db3a32280bc42e03dbb31a8 (patch)
treed2a2cf82914143d3a2250e13eff2a733b07ea9a1
parentbbdd4966a79864ea9979da81ca4725d6471b2fa9 (diff)
downloadaspectj-94cb3e9bcdb5beae6db3a32280bc42e03dbb31a8.tar.gz
aspectj-94cb3e9bcdb5beae6db3a32280bc42e03dbb31a8.zip
helens fixes for AST and ITDs - uses declared modifiers so the AST consumer doesn't see mangled names. pr110465
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/org/eclipse/jdt/core/dom/AjASTConverter.java23
-rw-r--r--org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/ASTitdTest.java94
-rw-r--r--org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTests.java1
3 files changed, 114 insertions, 4 deletions
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;
}