Browse Source

145963: binary entries in the model: various parts to the fix.

tags/post_pr_153572
aclement 17 years ago
parent
commit
9b03811333
35 changed files with 653 additions and 293 deletions
  1. 10
    0
      ajde/testdata/WeaveInfoMessagesTest/AspectInPackage.aj
  2. BIN
      ajde/testdata/WeaveInfoMessagesTest/AspectInPackage.jar
  3. 13
    13
      ajde/testdata/WeaveInfoMessagesTest/expected/advice.binary.nodebug.txt
  4. 4
    0
      ajde/testdata/WeaveInfoMessagesTest/expected/advice.binary.package.jar.txt
  5. 4
    0
      ajde/testdata/WeaveInfoMessagesTest/expected/advice.binary.package.txt
  6. 13
    13
      ajde/testdata/WeaveInfoMessagesTest/expected/advice.binary.txt
  7. 2
    0
      ajde/testdata/WeaveInfoMessagesTest/expected/declare.soft.binary.nodebug.txt
  8. 2
    0
      ajde/testdata/WeaveInfoMessagesTest/expected/declare.soft.binary.txt
  9. BIN
      ajde/testdata/WeaveInfoMessagesTest/pkg/AspectInPackage.class
  10. 27
    4
      ajde/testsrc/org/aspectj/ajde/ShowWeaveMessagesTestCase.java
  11. 20
    4
      asm/src/org/aspectj/asm/AsmManager.java
  12. 32
    0
      asm/src/org/aspectj/asm/IModelFilter.java
  13. 1
    0
      asm/src/org/aspectj/asm/IProgramElement.java
  14. 7
    0
      asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java
  15. 9
    0
      bridge/src/org/aspectj/bridge/ISourceLocation.java
  16. 10
    0
      bridge/src/org/aspectj/bridge/SourceLocation.java
  17. 4
    0
      org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceLocation.java
  18. 0
    1
      testing/newsrc/org/aspectj/testing/XMLBasedAjcTestCase.java
  19. 4
    0
      testing/src/org/aspectj/testing/xml/SoftSourceLocation.java
  20. 2
    0
      tests/src/org/aspectj/systemtest/AllTests.java
  21. 2
    0
      tests/src/org/aspectj/systemtest/AllTests15.java
  22. 3
    3
      tests/src/org/aspectj/systemtest/ajc150/ajc150.xml
  23. 6
    6
      tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java
  24. 0
    1
      tests/src/org/aspectj/systemtest/ajc152/AllTestsAspectJ152.java
  25. 0
    198
      tests/src/org/aspectj/systemtest/ajc152/CreatingModelForInjarTests.java
  26. 0
    20
      tests/src/org/aspectj/systemtest/ajc152/injar.xml
  27. 42
    0
      tests/src/org/aspectj/systemtest/model/Model5Tests.java
  28. 208
    0
      tests/src/org/aspectj/systemtest/model/ModelTestCase.java
  29. 47
    0
      tests/src/org/aspectj/systemtest/model/ModelTests.java
  30. 31
    0
      tests/src/org/aspectj/systemtest/model/model.xml
  31. 1
    2
      weaver/src/org/aspectj/weaver/Advice.java
  32. 13
    0
      weaver/src/org/aspectj/weaver/ResolvedType.java
  33. 16
    1
      weaver/src/org/aspectj/weaver/Shadow.java
  34. 115
    27
      weaver/src/org/aspectj/weaver/ShadowMunger.java
  35. 5
    0
      weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java

+ 10
- 0
ajde/testdata/WeaveInfoMessagesTest/AspectInPackage.aj View File

@@ -0,0 +1,10 @@
package pkg;

public aspect AspectInPackage {

pointcut p() : execution(* *.*(..));

before() : p() {
}

}

BIN
ajde/testdata/WeaveInfoMessagesTest/AspectInPackage.jar View File


+ 13
- 13
ajde/testdata/WeaveInfoMessagesTest/expected/advice.binary.nodebug.txt View File

@@ -1,13 +1,13 @@
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (no debug info available) advised by before advice from 'AspectAdvice' (AspectAdvice.aj:8)
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (no debug info available) advised by after advice from 'AspectAdvice' (AspectAdvice.aj:12)
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (no debug info available) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.aj:16)
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (no debug info available) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.aj:20)
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (no debug info available) advised by before advice from 'AspectAdvice' (AspectAdvice.aj:8)
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (no debug info available) advised by after advice from 'AspectAdvice' (AspectAdvice.aj:12)
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (no debug info available) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.aj:16)
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (no debug info available) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.aj:20)
Join point 'method-execution(void Simple.main(java.lang.String[]))' in Type 'Simple' (no debug info available) advised by around advice from 'AspectAdvice' (AspectAdvice.aj:24) [with runtime test]
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (no debug info available) advised by before advice from 'AspectAdvice' (AspectAdvice.aj:8)
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (no debug info available) advised by after advice from 'AspectAdvice' (AspectAdvice.aj:12)
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (no debug info available) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.aj:16)
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (no debug info available) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.aj:20)
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (no debug info available) advised by before advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:8(from AspectAdvice.aj))
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (no debug info available) advised by after advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:12(from AspectAdvice.aj))
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (no debug info available) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:16(from AspectAdvice.aj))
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (no debug info available) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:20(from AspectAdvice.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (no debug info available) advised by before advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:8(from AspectAdvice.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (no debug info available) advised by after advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:12(from AspectAdvice.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (no debug info available) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:16(from AspectAdvice.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (no debug info available) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:20(from AspectAdvice.aj))
Join point 'method-execution(void Simple.main(java.lang.String[]))' in Type 'Simple' (no debug info available) advised by around advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:24(from AspectAdvice.aj)) [with runtime test]
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (no debug info available) advised by before advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:8(from AspectAdvice.aj))
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (no debug info available) advised by after advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:12(from AspectAdvice.aj))
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (no debug info available) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:16(from AspectAdvice.aj))
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (no debug info available) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice_nodebug.jar!AspectAdvice.class:20(from AspectAdvice.aj))

+ 4
- 0
ajde/testdata/WeaveInfoMessagesTest/expected/advice.binary.package.jar.txt View File

@@ -0,0 +1,4 @@
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by before advice from 'pkg.AspectInPackage' (AspectInPackage.jar!AspectInPackage.class:7(from AspectInPackage.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by before advice from 'pkg.AspectInPackage' (AspectInPackage.jar!AspectInPackage.class:7(from AspectInPackage.aj))
Join point 'method-execution(void Simple.main(java.lang.String[]))' in Type 'Simple' (Simple.java:13) advised by before advice from 'pkg.AspectInPackage' (AspectInPackage.jar!AspectInPackage.class:7(from AspectInPackage.aj))
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by before advice from 'pkg.AspectInPackage' (AspectInPackage.jar!AspectInPackage.class:7(from AspectInPackage.aj))

+ 4
- 0
ajde/testdata/WeaveInfoMessagesTest/expected/advice.binary.package.txt View File

@@ -0,0 +1,4 @@
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by before advice from 'pkg.AspectInPackage' (AspectInPackage.class:7(from AspectInPackage.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by before advice from 'pkg.AspectInPackage' (AspectInPackage.class:7(from AspectInPackage.aj))
Join point 'method-execution(void Simple.main(java.lang.String[]))' in Type 'Simple' (Simple.java:13) advised by before advice from 'pkg.AspectInPackage' (AspectInPackage.class:7(from AspectInPackage.aj))
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by before advice from 'pkg.AspectInPackage' (AspectInPackage.class:7(from AspectInPackage.aj))

+ 13
- 13
ajde/testdata/WeaveInfoMessagesTest/expected/advice.binary.txt View File

@@ -1,13 +1,13 @@
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by before advice from 'AspectAdvice' (AspectAdvice.aj:8)
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by after advice from 'AspectAdvice' (AspectAdvice.aj:12)
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.aj:16)
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.aj:20)
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by before advice from 'AspectAdvice' (AspectAdvice.aj:8)
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by after advice from 'AspectAdvice' (AspectAdvice.aj:12)
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.aj:16)
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.aj:20)
Join point 'method-execution(void Simple.main(java.lang.String[]))' in Type 'Simple' (Simple.java:13) advised by around advice from 'AspectAdvice' (AspectAdvice.aj:24) [with runtime test]
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by before advice from 'AspectAdvice' (AspectAdvice.aj:8)
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by after advice from 'AspectAdvice' (AspectAdvice.aj:12)
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.aj:16)
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.aj:20)
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by before advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:8(from AspectAdvice.aj))
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by after advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:12(from AspectAdvice.aj))
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:16(from AspectAdvice.aj))
Join point 'method-execution(void Simple.m1())' in Type 'Simple' (Simple.java:5) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:20(from AspectAdvice.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by before advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:8(from AspectAdvice.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by after advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:12(from AspectAdvice.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:16(from AspectAdvice.aj))
Join point 'method-execution(java.lang.String Simple.m2())' in Type 'Simple' (Simple.java:9) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:20(from AspectAdvice.aj))
Join point 'method-execution(void Simple.main(java.lang.String[]))' in Type 'Simple' (Simple.java:13) advised by around advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:24(from AspectAdvice.aj)) [with runtime test]
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by before advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:8(from AspectAdvice.aj))
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by after advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:12(from AspectAdvice.aj))
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by afterReturning advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:16(from AspectAdvice.aj))
Join point 'method-execution(void Simple.mSecret())' in Type 'Simple' (Simple.java:17) advised by afterThrowing advice from 'AspectAdvice' (AspectAdvice.jar!AspectAdvice.class:20(from AspectAdvice.aj))

+ 2
- 0
ajde/testdata/WeaveInfoMessagesTest/expected/declare.soft.binary.nodebug.txt View File

@@ -0,0 +1,2 @@
Softening exceptions in type 'Simple' (no debug info available) as defined by aspect 'AspectDeclareSoft' (AspectDeclareSoft_nodebug.jar!AspectDeclareSoft.class:4(from AspectDeclareSoft.aj))
Softening exceptions in type 'Simple' (no debug info available) as defined by aspect 'AspectDeclareSoft' (AspectDeclareSoft_nodebug.jar!AspectDeclareSoft.class:6(from AspectDeclareSoft.aj))

+ 2
- 0
ajde/testdata/WeaveInfoMessagesTest/expected/declare.soft.binary.txt View File

@@ -0,0 +1,2 @@
Softening exceptions in type 'Simple' (Simple.java:13) as defined by aspect 'AspectDeclareSoft' (AspectDeclareSoft.jar!AspectDeclareSoft.class:4(from AspectDeclareSoft.aj))
Softening exceptions in type 'Simple' (Simple.java:13) as defined by aspect 'AspectDeclareSoft' (AspectDeclareSoft.jar!AspectDeclareSoft.class:6(from AspectDeclareSoft.aj))

BIN
ajde/testdata/WeaveInfoMessagesTest/pkg/AspectInPackage.class View File


+ 27
- 4
ajde/testsrc/org/aspectj/ajde/ShowWeaveMessagesTestCase.java View File

@@ -243,12 +243,35 @@ public class ShowWeaveMessagesTestCase extends AjdeTestCase {
aspectpath.add(openFile("AspectDeclareSoft.jar"));
ideManager.getProjectProperties().setAspectPath(aspectpath);
assertTrue("Build failed", doSynchronousBuild("Empty.lst"));
verifyWeavingMessages("declare.soft",false);
verifyWeavingMessages("declare.soft.binary",true);
}

public void testWeaveMessagesBinaryAdviceInPackageFromJar() {
if (debugTests) System.out.println("\ntestWeaveMessagesBinaryAdviceInPackageFromJar: Simple.jar + AspectInPackage.jar");
Set inpath = new HashSet();
inpath.add(openFile("Simple.jar"));
ideManager.getProjectProperties().setInpath(inpath);
Set aspectpath = new HashSet();
aspectpath.add(openFile("AspectInPackage.jar"));
ideManager.getProjectProperties().setAspectPath(aspectpath);
assertTrue("Build failed", doSynchronousBuild("Empty.lst"));
/*List l = */ideManager.getCompilationSourceLineTasks();
verifyWeavingMessages("advice.binary.package.jar",true);
}



public void testWeaveMessagesBinaryAdviceInPackage() {
if (debugTests) System.out.println("\ntestWeaveMessagesBinaryAdviceInPackage: Simple.jar + AspectInPackage.jar");
Set inpath = new HashSet();
inpath.add(openFile("Simple.jar"));
ideManager.getProjectProperties().setInpath(inpath);
Set aspectpath = new HashSet();
aspectpath.add(openFile("pkg"));
ideManager.getProjectProperties().setAspectPath(aspectpath);
assertTrue("Build failed", doSynchronousBuild("Empty.lst"));
/*List l = */ideManager.getCompilationSourceLineTasks();
verifyWeavingMessages("advice.binary.package",true);
}
// BINARY WEAVING WHEN WE'VE LOST THE SOURCE POINTERS

public void testWeaveMessagesBinaryAdviceNoDebugInfo() {
@@ -301,7 +324,7 @@ public class ShowWeaveMessagesTestCase extends AjdeTestCase {
aspectpath.add(openFile("AspectDeclareSoft_nodebug.jar"));
ideManager.getProjectProperties().setAspectPath(aspectpath);
assertTrue("Build failed", doSynchronousBuild("Empty.lst"));
verifyWeavingMessages("declare.soft.nodebug",true);
verifyWeavingMessages("declare.soft.binary.nodebug",true);
}



+ 20
- 4
asm/src/org/aspectj/asm/AsmManager.java View File

@@ -61,6 +61,7 @@ public class AsmManager {
private static boolean dumpModel = false;
private static boolean dumpRelationships = false;
private static boolean dumpDeltaProcessing = false;
private static IModelFilter modelFilter = null;
private static String dumpFilename = "";
private static boolean reporting = false;

@@ -88,7 +89,6 @@ public class AsmManager {
}

public static AsmManager getDefault() {
new RuntimeException("fetching asm").printStackTrace();
return INSTANCE;
}
@@ -380,10 +380,21 @@ public class AsmManager {
dumpFilename = filename;
}
public static void setReporting(String filename,boolean dModel,boolean dRels,boolean dDeltaProcessing,
boolean deletefile,IModelFilter aFilter) {
setReporting(filename,dModel,dRels,dDeltaProcessing,deletefile);
modelFilter = aFilter;
}
public static boolean isReporting() {
return reporting;
}
public static void setDontReport() {
reporting = false;
dumpDeltaProcessing=false;
}


public void reportModelInfo(String reasonForReport) {
@@ -422,8 +433,10 @@ public class AsmManager {
for (int i =0 ;i<indent;i++) w.write(" ");
String loc = "";
if (node!=null) {
if (node.getSourceLocation()!=null)
if (node.getSourceLocation()!=null) {
loc = node.getSourceLocation().toString();
if (modelFilter!=null) loc = modelFilter.processFilelocation(loc);
}
}
w.write(node+" ["+(node==null?"null":node.getKind().toString())+"] "+loc+"\n");
if (node!=null)
@@ -458,9 +471,12 @@ public class AsmManager {
List targets = ir.getTargets();
for (Iterator iterator2 = targets.iterator();
iterator2.hasNext();
) {
) {
String thid = (String) iterator2.next();
w.write("Hid:"+(ctr++)+":(targets="+targets.size()+") "+hid+" ("+ir.getName()+") "+thid+"\n");
StringBuffer sb = new StringBuffer();
if (modelFilter==null || modelFilter.wantsHandleIds()) sb.append("Hid:"+(ctr++)+":");
sb.append("(targets="+targets.size()+") "+hid+" ("+ir.getName()+") "+thid+"\n");
w.write(sb.toString());
}
}
}

+ 32
- 0
asm/src/org/aspectj/asm/IModelFilter.java View File

@@ -0,0 +1,32 @@
/* *******************************************************************
* Copyright (c) 2006 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://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andy Clement IBM initial implementation
* ******************************************************************/
package org.aspectj.asm;

/**
* When dumping the model out (for debugging/testing), various parts of
* it can be passed through this filter. Currently it is used to ensure
* the source locations we dump out are independent of sandbox directory.
*/
public interface IModelFilter {
/**
* Called when about to dump out an absolute file location, enabling
* it to be altered (eg. c:/temp/ajcsSandbox/foo/ajctemp.12323/<BLAH>
* could become TEST_SANDBOX/<BLAH>
*/
String processFilelocation(String loc);

/**
* When the relationship map is dumped, lines are prefixed with a handle ID.
* Return true if you want these, false if you dont.
*/
boolean wantsHandleIds();
}

+ 1
- 0
asm/src/org/aspectj/asm/IProgramElement.java View File

@@ -28,6 +28,7 @@ public interface IProgramElement extends Serializable {

public void setChildren(List children);
public void addChild(IProgramElement child);
public boolean removeChild(IProgramElement child);
// Extra stuff
// Could be just a string but may prove more useful as an object in the long run ...

+ 7
- 0
asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java View File

@@ -259,6 +259,13 @@ public class AspectJElementHierarchy implements IHierarchy {
if (lastSlash == -1) {
lastSlash = sourceFilePath.lastIndexOf('/');
}
// '!' is used like in URLs "c:/blahblah/X.jar!a/b.class"
int i = sourceFilePath.lastIndexOf('!');
int j = sourceFilePath.indexOf(".class");
if (i > lastSlash && i != -1 && j != -1) {
// we are a binary aspect in the default package
lastSlash = i;
}
String fileName = sourceFilePath.substring(lastSlash+1);
IProgramElement fileNode = new ProgramElement(fileName, IProgramElement.Kind.FILE_JAVA, new SourceLocation(new File(sourceFilePath), 1, 1),0,null,null);
//fileNode.setSourceLocation();

+ 9
- 0
bridge/src/org/aspectj/bridge/ISourceLocation.java View File

@@ -64,4 +64,13 @@ public interface ISourceLocation {
/** @return String application-specific context for source */
String getContext();
/**
* In the cases where getSourceFile().getName() returns a class file
* (for example when we have a binary aspect) this should return the
* name of the source file (for example BinaryAspect.aj)
*
* @return the name of the source file
*/
String getSourceFileName();
}

+ 10
- 0
bridge/src/org/aspectj/bridge/SourceLocation.java View File

@@ -60,6 +60,7 @@ public class SourceLocation implements ISourceLocation, java.io.Serializable {
private int offset;
private final String context;
private boolean noColumn;
private String sourceFileName;

/**
* Same as SourceLocation(file, line, line, 0),
@@ -103,6 +104,11 @@ public class SourceLocation implements ISourceLocation, java.io.Serializable {
this.context = context;
}
public SourceLocation(File file, int line, int endLine, int column, String context, String sourceFileName) {
this(file,line,endLine,column,context);
this.sourceFileName = sourceFileName;
}
public File getSourceFile() {
return sourceFile;
}
@@ -156,6 +162,10 @@ public class SourceLocation implements ISourceLocation, java.io.Serializable {
public int getOffset() { return offset;}
public void setOffset(int i) { offset=i;}

public String getSourceFileName() {
return sourceFileName;
}



}

+ 4
- 0
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceLocation.java View File

@@ -158,4 +158,8 @@ public class EclipseSourceLocation implements ISourceLocation {
getOffset()==o.getOffset() &&
((filename==null)?(o.filename==null):o.filename.equals(filename));
}

public String getSourceFileName() {
return null;
}
}

+ 0
- 1
testing/newsrc/org/aspectj/testing/XMLBasedAjcTestCase.java View File

@@ -107,7 +107,6 @@ public abstract class XMLBasedAjcTestCase extends AjcTestCase {
fail("No test '" + title + "' in suite.");
}
}
ajc.setShouldEmptySandbox(true);
boolean run = currentTest.runTest(this);
assertTrue("Test not run",run);
if (clearTest) {

+ 4
- 0
testing/src/org/aspectj/testing/xml/SoftSourceLocation.java View File

@@ -126,4 +126,8 @@ public class SoftSourceLocation implements ISourceLocation {
+ getSourceFile().getPath()
+ ":" + getLine() ;
}

public String getSourceFileName() {
return null;
}
}

+ 2
- 0
tests/src/org/aspectj/systemtest/AllTests.java View File

@@ -20,6 +20,7 @@ import org.aspectj.systemtest.incremental.IncrementalTests;
import org.aspectj.systemtest.incremental.model.IncrementalModelTests;
import org.aspectj.systemtest.incremental.tools.OutputLocationManagerTests;
import org.aspectj.systemtest.inpath.InPathTests;
import org.aspectj.systemtest.model.ModelTests;
import org.aspectj.systemtest.options.OptionsTests;
import org.aspectj.systemtest.pre10x.AjcPre10xTests;
import org.aspectj.systemtest.serialVerUID.SUIDTests;
@@ -52,6 +53,7 @@ public class AllTests {
suite.addTest(SUIDTests.suite());
suite.addTest(XLintTests.suite());
suite.addTest(TracingTests.suite());
suite.addTest(ModelTests.suite());
//$JUnit-END$

return suite;

+ 2
- 0
tests/src/org/aspectj/systemtest/AllTests15.java View File

@@ -11,6 +11,7 @@ import org.aspectj.systemtest.ajc150.ataspectj.AtAjAnnotationGenTests;
import org.aspectj.systemtest.ajc151.AllTestsAspectJ151;
import org.aspectj.systemtest.ajc152.AllTestsAspectJ152;
import org.aspectj.systemtest.ajc153.AllTestsAspectJ153;
import org.aspectj.systemtest.model.Model5Tests;
import org.aspectj.systemtest.incremental.tools.MultiProjectIncrementalTests;
import org.aspectj.systemtest.xlint.XLint5Tests;

@@ -25,6 +26,7 @@ public class AllTests15 {
suite.addTest(AllTestsAspectJ152.suite());
suite.addTest(AllTestsAspectJ153.suite());
suite.addTest(AtAjAnnotationGenTests.suite());
suite.addTest(Model5Tests.suite());
/* FIXME maw Many of these tests do not depend on Java 5 but they
* cannot be executed in Eclipse with 1.3 because of XML issues and
* are excluded on the build machine so moving them here loses nothing

+ 3
- 3
tests/src/org/aspectj/systemtest/ajc150/ajc150.xml View File

@@ -1880,9 +1880,9 @@
<weave classesFiles="AnnotatedType.java,SimpleAnnotation.java,SimpleAnnotation2.java"
aspectsFiles="AnnotationAspect02.aj"
options="-1.5,-showWeaveInfo">
<message kind="weave" text="Type 'AnnotatedType' (AnnotatedType.java:3) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:4)"/>
<message kind="weave" text="Type 'AnnotatedType' (AnnotatedType.java:3) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:2)"/>
<message kind="weave" text="Type 'AnnotatedType' (AnnotatedType.java:4) advised by before advice from 'AnnotationAspect02' (AnnotationAspect02.aj:4)"/>
<message kind="weave" text="Type 'AnnotatedType' (AnnotatedType.java:3) advised by before advice from 'AnnotationAspect02' (aspects.jar!AnnotationAspect02.class:4(from AnnotationAspect02.aj))"/>
<message kind="weave" text="Type 'AnnotatedType' (AnnotatedType.java:3) advised by before advice from 'AnnotationAspect02' (aspects.jar!AnnotationAspect02.class:2(from AnnotationAspect02.aj))"/>
<message kind="weave" text="Type 'AnnotatedType' (AnnotatedType.java:4) advised by before advice from 'AnnotationAspect02' (aspects.jar!AnnotationAspect02.class:4(from AnnotationAspect02.aj))"/>
</weave>
</ajc-test>

+ 6
- 6
tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java View File

@@ -219,11 +219,11 @@ public class Ajc152Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
// expecting:
// sourceOfRelationship main in MyFoo.java
// relationship advised by
// target MyBar.aj
// target MyBar.class
//
// and
//
// sourceOfRelationship MyBar.aj
// sourceOfRelationship MyBar.class
// relationship advises
// target main in MyFoo.java

@@ -236,8 +236,8 @@ public class Ajc152Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
String sourceOfRelationship = (String) iter.next();
IProgramElement ipe = top.findElementForHandle(sourceOfRelationship);
List relationships = asmRelMap.get(ipe);
if (ipe.getName().equals("MyBar.aj")) {
assertEquals("expected MyBar.aj to have one relationships but found "
if (ipe.getName().equals("MyBar.class")) {
assertEquals("expected MyBar.class to have one relationships but found "
+ relationships.size(),1,relationships.size());
Relationship rel = (Relationship)relationships.get(0);
assertEquals("expected relationship to be 'advises' but was "
@@ -264,8 +264,8 @@ public class Ajc152Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
List targets = rel.getTargets();
assertEquals("expected one target but found " + targets.size(),1,targets.size());
IProgramElement link = top.findElementForHandle((String)targets.get(0));
assertEquals("expected target 'MyBar.aj' but target " + link.getName(),
"MyBar.aj",link.getName());
assertEquals("expected target 'MyBar.class' but target " + link.getName(),
"MyBar.class",link.getName());
} else {
fail("unexpected element " + ipe.getName() + " in the relationship map");

+ 0
- 1
tests/src/org/aspectj/systemtest/ajc152/AllTestsAspectJ152.java View File

@@ -19,7 +19,6 @@ public class AllTestsAspectJ152 {
TestSuite suite = new TestSuite("AspectJ 1.5.2 tests");
//$JUnit-BEGIN$
suite.addTest(Ajc152Tests.suite());
suite.addTest(CreatingModelForInjarTests.suite());
suite.addTest(SynchronizationTests.suite());
suite.addTest(SynchronizationTransformTests.suite());
//$JUnit-END$

+ 0
- 198
tests/src/org/aspectj/systemtest/ajc152/CreatingModelForInjarTests.java View File

@@ -1,198 +0,0 @@
/********************************************************************
* Copyright (c) 2006 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 - initial version
*******************************************************************/
package org.aspectj.systemtest.ajc152;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import junit.framework.Test;

import org.aspectj.asm.AsmManager;
import org.aspectj.asm.IHierarchy;
import org.aspectj.asm.IProgramElement;
import org.aspectj.asm.IRelationshipMap;
import org.aspectj.testing.XMLBasedAjcTestCase;
//import org.aspectj.weaver.World;

public class CreatingModelForInjarTests extends org.aspectj.testing.XMLBasedAjcTestCase {
public void testAdviceAndNamedPCD() {
runTest("advice and deow");

// expect:
// - pkg {package}
// - A.aj (binary) {java source file}
// - import declarations {import reference}
// - A {aspect}
// - p {pointcut}
// - before {advice}

IProgramElement pkgNode = getPkgNode();
IProgramElement srcFile = checkChild(pkgNode,IProgramElement.Kind.FILE_JAVA,"A.aj (binary)",1);
checkChild(srcFile,IProgramElement.Kind.IMPORT_REFERENCE,"import declarations",-1);
IProgramElement aspectNode = checkChild(srcFile,IProgramElement.Kind.ASPECT,"A",-1);
checkChild(aspectNode,IProgramElement.Kind.POINTCUT,"p",5);
checkChild(aspectNode,IProgramElement.Kind.ADVICE,"before",7);
}

public void testDeclareWarning() {
runTest("advice and deow");

// expect:
// - pkg {package}
// - Deow.aj (binary) {java source file}
// - import declarations {import reference}
// - Deow {aspect}
// - declare warning {declare warning}

IHierarchy top = AsmManager.getDefault().getHierarchy();
IProgramElement dwNode = top.findElementForLabel(top.getRoot(),
IProgramElement.Kind.DECLARE_WARNING,
"declare warning: \"There should be n..\"");
assertNotNull("Couldn't find 'declare warning: \"There should be n..\"' " +
"element in the tree",dwNode);
assertEquals("expected 'declare warning: \"There should be n..\"'" +
" to be on line 5 but was on " + dwNode.getSourceLocation().getLine(),
5, dwNode.getSourceLocation().getLine());
}
public void testNumberOfPackageNodes() {
runTest("advice and deow");
// check that the 'pkg' package node has not been added twice
IProgramElement root = AsmManager.getDefault().getHierarchy().getRoot();
List l = root.getChildren();
int numberOfPkgs = 0;
for (Iterator iter = l.iterator(); iter.hasNext();) {
IProgramElement element = (IProgramElement) iter.next();
if (element.getKind().equals(IProgramElement.Kind.PACKAGE)
&& element.getName().equals("pkg")) {
numberOfPkgs++;
}
}
assertEquals("expected one package called 'pkg' but found " + numberOfPkgs,1,numberOfPkgs);
}
public void testAdviceInRelMap() {
runTest("advice and deow");
IHierarchy top = AsmManager.getDefault().getHierarchy();
IProgramElement adviceNode = top.findElementForLabel(top.getRoot(), IProgramElement.Kind.ADVICE,"before(): p..");
IRelationshipMap relMap = AsmManager.getDefault().getRelationshipMap();
List adviceRels = relMap.get(adviceNode);
assertFalse("expected before advice to have relationships but did not",adviceRels.isEmpty());
}
public void testDeclareWarningInRelMap() {
runTest("advice and deow");
IHierarchy top = AsmManager.getDefault().getHierarchy();
IProgramElement dwNode = top.findElementForLabel(top.getRoot(),
IProgramElement.Kind.DECLARE_WARNING,
"declare warning: \"There should be n..\"");
IRelationshipMap relMap = AsmManager.getDefault().getRelationshipMap();
List dwRels = relMap.get(dwNode);
assertFalse("expected declare warning to have relationships but did not",dwRels.isEmpty());
}
public void testAdviceLabelsCorrect() {
runTest("ensure advice label is correct");
IHierarchy top = AsmManager.getDefault().getHierarchy();
IProgramElement node = top.findElementForLabel(top.getRoot(),
IProgramElement.Kind.ADVICE, "before(): execM1()..");
assertNotNull("expected to find ipe with label 'before(): execM1()..'" +
" but didn't", node);
node = top.findElementForLabel(top.getRoot(),
IProgramElement.Kind.ADVICE, "before(): execM2()..");
assertNotNull("expected to find ipe with label 'before(): execM2()..'" +
" but didn't", node);
node = top.findElementForLabel(top.getRoot(),
IProgramElement.Kind.ADVICE, "before(): <anonymous pointcut>");
assertNotNull("expected to find ipe with label 'before(): <anonymous pointcut>'" +
" but didn't", node);
}
// ensure that filled in hierarchy only has one entry for
// aspect
public void testOnlyOneAspectEntry() {
runTest("ensure advice label is correct");
IProgramElement pkgNode = getPkgNode();
assertEquals("expected one child node but found " +
pkgNode.getChildren().size(), 1, pkgNode.getChildren().size());
}
public void testOnlyOneAspectEntry_inDefaultPackage() {
runTest("aspect in default package");
// expect there to be two children - 'pack' and
// 'AspectInDefaultPackage.aj (binary)'
IProgramElement defaultPkg = AsmManager.getDefault().getHierarchy().getRoot();
assertEquals("expected two child node but found " +
defaultPkg.getChildren().size(), 2, defaultPkg.getChildren().size());
}
// --------------------- Helper methods ---------------------
private IProgramElement getPkgNode() {
IHierarchy top = AsmManager.getDefault().getHierarchy();
IProgramElement pkgNode = top.findElementForLabel(top.getRoot(),
IProgramElement.Kind.PACKAGE,"pkg");
assertNotNull("Couldn't find 'pkg' element in the tree",pkgNode);
return pkgNode;
}
private IProgramElement checkChild(IProgramElement parent,
IProgramElement.Kind childKind,
String childName,
int childLineNumbr) {
List children = parent.getChildren();
boolean foundChild = false;
for (Iterator iter = children.iterator(); iter.hasNext();) {
IProgramElement element = (IProgramElement) iter.next();
if (element.getKind().equals(childKind)
&& element.getName().equals(childName) ) {
foundChild = true;
if (childLineNumbr != -1) {
assertEquals("expected " + childKind.toString() + childName +
" to be on line " + childLineNumbr + " but was on " +
element.getSourceLocation().getLine(),
childLineNumbr, element.getSourceLocation().getLine());
}
return element;
}
}
assertTrue("expected " + parent.getName() + " to have child " + childName
+ " but it did not", foundChild);
return null;
}
protected void setUp() throws Exception {
super.setUp();
// World.createInjarHierarchy = true;
}

protected void tearDown() throws Exception {
super.tearDown();
// World.createInjarHierarchy = false;
}

// ///////////////////////////////////////
public static Test suite() {
return XMLBasedAjcTestCase.loadSuite(CreatingModelForInjarTests.class);
}

protected File getSpecFile() {
return new File("../tests/src/org/aspectj/systemtest/ajc152/injar.xml");
}
}

+ 0
- 20
tests/src/org/aspectj/systemtest/ajc152/injar.xml View File

@@ -1,20 +0,0 @@
<!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd"[]>

<!-- AspectJ v1.5.2 Tests -->
<suite>

<ajc-test dir="bugs152/pr145963" title="advice and deow">
<compile files="ClassForAspectPath.java" aspectpath="adviceAndDeow.jar" options="-emacssym">
<message kind="warning" line="9" text="There should be no printlns"/>
</compile>
</ajc-test>

<ajc-test dir="bugs152/pr145963" title="ensure advice label is correct">
<compile files="C.java" aspectpath="adviceLabels.jar" options="-emacssym"/>
</ajc-test>
<ajc-test dir="bugs152/pr145963" title="aspect in default package">
<compile files="C.java" aspectpath="aspectInDefaultPackage.jar" options="-emacssym"/>
</ajc-test>

</suite>

+ 42
- 0
tests/src/org/aspectj/systemtest/model/Model5Tests.java View File

@@ -0,0 +1,42 @@
/********************************************************************
* Copyright (c) 2006 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 - initial version
*******************************************************************/
package org.aspectj.systemtest.model;

import java.io.File;

import junit.framework.Test;

import org.aspectj.testing.XMLBasedAjcTestCase;

/**
* Tests the model when there is a requirement on Java5 features.
* @see org.aspectj.systemtest.model.ModelTestCase
*/
public class Model5Tests extends ModelTestCase {

static {
// Switch this to true for a single iteration if you want to reconstruct the
// 'expected model' files.
regenerate = false;
// Switch this to true if you want to debug the comparison
debugTest = false;
}
// ///////////////////////////////////////
public static Test suite() {
return XMLBasedAjcTestCase.loadSuite(Model5Tests.class);
}

protected File getSpecFile() {
return new File("../tests/src/org/aspectj/systemtest/model/model.xml");
}

}

+ 208
- 0
tests/src/org/aspectj/systemtest/model/ModelTestCase.java View File

@@ -0,0 +1,208 @@
/********************************************************************
* Copyright (c) 2006 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 - initial version
*******************************************************************/
package org.aspectj.systemtest.model;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.aspectj.asm.AsmManager;
import org.aspectj.asm.IElementHandleProvider;
import org.aspectj.asm.IModelFilter;
import org.aspectj.asm.internal.JDTLikeHandleProvider;
import org.aspectj.testing.XMLBasedAjcTestCase;
import org.aspectj.util.FileUtil;

/**
* This class provides an extension to the XMLBasedAjcTestCase to manage
* testing the model. It assumes the testdata is in ../tests/model/<testid>
* and that the expected model against which to do the comparison is in
* the file ../tests/model/expected/<testid>.txt. One test ensures that both
* the model and the relationship map are as expected for the given testdata.
*
* To write a testcase, create a testdata directory containing the data
* for the test run and a file containing the expected model (this can be
* generated by setting the regenerate flag to true). Add the required
* configuration to model.xml. Finally, create a testcase in either ModelTests
* or Model5Tests (depending on whether the testcase has a requirement
* on Java5) and call runModelTest(<title of test>,<testid>).
*/
public abstract class ModelTestCase extends XMLBasedAjcTestCase {

protected static boolean regenerate = false;
protected static boolean debugTest = false;

private final String expectedOutDir = "../tests/model/expected" + File.separator;
private String testid;
private String modelFilename;
private IElementHandleProvider handleProvider;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
// using the JDTLikeHandleProvider because this produces consistent handles
// over different compiles
handleProvider = AsmManager.getDefault().getHandleProvider();
AsmManager.getDefault().setHandleProvider(new JDTLikeHandleProvider());
// We are about to create a sandbox for the model output file, don't let the
// following compile wipe it.
ajc.setShouldEmptySandbox(false);
// report all information - model, relationships delta processing
modelFilename = ajc.getSandboxDirectory().getAbsolutePath() + File.separator + "model.txt";
AsmManager.setReporting(modelFilename,
true,true,true,false,new TestFilter(ajc.getSandboxDirectory().getAbsolutePath()));
}
static class TestFilter implements IModelFilter {
String sandboxDirectory ;
public TestFilter(String sandboxDirectory) {
this.sandboxDirectory = sandboxDirectory;
}

public String processFilelocation(String loc) {
if (loc.startsWith(sandboxDirectory)) return "TEST_SANDBOX"+loc.substring(sandboxDirectory.length());
return loc;
}

public boolean wantsHandleIds() {
return false;
}
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
AsmManager.getDefault().setHandleProvider(handleProvider);
AsmManager.setDontReport();
ajc.setShouldEmptySandbox(true);
}
/**
* Firstly sets the testid which is both the name of the expected output
* file and the name of the testdata directory. It then
* invokes XMLBasedAjcTestCase.runTest(String) with the given
* title and finally verifies that the model file created from this test
* run is the same as the expected output (includes model information, the
* relationship map and various properties about the model) contained
* in ../tests/model/expected/<testid>.txt
*/
protected void runModelTest(String title,String testid) {
this.testid = testid;
runTest(title);
verifyModel();
}
private void verifyModel() {
File expectedOutput = new File(expectedOutDir + testid + ".txt");
if (regenerate) {
// Create the file
saveModel(expectedOutput);
} else {
// Verify the file matches what we have
compareModel(expectedOutput);
}
}
private void compareModel(File expectedF) {
if (debugTest) System.out.println("comparing with model in file " + expectedF.getAbsolutePath());
List fileContents = new ArrayList();
try {
String sandboxDir = ajc.getSandboxDirectory().getAbsolutePath();
String modelOutput = modelFilename;
// Load the file with the expected output
BufferedReader expect = new BufferedReader(new FileReader(expectedF));
// String tempDir = expect.readLine();
String expectedLine = null;
while((expectedLine=expect.readLine())!=null) {
fileContents.add(expectedLine);
}
List expectedFileContents = new ArrayList();
expectedFileContents.addAll(fileContents);
// Load the file with the output from this test run
BufferedReader found = new BufferedReader(new FileReader(new File(modelOutput)));
String foundLine = null;
List foundFileContents = new ArrayList();
while((foundLine=found.readLine())!=null) {
// int i = foundLine.indexOf(sandboxDir);
// if (i == -1) {
// int j = foundLine.indexOf("(targets=");
// if (j == -1) {
foundFileContents.add(foundLine);
// } else {
// foundFileContents.add(foundLine.substring(j));
// }
// } else {
// String newLine = foundLine.substring(0,i) + tempDir
// + foundLine.substring(i + sandboxDir.length());
// foundFileContents.add(newLine);
// }
}
// iterate over what we found
for (Iterator iter = foundFileContents.iterator(); iter.hasNext();) {
String line = (String) iter.next();
if (debugTest) System.err.println("looking at model entry: " + line);
if (!fileContents.contains(line)) {
// if (!((String)fileContents.get(lineNumber)).equals(line)) {
if(debugTest) {
System.err.println("couldn't find: " + line);
for (Iterator iterator = fileContents.iterator(); iterator
.hasNext();) {
String element = (String) iterator.next();
System.err.println("compared with: " + element);
}
}
// StringBuffer errorData = new StringBuffer();
// errorData.append("Problem with comparison at line number: "+)
fail("couldn't find model entry '" + line + "' in expected output");
} else {
fileContents.remove(line);
}
}
if (debugTest && !fileContents.isEmpty()) {
for (Iterator iter = fileContents.iterator(); iter
.hasNext();) {
String element = (String) iter.next();
System.err.println("remaining: " + element);
}
}
assertTrue("should have found all expected model output: " + fileContents,fileContents.isEmpty());
} catch (Exception e) {
fail("Unexpected exception comparing model files:"+e);
}
}
private void saveModel(File f) {
if (debugTest) System.out.println("Saving model into "+f.getAbsolutePath());
File modelFile = new File(modelFilename);
try {
FileUtil.copyFile(modelFile, f);
} catch (IOException ioe) {
ioe.printStackTrace();
fail("Couldn't copy file to "+f.toString());
}
}

}

+ 47
- 0
tests/src/org/aspectj/systemtest/model/ModelTests.java View File

@@ -0,0 +1,47 @@
/********************************************************************
* Copyright (c) 2006 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 - initial version
*******************************************************************/
package org.aspectj.systemtest.model;

import java.io.File;

import junit.framework.Test;

import org.aspectj.testing.XMLBasedAjcTestCase;

/**
* Tests the model when there is no requirement on Java5 features.
* @see org.aspectj.systemtest.model.ModelTestCase
*/
public class ModelTests extends ModelTestCase {
static {
// Switch this to true for a single iteration if you want to reconstruct the
// 'expected model' files.
regenerate = false;
// Switch this to true if you want to debug the comparison
debugTest = false;
}
public void testSourceLocationAndJarFile_pr145963() {runModelTest("sourcelocation and jar file","pr145963_1");}
public void testSourceLocationAndClassFile_pr145963() {runModelTest("sourcelocation and class file","pr145963_2");}
public void testAspectInDefaultPackage_pr145963() {runModelTest("aspect in default package", "pr145963_3");}
public void testAspectInJavaFile_pr145963() {runModelTest("aspect in java file", "pr145963_4");}
/////////////////////////////////////////
public static Test suite() {
return XMLBasedAjcTestCase.loadSuite(ModelTests.class);
}

protected File getSpecFile() {
return new File("../tests/src/org/aspectj/systemtest/model/model.xml");
}

}

+ 31
- 0
tests/src/org/aspectj/systemtest/model/model.xml View File

@@ -0,0 +1,31 @@
<!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd"[]>

<!-- Model and Hierarchy Tests -->
<suite>

<ajc-test dir="model/pr145963_1" title="sourcelocation and jar file">
<compile files="C.java, SourceAspect.aj" aspectpath="simple.jar" options="-emacssym">
<message kind="warning" line="6" text="There should be no printlns"/>
</compile>
</ajc-test>

<ajc-test dir="model/pr145963_2" title="sourcelocation and class file">
<compile files="C.java, SourceAspect.aj" aspectpath="pkg" options="-emacssym">
<message kind="warning" line="6" text="There should be no printlns"/>
</compile>
</ajc-test>

<ajc-test dir="model/pr145963_3" title="aspect in default package">
<compile files="C.java" aspectpath="simple.jar" options="-emacssym">
<message kind="warning" line="6" text="There should be no printlns"/>
</compile>
</ajc-test>

<ajc-test dir="model/pr145963_4" title="aspect in java file">
<compile files="C.java" aspectpath="simple.jar" options="-emacssym">
<message kind="warning" line="6" text="There should be no printlns"/>
</compile>
</ajc-test>


</suite>

+ 1
- 2
weaver/src/org/aspectj/weaver/Advice.java View File

@@ -434,7 +434,6 @@ public abstract class Advice extends ShadowMunger {
public ResolvedType getResolvedDeclaringAspect() {
// The aspect which declares this piece of advice
// is 'concreteAspect' since 'declaringType' is null
return concreteAspect;
return ((concreteAspect != null) ? concreteAspect : getDeclaringType());
}

}

+ 13
- 0
weaver/src/org/aspectj/weaver/ResolvedType.java View File

@@ -40,6 +40,7 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl
public static final String PARAMETERIZED_TYPE_IDENTIFIER = "P";
private ResolvedType[] resolvedTypeParams;
private String binaryPath;
protected World world;
@@ -2095,5 +2096,17 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl
}
return myMap;
}
public void setBinaryPath(String binaryPath) {
this.binaryPath = binaryPath;
}

/**
* Returns the path to the jar or class file from which this
* binary aspect came or null if not a binary aspect
*/
public String getBinaryPath() {
return binaryPath;
}
}

+ 16
- 1
weaver/src/org/aspectj/weaver/Shadow.java View File

@@ -565,9 +565,24 @@ public abstract class Shadow {
int takeFrom = isl.getSourceFile().getPath().lastIndexOf('/');
if (takeFrom == -1) {
takeFrom = isl.getSourceFile().getPath().lastIndexOf('\\');
}
}
int binary = isl.getSourceFile().getPath().lastIndexOf('!');
if (binary != -1 && binary < takeFrom) {
// we have been woven by a binary aspect
String pathToBinaryLoc = isl.getSourceFile().getPath().substring(0,binary + 1);
if (pathToBinaryLoc.indexOf(".jar") != -1) {
// only want to add the extra info if we're from a jar file
int lastSlash = pathToBinaryLoc.lastIndexOf('/');
if (lastSlash == -1) {
lastSlash = pathToBinaryLoc.lastIndexOf('\\');
}
nice.append(pathToBinaryLoc.substring(lastSlash + 1));
}
}
nice.append(isl.getSourceFile().getPath().substring(takeFrom +1));
if (isl.getLine()!=0) nice.append(":").append(isl.getLine());
// if it's a binary file then also want to give the file name
if (isl.getSourceFileName() != null ) nice.append("(from " + isl.getSourceFileName() + ")");
}
return nice.toString();
}

+ 115
- 27
weaver/src/org/aspectj/weaver/ShadowMunger.java View File

@@ -13,6 +13,7 @@

package org.aspectj.weaver;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -23,6 +24,7 @@ import org.aspectj.asm.AsmManager;
import org.aspectj.asm.IProgramElement;
import org.aspectj.asm.internal.ProgramElement;
import org.aspectj.bridge.ISourceLocation;
import org.aspectj.bridge.SourceLocation;
import org.aspectj.util.PartialOrder;
import org.aspectj.weaver.bcel.BcelAdvice;
import org.aspectj.weaver.patterns.DeclareErrorOrWarning;
@@ -48,6 +50,8 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
protected int start, end;
protected ISourceContext sourceContext;
private ISourceLocation sourceLocation;
private ISourceLocation binarySourceLocation;
private File binaryFile;
private String handle = null;
private ResolvedType declaringType; // the type that declared this munger.

@@ -91,6 +95,12 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
sourceLocation = sourceContext.makeSourceLocation(this);
}
}
if (isBinary()) {
if (binarySourceLocation == null) {
binarySourceLocation = getBinarySourceLocation(sourceLocation);
}
return binarySourceLocation;
}
return sourceLocation;
}

@@ -156,16 +166,26 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
* Creates the hierarchy for binary aspects
*/
public void createHierarchy() {
if (!isBinary()) return;
IProgramElement sourceFileNode = AsmManager.getDefault().getHierarchy().findElementForSourceLine(getSourceLocation());
// the call to findElementForSourceLine(ISourceLocation) returns a file node
// if it can't find a node in the hierarchy for the given sourcelocation.
// Therefore, if this is returned, we know we can't find one and have to
// continue to fault in the model.
if (!sourceFileNode.getKind().equals(IProgramElement.Kind.FILE_JAVA)) {
return;
}
String name = sourceFileNode.getName();
sourceFileNode.setName(name + " (binary)");
AsmManager.getDefault().getHandleProvider().createHandleIdentifier(sourceFileNode);
ResolvedType aspect = getResolvedDeclaringAspect();
// create the class file node
IProgramElement classFileNode = new ProgramElement(
sourceFileNode.getName() + " (binary)",
IProgramElement.Kind.CLASS,
getBinarySourceLocation(aspect.getSourceLocation()),
0,null,null);
// create package ipe if one exists....
IProgramElement root = AsmManager.getDefault().getHierarchy().getRoot();
if (aspect.getPackageName() != null) {
@@ -179,42 +199,44 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
IProgramElement.Kind.PACKAGE,
new ArrayList());
root.addChild(pkgNode);
pkgNode.addChild(sourceFileNode);
pkgNode.addChild(classFileNode);
} else {
// need to add it first otherwise the handle for classFileNode
// may not be generated correctly if it uses information from
// it's parent node
pkgNode.addChild(classFileNode);
for (Iterator iter = pkgNode.getChildren().iterator(); iter.hasNext();) {
IProgramElement element = (IProgramElement) iter.next();
if (element.getHandleIdentifier().equals(
sourceFileNode.getHandleIdentifier())) {
// already added the sourcefile so have already
if (!element.equals(classFileNode) &&
element.getHandleIdentifier().equals(
classFileNode.getHandleIdentifier())) {
// already added the classfile so have already
// added the structure for this aspect
pkgNode.removeChild(classFileNode);
return;
}
}
pkgNode.addChild(sourceFileNode);
}
} else {
// need to add it first otherwise the handle for classFileNode
// may not be generated correctly if it uses information from
// it's parent node
root.addChild(classFileNode);
for (Iterator iter = root.getChildren().iterator(); iter.hasNext();) {
IProgramElement element = (IProgramElement) iter.next();
if (element.getHandleIdentifier().equals(
sourceFileNode.getHandleIdentifier())) {
if (!element.equals(classFileNode) &&
element.getHandleIdentifier().equals(
classFileNode.getHandleIdentifier())) {
// already added the sourcefile so have already
// added the structure for this aspect
root.removeChild(classFileNode);
return;
}
}
root.addChild(sourceFileNode);
}
// remove the error child from the 'A.aj' node
if (sourceFileNode instanceof ProgramElement) {
IProgramElement errorNode = (IProgramElement) sourceFileNode.getChildren().get(0);
if (errorNode.getKind().equals(IProgramElement.Kind.ERROR)) {
((ProgramElement)sourceFileNode).removeChild(errorNode);
}
}
// add and create empty import declaration ipe
sourceFileNode.addChild(new ProgramElement(
classFileNode.addChild(new ProgramElement(
"import declarations",
IProgramElement.Kind.IMPORT_REFERENCE,
null,0,null,null));
@@ -223,10 +245,10 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
IProgramElement aspectNode = new ProgramElement(
aspect.getSimpleName(),
IProgramElement.Kind.ASPECT,
aspect.getSourceLocation(),
getBinarySourceLocation(aspect.getSourceLocation()),
aspect.getModifiers(),
null,null);
sourceFileNode.addChild(aspectNode);
classFileNode.addChild(aspectNode);
addChildNodes(aspectNode,aspect.getDeclaredPointcuts());

@@ -242,7 +264,7 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
parent.addChild(new ProgramElement(
pcd.getName(),
IProgramElement.Kind.POINTCUT,
rpcd.getPointcut().getSourceLocation(),
getBinarySourceLocation(rpcd.getPointcut().getSourceLocation()),
pcd.getModifiers(),
null,
Collections.EMPTY_LIST));
@@ -258,8 +280,8 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
IProgramElement deowNode = new ProgramElement(
decl.isError() ? "declare error" : "declare warning",
decl.isError() ? IProgramElement.Kind.DECLARE_ERROR : IProgramElement.Kind.DECLARE_WARNING,
getSourceLocation(),
this.getDeclaringType().getModifiers(),
getBinarySourceLocation(decl.getSourceLocation()),
decl.getDeclaringType().getModifiers(),
null,null);
deowNode.setDetails("\"" + AsmRelationshipUtils.genDeclareMessage(decl.getMessage()) + "\"");
parent.addChild(deowNode);
@@ -268,12 +290,78 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
IProgramElement adviceNode = new ProgramElement(
advice.kind.getName(),
IProgramElement.Kind.ADVICE,
getSourceLocation(),
getBinarySourceLocation(advice.getSourceLocation()),
advice.signature.getModifiers(),null,Collections.EMPTY_LIST);
adviceNode.setDetails(AsmRelationshipUtils.genPointcutDetails(advice.getPointcut()));
parent.addChild(adviceNode);
}
}
}

/**
* Returns the binarySourceLocation for the given sourcelocation. This
* isn't cached because it's used when faulting in the binary nodes
* and is called with ISourceLocations for all advice, pointcuts and deows
* contained within the resolvedDeclaringAspect.
*/
private ISourceLocation getBinarySourceLocation(ISourceLocation sl) {
if (sl == null) return null;
String sourceFileName = null;
if (getResolvedDeclaringAspect() instanceof ReferenceType) {
String s = ((ReferenceType)getResolvedDeclaringAspect()).getDelegate().getSourcefilename();
int i = s.lastIndexOf('/');
if (i != -1) {
sourceFileName = s.substring(i+1);
} else {
sourceFileName = s;
}
}
ISourceLocation sLoc = new SourceLocation(
getBinaryFile(),
sl.getLine(),
sl.getEndLine(),
((sl.getColumn() == 0) ? ISourceLocation.NO_COLUMN : sl.getColumn()),
sl.getContext(),
sourceFileName);
return sLoc;
}
/**
* Returns the File with pathname to the class file, for example either
* C:\temp\ajcSandbox\workspace\ajcTest16957.tmp\simple.jar!pkg\BinaryAspect.class
* if the class file is in a jar file, or
* C:\temp\ajcSandbox\workspace\ajcTest16957.tmp!pkg\BinaryAspect.class
* if the class file is in a directory
*/
private File getBinaryFile() {
if (binaryFile == null) {
String s = getResolvedDeclaringAspect().getBinaryPath();
File f = getResolvedDeclaringAspect().getSourceLocation().getSourceFile();
int i = f.getPath().lastIndexOf('.');
String path = f.getPath().substring(0,i) + ".class";
binaryFile = new File(s + "!" + path);
}
return binaryFile;
}
/**
* Returns whether or not this shadow munger came from
* a binary aspect - keep a record of whether or not we've
* checked if we're binary otherwise we keep caluclating the
* same thing many times
*/
protected boolean isBinary() {
if (!checkedIsBinary) {
ResolvedType rt = getResolvedDeclaringAspect();
if (rt != null) {
isBinary = ((rt.getBinaryPath() == null) ? false : true);
}
checkedIsBinary = true;
}
return isBinary;
}
private boolean isBinary;
private boolean checkedIsBinary;
}

+ 5
- 0
weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java View File

@@ -241,6 +241,7 @@ public class BcelWeaver implements IWeaver {
inStream.closeEntry();
ResolvedType type = world.addSourceObjectType(jc).getResolvedTypeX();
type.setBinaryPath(inFile.getAbsolutePath());
if (type.isAspect()) {
addedAspects.add(type);
}
@@ -272,6 +273,10 @@ public class BcelWeaver implements IWeaver {
ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes),name);
JavaClass jc = parser.parse();
ResolvedType type = world.addSourceObjectType(jc).getResolvedTypeX();
String typeName = type.getName().replace('.', File.separatorChar);
int end = name.indexOf(typeName);
String binaryPath = name.substring(0,end-1);
type.setBinaryPath(binaryPath);
if (type.isAspect()) {
toList.add(type);
}

Loading…
Cancel
Save