]> source.dussan.org Git - aspectj.git/commitdiff
Added check for warning issued during JAR creation (manifest not copied).
authormkersten <mkersten>
Fri, 8 Aug 2003 21:13:17 +0000 (21:13 +0000)
committermkersten <mkersten>
Fri, 8 Aug 2003 21:13:17 +0000 (21:13 +0000)
tests/ajcTests.xml
tests/mikTests.xml
weaver/src/org/aspectj/weaver/AsmAdapter.java [new file with mode: 0644]
weaver/src/org/aspectj/weaver/AsmAdaptor.java [deleted file]
weaver/src/org/aspectj/weaver/Checker.java
weaver/src/org/aspectj/weaver/Shadow.java

index 5fa1ab82ded217a5fd7363bb0c21a4eaa2cb13d3..1412ad04d6c74b049f7d4072d5942daad962914b 100644 (file)
     
     <ajc-test dir="bugs/lines" pr="37758"
         title="Weaving rt.jar results in stack overflow">
-        <compile files="A.java,big.jar"/>
+        <compile files="A.java,big.jar">
+               <message kind="warning" text="manifest not copied"/>
+        </compile>
         <run class="Big"/>
     </ajc-test>
 
index 111011c0103fe4ade5fc2b0327ca5c42bafce8c0..ead6fe7a83650bd98d811fd72b3b422374926838 100644 (file)
@@ -2,9 +2,11 @@
 <!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd">
 
 <suite>
-    <ajc-test dir="bugs/bootstrapClasspath" pr="39959" 
-            title="AJC Compiler generates invalid class files under certain circumstances."> 
-        <compile files="UsesDOMParser.java" classpath="xerces.jar" /> 
-        <run class="UsesDOMParser"/> 
-    </ajc-test> 
-</suite>
\ No newline at end of file
+    <ajc-test dir="bugs/lines" pr="37758"
+        title="Weaving rt.jar results in stack overflow">
+        <compile files="A.java,big.jar">
+               <message kind="warning" text="manifest not copied"/>
+        </compile>
+        <run class="Big"/>
+    </ajc-test>
+</suite>  
\ No newline at end of file
diff --git a/weaver/src/org/aspectj/weaver/AsmAdapter.java b/weaver/src/org/aspectj/weaver/AsmAdapter.java
new file mode 100644 (file)
index 0000000..a0dc847
--- /dev/null
@@ -0,0 +1,157 @@
+/* *******************************************************************
+ * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
+ * All rights reserved. 
+ * This program and the accompanying materials are made available 
+ * under the terms of the Common Public License v1.0 
+ * which accompanies this distribution and is available at 
+ * http://www.eclipse.org/legal/cpl-v10.html 
+ *  
+ * Contributors: 
+ *     PARC     initial implementation 
+ * ******************************************************************/
+
+
+package org.aspectj.weaver;
+
+import java.util.*;
+
+import org.aspectj.asm.*;
+import org.aspectj.asm.internal.*;
+import org.aspectj.bridge.*;
+
+public class AsmAdapter {
+       
+       public static final String ADVISES = "advises";
+       public static final String ADVISED_BY = "advised by";
+       public static final String DECLARES_ON = "declares on";
+       public static final String DECLAREDY_BY = "declared by";
+
+       public static void checkerMunger(StructureModel model, Shadow shadow) {
+//             System.err.println("> " + shadow.getThisVar() + " to " + shadow.getTargetVar());
+       }
+       
+       public static void nodeMunger(StructureModel model, Shadow shadow, ShadowMunger munger) {
+               if (munger instanceof Advice) {
+                       Advice a = (Advice)munger;
+                       if (a.getKind().isPerEntry() || a.getKind().isCflow()) {
+                               // TODO: might want to show these in the future
+                               return;
+                       }
+                       IRelationshipMapper mapper = StructureModelManager.getDefault().getMapper();
+
+                       IProgramElement targetNode = getNode(model, shadow);
+                       IProgramElement adviceNode = getNode(model, a);  
+                       
+                       if (adviceNode != null && targetNode != null) {
+                               IRelationship foreward = mapper.get(adviceNode);
+                               if (foreward == null) {
+                                       foreward = new Relationship(
+                                               ADVISES,
+                                               IRelationship.Kind.ADVICE,
+                                               adviceNode, 
+                                               new ArrayList()
+                                       );
+                                       mapper.put(adviceNode, foreward);
+                               }
+                               foreward.getTargets().add(targetNode);
+
+                               IRelationship back = mapper.get(targetNode);
+                               if (back == null) {
+                                       back = new Relationship(
+                                               ADVISED_BY,
+                                               IRelationship.Kind.ADVICE,
+                                               targetNode, 
+                                               new ArrayList()
+                                       );
+                                       mapper.put(targetNode, back);
+                               }
+                               back.getTargets().add(adviceNode);
+                       }
+               }
+       }
+
+       private static IProgramElement getNode(StructureModel model, Advice a) {
+               //ResolvedTypeX inAspect = a.getConcreteAspect();
+               Member member = a.getSignature();
+               if (a.getSignature() == null) return null;
+               return lookupMember(model, member);
+       }
+       
+       private static IProgramElement getNode(StructureModel model, Shadow shadow) {
+               Member enclosingMember = shadow.getEnclosingCodeSignature();
+               
+               IProgramElement enclosingNode = lookupMember(model, enclosingMember);
+               if (enclosingNode == null) {
+                       Lint.Kind err = shadow.getIWorld().getLint().shadowNotInStructure;
+                       if (err.isEnabled()) {
+                               err.signal(shadow.toString(), shadow.getSourceLocation());
+                       }
+                       return null;
+               }
+               
+               Member shadowSig = shadow.getSignature();
+               if (!shadowSig.equals(enclosingMember)) {
+                       IProgramElement bodyNode = findOrCreateBodyNode(enclosingNode, shadowSig, shadow);
+                       return bodyNode;
+               } else {
+                       return enclosingNode;
+               }
+       }
+
+       private static IProgramElement findOrCreateBodyNode(
+               IProgramElement enclosingNode,
+               Member shadowSig, Shadow shadow)
+       {
+               for (Iterator it = enclosingNode.getChildren().iterator(); it.hasNext(); ) {
+                       IProgramElement node = (IProgramElement)it.next();
+                       if (shadowSig.getName().equals(node.getBytecodeName()) &&
+                               shadowSig.getSignature().equals(node.getBytecodeSignature()))
+                       {
+                               return node;
+                       }
+               }
+               
+               ISourceLocation sl = shadow.getSourceLocation();
+               
+               IProgramElement peNode = new ProgramElement(
+                       shadow.toString(),
+                       IProgramElement.Kind.CODE,
+//XXX why not use shadow file? new SourceLocation(sl.getSourceFile(), sl.getLine()),
+        new SourceLocation(enclosingNode.getSourceLocation().getSourceFile(), sl.getLine()),
+//                     enclosingNode.getSourceLocation(),
+                       0,
+                       "",
+                       new ArrayList());
+                       
+               //System.err.println(peNode.getSourceLocation());
+               peNode.setBytecodeName(shadowSig.getName());
+               peNode.setBytecodeSignature(shadowSig.getSignature());
+               enclosingNode.addChild(peNode);
+               return peNode;
+       }
+       
+       public static IProgramElement lookupMember(StructureModel model, Member member) {
+               TypeX declaringType = member.getDeclaringType();
+               IProgramElement classNode =
+                       model.findNodeForType(declaringType.getPackageName(), declaringType.getClassName());
+               return findMemberInClass(classNode, member);
+       }
+
+       private static IProgramElement findMemberInClass(
+               IProgramElement classNode,
+               Member member)
+       {
+               if (classNode == null) return null; // XXX remove this check
+               for (Iterator it = classNode.getChildren().iterator(); it.hasNext(); ) {
+                       IProgramElement node = (IProgramElement)it.next();
+                       //System.err.println("checking: " + member.getName() + " with " + node.getBytecodeName() + ", " + node.getBytecodeSignature());
+                       if (member.getName().equals(node.getBytecodeName()) &&
+                               member.getSignature().equals(node.getBytecodeSignature()))
+                       {
+                               return node;
+                       }
+               }
+               // if we can't find the member, we'll just put it in the class
+               return classNode;
+       }
+}
diff --git a/weaver/src/org/aspectj/weaver/AsmAdaptor.java b/weaver/src/org/aspectj/weaver/AsmAdaptor.java
deleted file mode 100644 (file)
index e448896..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/* *******************************************************************
- * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
- * All rights reserved. 
- * This program and the accompanying materials are made available 
- * under the terms of the Common Public License v1.0 
- * which accompanies this distribution and is available at 
- * http://www.eclipse.org/legal/cpl-v10.html 
- *  
- * Contributors: 
- *     PARC     initial implementation 
- * ******************************************************************/
-
-
-package org.aspectj.weaver;
-
-import java.util.*;
-
-import org.aspectj.asm.*;
-import org.aspectj.asm.internal.*;
-import org.aspectj.bridge.*;
-
-public class AsmAdaptor {
-       
-       public static void nodeMunger(StructureModel model, Shadow shadow, ShadowMunger munger) {
-               if (munger instanceof Advice) {
-                       Advice a = (Advice)munger;
-//                     if (a.getKind().isPerEntry() || a.getKind().isCflow()) {
-                               // ??? might want to show these in the future
-//                             return;
-//                     }
-
-//                     System.out.println("--------------------------");
-                       IProgramElement targetNode = getNode(model, shadow);
-                       IProgramElement adviceNode = getNode(model, a);  
-                       
-                       if (adviceNode != null && targetNode != null) {
-//                             mapper.putRelationshipForElement(
-//                                     adviceNode, 
-//                                     ADVICE, 
-//                                     targetNode);
-                       }
-                               
-//                     System.out.println("> target: " + targetNode + ", advice: " + adviceNode);
-//                     throw new RuntimeException("unimplemented");
-//                     IRelationship relation = new Relationship();
-//                     if (shadow.getKind().equals(Shadow.FieldGet) || shadow.getKind().equals(Shadow.FieldSet)) {
-//                             relation = AdviceAssociation.FIELD_ACCESS_RELATION;
-//                     } else if (shadow.getKind().equals(Shadow.Initialization) || shadow.getKind().equals(Shadow.StaticInitialization)) {
-//                             relation = AdviceAssociation.INITIALIZER_RELATION;
-//                     } else if (shadow.getKind().equals(Shadow.ExceptionHandler)) {
-//                             relation = AdviceAssociation.HANDLER_RELATION;
-//                     } else if (shadow.getKind().equals(Shadow.MethodCall)) {
-//                             relation = AdviceAssociation.METHOD_CALL_SITE_RELATION;
-//                     } else if (shadow.getKind().equals(Shadow.ConstructorCall)) {
-//                             relation = AdviceAssociation.CONSTRUCTOR_CALL_SITE_RELATION;
-//                     } else if (shadow.getKind().equals(Shadow.MethodExecution) || shadow.getKind().equals(Shadow.AdviceExecution)) {
-//                             relation = AdviceAssociation.METHOD_RELATION;
-//                     } else if (shadow.getKind().equals(Shadow.ConstructorExecution)) {
-//                             relation = AdviceAssociation.CONSTRUCTOR_RELATION;
-//                     } else if (shadow.getKind().equals(Shadow.PreInitialization)) {
-//                             // TODO: someone should check that this behaves reasonably in the IDEs
-//                             relation = AdviceAssociation.INITIALIZER_RELATION;
-//                     } else {
-//                             System.err.println("> unmatched relation: " + shadow.getKind());
-//                             relation = AdviceAssociation.METHOD_RELATION;
-//                     }
-//                     createAppropriateLinks(targetNode, adviceNode, relation);
-               }
-       }
-
-       private static void createAppropriateLinks(
-               IProgramElement target,
-               IProgramElement advice,
-               IRelationship relation)
-       {
-               if (target == null || advice == null) return;
-               
-               
-//             addLink(target, new LinkNode(advice),  relation, true);
-//             addLink(advice, new LinkNode(target),  relation, false);
-       }
-
-       private static void addLink(
-               IProgramElement onNode,
-//             LinkNode linkNode,
-               IRelationship relation,
-               boolean isBack)
-       {
-               IRelationship node = null;
-               String relationName = relation.getName();
-//             isBack ? relation() : relation.getForwardNavigationName();
-               
-               //System.err.println("on: " + onNode + " relationName: " + relationName + " existin: " + onNode.getRelations());
-               
-               for (Iterator i = onNode.getRelations().iterator(); i.hasNext();) {
-                       IRelationship relationNode = (IRelationship) i.next();
-                       if (relationName.equals(relationNode.getName())) {
-                               node = relationNode;
-                               break;
-                       }
-               }       
-               if (node == null) {
-                       throw new RuntimeException("unimplemented");
-//                     node = new Relationship(relation,  relationName, new ArrayList());
-//                     onNode.getRelations().add(node);
-               }
-//             node.getTargets().add(linkNode);
-               
-       }
-
-       private static IProgramElement getNode(StructureModel model, Advice a) {
-               //ResolvedTypeX inAspect = a.getConcreteAspect();
-               Member member = a.getSignature();
-               if (a.getSignature() == null) return null;
-               return lookupMember(model, member);
-       }
-       
-       private static IProgramElement getNode(StructureModel model, Shadow shadow) {
-               Member enclosingMember = shadow.getEnclosingCodeSignature();
-               
-               IProgramElement enclosingNode = lookupMember(model, enclosingMember);
-               if (enclosingNode == null) {
-                       Lint.Kind err = shadow.getIWorld().getLint().shadowNotInStructure;
-                       if (err.isEnabled()) {
-                               err.signal(shadow.toString(), shadow.getSourceLocation());
-                       }
-                       return null;
-               }
-               
-               Member shadowSig = shadow.getSignature();
-               if (!shadowSig.equals(enclosingMember)) {
-                       IProgramElement bodyNode = findOrCreateBodyNode(enclosingNode, shadowSig, shadow);
-                       return bodyNode;
-               } else {
-                       return enclosingNode;
-               }
-       }
-
-       private static IProgramElement findOrCreateBodyNode(
-               IProgramElement enclosingNode,
-               Member shadowSig, Shadow shadow)
-       {
-               for (Iterator it = enclosingNode.getChildren().iterator(); it.hasNext(); ) {
-                       IProgramElement node = (IProgramElement)it.next();
-                       if (shadowSig.getName().equals(node.getBytecodeName()) &&
-                               shadowSig.getSignature().equals(node.getBytecodeSignature()))
-                       {
-                               return node;
-                       }
-               }
-               
-               ISourceLocation sl = shadow.getSourceLocation();
-               
-               IProgramElement peNode = new ProgramElement(
-                       shadow.toString(),
-                       IProgramElement.Kind.CODE,
-//XXX why not use shadow file? new SourceLocation(sl.getSourceFile(), sl.getLine()),
-        new SourceLocation(enclosingNode.getSourceLocation().getSourceFile(), sl.getLine()),
-//                     enclosingNode.getSourceLocation(),
-                       0,
-                       "",
-                       new ArrayList());
-                       
-               //System.err.println(peNode.getSourceLocation());
-               peNode.setBytecodeName(shadowSig.getName());
-               peNode.setBytecodeSignature(shadowSig.getSignature());
-               enclosingNode.addChild(peNode);
-               return peNode;
-       }
-
-
-       
-       
-       
-       public static IProgramElement lookupMember(StructureModel model, Member member) {
-               TypeX declaringType = member.getDeclaringType();
-               IProgramElement classNode =
-                       model.findNodeForClass(declaringType.getPackageName(), declaringType.getClassName());
-               return findMemberInClass(classNode, member);
-       }
-
-       private static IProgramElement findMemberInClass(
-               IProgramElement classNode,
-               Member member)
-       {
-               if (classNode == null) return null; // XXX remove this check
-               for (Iterator it = classNode.getChildren().iterator(); it.hasNext(); ) {
-                       IProgramElement node = (IProgramElement)it.next();
-                       //System.err.println("checking: " + member.getName() + " with " + node.getBytecodeName() + ", " + node.getBytecodeSignature());
-                       if (member.getName().equals(node.getBytecodeName()) &&
-                               member.getSignature().equals(node.getBytecodeSignature()))
-                       {
-                               return node;
-                       }
-               }
-               // if we can't find the member, we'll just put it in the class
-               return classNode;
-       }
-}
index 4e451707786691d18e1ae62f4c93934fac988229..83c9f40b9c026cca01a7f098af6d1b6cb0dc41c2 100644 (file)
@@ -54,7 +54,8 @@ public class Checker extends ShadowMunger {
                                isError ? IMessage.ERROR : IMessage.WARNING,
                                shadow.getSourceLocation());
                        world.getMessageHandler().handleMessage(message);
-                               
+                       
+                       AsmAdapter.checkerMunger(world.getModel(), shadow);
                }
                return false;
        }
index ade726ba90877bbf0b6aa90df38dcb96cc159049..a6ec5529a58ece134423fa6a73207c739585aaf6 100644 (file)
@@ -341,7 +341,7 @@ public abstract class Shadow {
                        munger.implementOn(this);
                        if (world.getModel() != null) {
                                //System.err.println("munger: " + munger + " on " + this);
-                               AsmAdaptor.nodeMunger(world.getModel(), this, munger);
+                               AsmAdapter.nodeMunger(world.getModel(), this, munger);
                        }
                }
        }