diff options
author | aclement <aclement> | 2010-01-29 20:30:35 +0000 |
---|---|---|
committer | aclement <aclement> | 2010-01-29 20:30:35 +0000 |
commit | b21cd2fcde00255aef5de268c66350c6fb1d8441 (patch) | |
tree | 4e14405aaf168882f4b8388643874aadb175fec0 /loadtime | |
parent | 9e935c0777e5780c8e4ce89dfaf32f2a7f34faa7 (diff) | |
download | aspectj-b21cd2fcde00255aef5de268c66350c6fb1d8441.tar.gz aspectj-b21cd2fcde00255aef5de268c66350c6fb1d8441.zip |
extended definition and code gen to allow for deows
Diffstat (limited to 'loadtime')
-rw-r--r-- | loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java index 41b9b4ca3..32293bee1 100644 --- a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java +++ b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java @@ -26,6 +26,7 @@ import org.aspectj.apache.bcel.classfile.annotation.AnnotationGen; import org.aspectj.apache.bcel.classfile.annotation.ElementValue; import org.aspectj.apache.bcel.classfile.annotation.NameValuePair; import org.aspectj.apache.bcel.classfile.annotation.SimpleElementValue; +import org.aspectj.apache.bcel.generic.FieldGen; import org.aspectj.apache.bcel.generic.InstructionConstants; import org.aspectj.apache.bcel.generic.InstructionList; import org.aspectj.apache.bcel.generic.ObjectType; @@ -48,6 +49,7 @@ import org.aspectj.weaver.loadtime.definition.Definition; import org.aspectj.weaver.patterns.PerClause; import org.aspectj.weaver.patterns.PerSingleton; + /** * Generates bytecode for concrete-aspect. * <p> @@ -176,14 +178,14 @@ public class ConcreteAspectCodeGen { return false; } - // extends must be abstract - if (!parent.isAbstract()) { + // extends must be abstract (allow for special case of Object where just using aspect for deows) + if (!(parent.isAbstract() || parent.equals(ResolvedType.OBJECT))) { reportError("Attempt to concretize a non-abstract aspect: " + stringify()); return false; } - // m_parent must be aspect - if (!parent.isAspect()) { + // m_parent must be aspect (allow for special case of Object where just using aspect for deows) + if (!(parent.isAspect() || parent.equals(ResolvedType.OBJECT))) { reportError("Attempt to concretize a non aspect: " + stringify()); return false; } @@ -430,6 +432,31 @@ public class ConcreteAspectCodeGen { cg.addMethodGen(mg); } + if (concreteAspect.deows.size() > 0) { + + int counter = 1; + for (Definition.DeclareErrorOrWarning deow : concreteAspect.deows) { + + // Building this: + + // @DeclareWarning("call(* javax.sql..*(..)) && !within(org.xyz.daos..*)") + // static final String aMessage = "Only DAOs should be calling JDBC."; + + FieldGen field = new FieldGen(Modifier.FINAL, ObjectType.STRING, "rule" + (counter++), cg.getConstantPool()); + SimpleElementValue svg = new SimpleElementValue(ElementValue.STRING, cg.getConstantPool(), deow.pointcut); + List elems = new ArrayList(); + elems.add(new NameValuePair("value", svg, cg.getConstantPool())); + AnnotationGen mag = new AnnotationGen(new ObjectType("org/aspectj/lang/annotation/Declare" + + (deow.isError ? "Error" : "Warning")), elems, true, cg.getConstantPool()); + field.addAnnotation(mag); + + field.setValue(deow.message); + cg.addField(field, null); + + + } + } + // handle the perClause ReferenceType rt = new ReferenceType(ResolvedType.forName(concreteAspect.name).getSignature(), world); GeneratedReferenceTypeDelegate grtd = new GeneratedReferenceTypeDelegate(rt); |