From 325ea44eee9ade6fbe2d00439e029b6e41c5eec3 Mon Sep 17 00:00:00 2001 From: jhugunin Date: Wed, 15 Jan 2003 02:04:20 +0000 Subject: [PATCH] better handling of binary only types in the eclipse pass --- .../compiler/ast/AspectDeclaration.java | 12 +- .../compiler/lookup/EclipseBinaryType.java | 106 +++++++++++++ .../compiler/lookup/EclipseObjectType.java | 130 ++-------------- .../compiler/lookup/EclipseSourceType.java | 144 ++++++++++++++++++ .../compiler/lookup/EclipseWorld.java | 105 +++++++------ .../internal/core/builder/AjBuildManager.java | 12 +- .../src/org/aspectj/weaver/ResolvedTypeX.java | 3 +- weaver/testdata/dummyAspect.jar | Bin 589 -> 589 bytes weaver/testdata/megatrace.jar | Bin 4895 -> 3555 bytes weaver/testdata/megatraceNoweave.jar | Bin 2696 -> 2709 bytes weaver/testdata/tracing.jar | Bin 2268 -> 2291 bytes 11 files changed, 336 insertions(+), 176 deletions(-) create mode 100644 org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseBinaryType.java create mode 100644 org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java index c6a4a3b58..c85ba8355 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AspectDeclaration.java @@ -13,21 +13,15 @@ package org.aspectj.ajdt.internal.compiler.ast; -import java.io.*; -import java.lang.reflect.Modifier; +import java.lang.reflect.*; -import org.apache.bcel.classfile.AccessFlags; import org.aspectj.ajdt.internal.compiler.lookup.*; -import org.aspectj.ajdt.internal.compiler.lookup.EclipseWorld; import org.aspectj.weaver.*; -import org.aspectj.weaver.AjAttribute; import org.aspectj.weaver.patterns.*; import org.eclipse.jdt.internal.compiler.*; import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.codegen.*; -import org.eclipse.jdt.internal.compiler.codegen.CodeStream; import org.eclipse.jdt.internal.compiler.lookup.*; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; // making all aspects member types avoids a nasty hierarchy pain @@ -42,7 +36,7 @@ public class AspectDeclaration extends MemberTypeDeclaration { public boolean isPrivileged; - public EclipseObjectType typeX; + public EclipseSourceType typeX; public EclipseWorld world; //??? should use this consistently @@ -630,7 +624,7 @@ public class AspectDeclaration extends MemberTypeDeclaration { if (ignoreFurtherInvestigation) return; world = EclipseWorld.fromScopeLookupEnvironment(scope); - typeX = (EclipseObjectType)world.fromEclipse(binding); + typeX = (EclipseSourceType)world.fromEclipse(binding); if (isPrivileged) { binding.privilegedHandler = new PrivilegedHandler(this); diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseBinaryType.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseBinaryType.java new file mode 100644 index 000000000..4fb4f54a6 --- /dev/null +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseBinaryType.java @@ -0,0 +1,106 @@ +/* ******************************************************************* + * 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.ajdt.internal.compiler.lookup; + +import java.util.*; + +import org.aspectj.ajdt.internal.compiler.ast.*; +import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration; +import org.aspectj.bridge.*; +import org.aspectj.bridge.MessageUtil; +import org.aspectj.weaver.*; +import org.aspectj.weaver.patterns.*; +import org.eclipse.jdt.internal.compiler.ast.*; +import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; +import org.eclipse.jdt.internal.compiler.lookup.*; + +public class EclipseBinaryType extends EclipseObjectType { + private BinaryTypeBinding binding; + private ResolvedTypeX delegate; + + public EclipseBinaryType(ResolvedTypeX delegate, EclipseWorld world, BinaryTypeBinding binding) { + super(delegate.getSignature(), world, delegate.isExposedToWeaver()); + this.delegate = delegate; + this.binding = binding; + } + + + protected void fillDeclaredMembers() { + this.declaredPointcuts = copyResolvedPointcutDefinitions(delegate.getDeclaredPointcuts()); + this.declaredFields = copyResolvedMembers(delegate.getDeclaredFields()); + this.declaredMethods = copyResolvedMembers(delegate.getDeclaredMethods()); + } + + //XXX doesn't actually copy + private ResolvedPointcutDefinition[] copyResolvedPointcutDefinitions(ResolvedMember[] in) { + //System.err.println("defs: " + this + " are " + Arrays.asList(in)); + return (ResolvedPointcutDefinition[])in; + } + + + + private ResolvedMember[] copyResolvedMembers(ResolvedMember[] in) { + int len = in.length; + ResolvedMember[] out = new ResolvedMember[len]; + for (int i=0; i < len; i++) { + out[i] = copyResolvedMember(in[i]); + } + + return out; + } + + private ResolvedMember copyResolvedMember(ResolvedMember in) { + return new ResolvedMember( + in.getKind(), forceTypeX(in.getDeclaringType()), in.getModifiers(), + forceTypeX(in.getReturnType()), in.getName(), + forceTypeXs(in.getParameterTypes())); + } + + private TypeX forceTypeX(TypeX typeX) { + return TypeX.forSignature(typeX.getSignature()); + } + + private TypeX[] forceTypeXs(TypeX[] in) { + int len = in.length; + if (len == 0) return TypeX.NONE; + TypeX[] ret = new TypeX[len]; + for (int i=0; i < len; i++) { + ret[i] = forceTypeX(in[i]); + } + return ret; + } + + + public ResolvedTypeX[] getDeclaredInterfaces() { + return world.resolve(delegate.getDeclaredInterfaces()); + } + + public int getModifiers() { + return delegate.getModifiers(); + } + + public ResolvedTypeX getSuperclass() { + if (delegate.getSuperclass() == null) return null; + return world.resolve(delegate.getSuperclass()); + } + + public boolean isAspect() { + return delegate.isAspect(); + } + + public String toString() { + return "EclipseBinaryType(" + getClassName() + ")"; + } + +} diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseObjectType.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseObjectType.java index 2429196d7..9477a7268 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseObjectType.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseObjectType.java @@ -24,40 +24,26 @@ import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.lookup.*; -public class EclipseObjectType extends ResolvedTypeX.Name { - private ReferenceBinding binding; - - private ResolvedMember[] declaredPointcuts = null; - private ResolvedMember[] declaredMethods = null; - private ResolvedMember[] declaredFields = null; +public abstract class EclipseObjectType extends ResolvedTypeX.Name { + protected ResolvedPointcutDefinition[] declaredPointcuts = null; + protected ResolvedMember[] declaredMethods = null; + protected ResolvedMember[] declaredFields = null; - public EclipseObjectType(String signature, EclipseWorld world, ReferenceBinding binding) { - super(signature, world, !(binding instanceof BinaryTypeBinding)); //XXX - this.binding = binding; + public EclipseObjectType(String signature, EclipseWorld world, boolean isExposedToWeaver) { + super(signature, world, isExposedToWeaver); } - private EclipseWorld eclipseWorld() { + protected EclipseWorld eclipseWorld() { return (EclipseWorld)world; } - public boolean isAspect() { - if (binding instanceof BinaryTypeBinding) return false; - if (!(binding instanceof SourceTypeBinding)) return false; - //XXX assume SourceBinding throughout - return ((SourceTypeBinding)binding).scope.referenceContext instanceof AspectDeclaration; - - } + public abstract boolean isAspect(); - public ResolvedTypeX getSuperclass() { - //XXX what about java.lang.Object - return eclipseWorld().fromEclipse(binding.superclass()); - } + public abstract ResolvedTypeX getSuperclass(); - public ResolvedTypeX[] getDeclaredInterfaces() { - return eclipseWorld().fromEclipse(binding.superInterfaces()); - } + public abstract ResolvedTypeX[] getDeclaredInterfaces(); public ResolvedMember[] getDeclaredFields() { if (declaredFields == null) fillDeclaredMembers(); @@ -74,104 +60,14 @@ public class EclipseObjectType extends ResolvedTypeX.Name { return declaredPointcuts; } - private void fillDeclaredMembers() { - List declaredPointcuts = new ArrayList(); - List declaredMethods = new ArrayList(); - List declaredFields = new ArrayList(); - - MethodBinding[] methods = binding.methods(); - for (int i=0, len=methods.length; i < len; i++) { - MethodBinding m = methods[i]; - AbstractMethodDeclaration amd = m.sourceMethod(); - if (amd == null) continue; //??? - if (amd instanceof PointcutDeclaration) { - PointcutDeclaration d = (PointcutDeclaration)amd; - ResolvedPointcutDefinition df = d.makeResolvedPointcutDefinition(); - declaredPointcuts.add(df); - } else { - //XXX this doesn't handle advice quite right - declaredMethods.add(eclipseWorld().makeResolvedMember(m)); - } - } - - FieldBinding[] fields = binding.fields(); - for (int i=0, len=fields.length; i < len; i++) { - FieldBinding f = fields[i]; - declaredFields.add(eclipseWorld().makeResolvedMember(f)); - } - - this.declaredPointcuts = (ResolvedMember[]) - declaredPointcuts.toArray(new ResolvedMember[declaredPointcuts.size()]); - this.declaredMethods = (ResolvedMember[]) - declaredMethods.toArray(new ResolvedMember[declaredMethods.size()]); - this.declaredFields = (ResolvedMember[]) - declaredFields.toArray(new ResolvedMember[declaredFields.size()]); - } + protected abstract void fillDeclaredMembers(); - public int getModifiers() { - // only return the real Java modifiers, not the extra eclipse ones - return binding.modifiers & CompilerModifiers.AccJustFlag; - } - - ReferenceBinding getBinding() { - return binding; - } + public abstract int getModifiers(); - public String toString() { - return "EclipseObjectType(" + getClassName() + ")"; - } + public CrosscuttingMembers collectCrosscuttingMembers() { return crosscuttingMembers; } - - //XXX make sure this is applied to classes and interfaces - public void checkPointcutDeclarations() { - ResolvedMember[] pointcuts = getDeclaredPointcuts(); - boolean sawError = false; - for (int i=0, len=pointcuts.length; i < len; i++) { - if (pointcuts[i].isAbstract()) { - if (!this.isAspect()) { - eclipseWorld().showMessage(IMessage.ERROR, - "abstract pointcut only allowed in aspect" + pointcuts[i].getName(), - pointcuts[i].getSourceLocation(), null); - sawError = true; - } else if (!this.isAbstract()) { - eclipseWorld().showMessage(IMessage.ERROR, - "abstract pointcut in concrete aspect" + pointcuts[i], - pointcuts[i].getSourceLocation(), null); - sawError = true; - } - } - - for (int j=i+1; j < len; j++) { - if (pointcuts[i].getName().equals(pointcuts[j].getName())) { - eclipseWorld().showMessage(IMessage.ERROR, - "duplicate pointcut name: " + pointcuts[j].getName(), - pointcuts[i].getSourceLocation(), pointcuts[j].getSourceLocation()); - sawError = true; - } - } - } - - //now check all inherited pointcuts to be sure that they're handled reasonably - if (sawError || !isAspect()) return; - - - - // find all pointcuts that override ones from super and check override is legal - // i.e. same signatures and greater or equal visibility - // find all inherited abstract pointcuts and make sure they're concretized if I'm concrete - // find all inherited pointcuts and make sure they don't conflict - getExposedPointcuts(); - - } - - public ISourceLocation getSourceLocation() { - if (!(binding instanceof SourceTypeBinding) || (binding instanceof BinaryTypeBinding)) return null; - SourceTypeBinding sourceType = (SourceTypeBinding)binding; - TypeDeclaration dec = sourceType.scope.referenceContext; - return new EclipseSourceLocation(dec.compilationResult, dec.sourceStart, dec.sourceEnd); - } } diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java new file mode 100644 index 000000000..5e17f93c5 --- /dev/null +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java @@ -0,0 +1,144 @@ +/* ******************************************************************* + * 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.ajdt.internal.compiler.lookup; + +import java.util.*; + +import org.aspectj.ajdt.internal.compiler.ast.*; +import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration; +import org.aspectj.bridge.*; +import org.aspectj.bridge.MessageUtil; +import org.aspectj.weaver.*; +import org.eclipse.jdt.internal.compiler.ast.*; +import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; +import org.eclipse.jdt.internal.compiler.lookup.*; + +public class EclipseSourceType extends EclipseObjectType { + private SourceTypeBinding binding; + + + public EclipseSourceType(String signature, EclipseWorld world, SourceTypeBinding binding) { + super(signature, world, true); + this.binding = binding; + } + + + public boolean isAspect() { + return binding.scope.referenceContext instanceof AspectDeclaration; + + } + + public ResolvedTypeX getSuperclass() { + if (binding.isInterface()) return world.resolve(TypeX.OBJECT); + //XXX what about java.lang.Object + return eclipseWorld().fromEclipse(binding.superclass()); + } + + public ResolvedTypeX[] getDeclaredInterfaces() { + return eclipseWorld().fromEclipse(binding.superInterfaces()); + } + + + protected void fillDeclaredMembers() { + List declaredPointcuts = new ArrayList(); + List declaredMethods = new ArrayList(); + List declaredFields = new ArrayList(); + + MethodBinding[] methods = binding.methods(); + for (int i=0, len=methods.length; i < len; i++) { + MethodBinding m = methods[i]; + AbstractMethodDeclaration amd = m.sourceMethod(); + if (amd == null) continue; //??? + if (amd instanceof PointcutDeclaration) { + PointcutDeclaration d = (PointcutDeclaration)amd; + ResolvedPointcutDefinition df = d.makeResolvedPointcutDefinition(); + declaredPointcuts.add(df); + } else { + //XXX this doesn't handle advice quite right + declaredMethods.add(eclipseWorld().makeResolvedMember(m)); + } + } + + FieldBinding[] fields = binding.fields(); + for (int i=0, len=fields.length; i < len; i++) { + FieldBinding f = fields[i]; + declaredFields.add(eclipseWorld().makeResolvedMember(f)); + } + + this.declaredPointcuts = (ResolvedPointcutDefinition[]) + declaredPointcuts.toArray(new ResolvedPointcutDefinition[declaredPointcuts.size()]); + this.declaredMethods = (ResolvedMember[]) + declaredMethods.toArray(new ResolvedMember[declaredMethods.size()]); + this.declaredFields = (ResolvedMember[]) + declaredFields.toArray(new ResolvedMember[declaredFields.size()]); + } + + + public int getModifiers() { + // only return the real Java modifiers, not the extra eclipse ones + return binding.modifiers & CompilerModifiers.AccJustFlag; + } + + public String toString() { + return "EclipseSourceType(" + getClassName() + ")"; + } + + + //XXX make sure this is applied to classes and interfaces + public void checkPointcutDeclarations() { + ResolvedMember[] pointcuts = getDeclaredPointcuts(); + boolean sawError = false; + for (int i=0, len=pointcuts.length; i < len; i++) { + if (pointcuts[i].isAbstract()) { + if (!this.isAspect()) { + eclipseWorld().showMessage(IMessage.ERROR, + "abstract pointcut only allowed in aspect" + pointcuts[i].getName(), + pointcuts[i].getSourceLocation(), null); + sawError = true; + } else if (!this.isAbstract()) { + eclipseWorld().showMessage(IMessage.ERROR, + "abstract pointcut in concrete aspect" + pointcuts[i], + pointcuts[i].getSourceLocation(), null); + sawError = true; + } + } + + for (int j=i+1; j < len; j++) { + if (pointcuts[i].getName().equals(pointcuts[j].getName())) { + eclipseWorld().showMessage(IMessage.ERROR, + "duplicate pointcut name: " + pointcuts[j].getName(), + pointcuts[i].getSourceLocation(), pointcuts[j].getSourceLocation()); + sawError = true; + } + } + } + + //now check all inherited pointcuts to be sure that they're handled reasonably + if (sawError || !isAspect()) return; + + + + // find all pointcuts that override ones from super and check override is legal + // i.e. same signatures and greater or equal visibility + // find all inherited abstract pointcuts and make sure they're concretized if I'm concrete + // find all inherited pointcuts and make sure they don't conflict + getExposedPointcuts(); + + } + + public ISourceLocation getSourceLocation() { + TypeDeclaration dec = binding.scope.referenceContext; + return new EclipseSourceLocation(dec.compilationResult, dec.sourceStart, dec.sourceEnd); + } +} diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseWorld.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseWorld.java index 5edcf828a..1815a4e7a 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseWorld.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseWorld.java @@ -27,13 +27,23 @@ import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.util.CharOperation; +/** + * This holds unique ResolvedTypeXs for each type known to the compiler + * or looked up on the class path. For types which are compiled from + * source code, it will hold an EclipseObjectType. Types that + * come from bytecode will be delegated to buildManager.bcelWorld. + * + * @author Jim Hugunin + */ public class EclipseWorld extends World { public static boolean DEBUG = false; public AjBuildManager buildManager; private LookupEnvironment lookupEnvironment; - private Map addedTypeBindings = new HashMap(); + private Map/*TypeX, TypeBinding*/ typexToBinding = new HashMap(); + //XXX currently unused + private Map/*TypeBinding, ResolvedTypeX*/ bindingToResolvedTypeX = new HashMap(); public static EclipseWorld forLookupEnvironment(LookupEnvironment env) { AjLookupEnvironment aenv = (AjLookupEnvironment)env; @@ -55,7 +65,6 @@ public class EclipseWorld extends World { Pointcut pointcut, Member signature) { - //System.err.println("concrete advice: " + signature + " context " + sourceContext); return new EclipseAdvice(attribute, pointcut, signature); } @@ -63,26 +72,40 @@ public class EclipseWorld extends World { ResolvedTypeMunger munger, ResolvedTypeX aspectType) { return null; - //throw new RuntimeException("unimplemented"); } - protected ResolvedTypeX resolveObjectType(TypeX ty) { - String n = ty.getName(); - //n = n.replace('$', '.'); - char[][] name = CharOperation.splitOn('.', n.toCharArray()); //ty.getName().toCharArray()); - ReferenceBinding ret = lookupEnvironment.getType(name); - //System.out.println("name: " + ty.getName() + ", " + ret); - if (ret == null || ret instanceof ProblemReferenceBinding) return ResolvedTypeX.MISSING; - return new EclipseObjectType(ty.getSignature(), this, ret); + protected ResolvedTypeX resolveObjectType(TypeX typeX) { + TypeBinding binding = makeTypeBinding(typeX); + +// System.err.println("resolvedObjectType: " + typeX + +// " found " + +// (binding == null ? "null" : binding.getClass().getName())); + + if (!(binding instanceof SourceTypeBinding)) { + //System.err.println("missing: " + binding); + return ResolvedTypeX.MISSING; + } + + if (binding instanceof BinaryTypeBinding) { + //System.err.println("binary: " + typeX); + return new EclipseBinaryType( + buildManager.bcelWorld.resolve(typeX), + this, + (BinaryTypeBinding)binding); + } + + return new EclipseSourceType(typeX.getSignature(), this, + (SourceTypeBinding)binding); } + public ResolvedTypeX fromEclipse(ReferenceBinding binding) { if (binding == null) return ResolvedTypeX.MISSING; //??? this seems terribly inefficient - //System.out.println("resolving: " + binding + ", name = " + getName(binding)); + //System.err.println("resolving: " + binding.getClass() + ", name = " + getName(binding)); ResolvedTypeX ret = resolve(fromBinding(binding)); - //System.out.println(" got: " + ret); + //System.err.println(" got: " + ret); return ret; } @@ -113,16 +136,13 @@ public class EclipseWorld extends World { //??? going back and forth between strings and bindings is a waste of cycles public static TypeX fromBinding(TypeBinding binding) { -// if (binding instanceof ReferenceBinding) { -// return fromEclipse( (ReferenceBinding)binding); -// } else { - if (binding instanceof HelperInterfaceBinding) { - return ((HelperInterfaceBinding)binding).getTypeX(); + return ((HelperInterfaceBinding) binding).getTypeX(); + } + if (binding.qualifiedSourceName() == null) { + return ResolvedTypeX.MISSING; } - if (binding.qualifiedSourceName() == null) return ResolvedTypeX.MISSING; - return TypeX.forName(getName(binding)); -// } + return TypeX.forName(getName(binding)); } public static TypeX[] fromBindings(TypeBinding[] bindings) { @@ -165,10 +185,15 @@ public class EclipseWorld extends World { } public TypeBinding makeTypeBinding(TypeX typeX) { - //System.out.println("in: " + typeX.getSignature() + " have: " + addedTypeBindings); - TypeBinding ret = (TypeBinding)addedTypeBindings.get(typeX); - if (ret != null) return ret; - + TypeBinding ret = (TypeBinding)typexToBinding.get(typeX); + if (ret == null) { + ret = makeTypeBinding1(typeX); + typexToBinding.put(typeX, ret); + } + return ret; + } + + private TypeBinding makeTypeBinding1(TypeX typeX) { if (typeX.isPrimitive()) { if (typeX == ResolvedTypeX.BOOLEAN) return BaseTypes.BooleanBinding; if (typeX == ResolvedTypeX.BYTE) return BaseTypes.ByteBinding; @@ -188,15 +213,14 @@ public class EclipseWorld extends World { } return lookupEnvironment.createArrayType(makeTypeBinding(typeX), dim); } else { - ResolvedTypeX rt = typeX.resolve(this); - //System.out.println("typex: " + typeX + ", " + rt); - if (rt == ResolvedTypeX.MISSING) { - throw new RuntimeException("shouldn't be missing: " + typeX); - } - return ((EclipseObjectType)rt).getBinding(); + String n = typeX.getName(); + char[][] name = CharOperation.splitOn('.', n.toCharArray()); + return lookupEnvironment.getType(name); } } + + public TypeBinding[] makeTypeBindings(TypeX[] types) { int len = types.length; TypeBinding[] ret = new TypeBinding[len]; @@ -207,7 +231,7 @@ public class EclipseWorld extends World { return ret; } - + // just like the code above except it returns an array of ReferenceBindings private ReferenceBinding[] makeReferenceBindings(TypeX[] types) { int len = types.length; ReferenceBinding[] ret = new ReferenceBinding[len]; @@ -256,22 +280,15 @@ public class EclipseWorld extends World { public void addTypeBinding(TypeBinding binding) { - addedTypeBindings.put(fromBinding(binding), binding); + typexToBinding.put(fromBinding(binding), binding); } - public Shadow makeShadow( - AstNode location, - ReferenceContext context) - { + + public Shadow makeShadow(AstNode location, ReferenceContext context) { return EclipseShadow.makeShadow(this, location, context); } - public Shadow makeShadow( - ReferenceContext context) - { - return EclipseShadow.makeShadow(this, (AstNode)context, context); + public Shadow makeShadow(ReferenceContext context) { + return EclipseShadow.makeShadow(this, (AstNode) context, context); } - - - } diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java index a55df3cd3..2fcbc8669 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java @@ -50,7 +50,7 @@ public class AjBuildManager { public AjBuildConfig buildConfig; private BcelWeaver bcelWeaver; - private BcelWorld bcelWorld; + public BcelWorld bcelWorld; /** temp handler for callbacks */ private IMessageHandler currentHandler; // XXX wrong lifecyle, used for callbacks @@ -271,6 +271,12 @@ public class AjBuildManager { if (buildConfig.getLintSpecFile() != null) { bcelWorld.getLint().setFromProperties(buildConfig.getLintSpecFile()); } + + //??? incremental issues + for (Iterator i = buildConfig.getInJars().iterator(); i.hasNext(); ) { + File inJar = (File)i.next(); + bcelWeaver.addJarFile(inJar, buildConfig.getOutputDir()); + } } //??? do this well @@ -319,10 +325,6 @@ public class AjBuildManager { void addAspectClassFilesToWeaver() throws IOException { //System.out.println("added or changed: " + classFileCache.getAddedOrChanged()); - for (Iterator i = buildConfig.getInJars().iterator(); i.hasNext(); ) { - File inJar = (File)i.next(); - bcelWeaver.addJarFile(inJar, buildConfig.getOutputDir()); - } for (Iterator i = classFileCache.getAddedOrChanged().iterator(); i.hasNext(); ) { UnwovenClassFile classFile = (UnwovenClassFile) i.next(); diff --git a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java index b6b0a4fe3..e13b81bf3 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java +++ b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java @@ -1065,7 +1065,7 @@ public abstract class ResolvedTypeX extends TypeX { if (inherited.isAbstract()) { if (!this.isAbstract()) { getWorld().showMessage(IMessage.ERROR, - "inherited abstract pointcut " + inherited.getSignature() + + "inherited abstract " + inherited + " is not made concrete in " + this.getName(), inherited.getSourceLocation(), this.getSourceLocation()); } @@ -1080,6 +1080,7 @@ public abstract class ResolvedTypeX extends TypeX { for (Iterator i = added.iterator(); i.hasNext();) { ResolvedPointcutDefinition toAdd = (ResolvedPointcutDefinition) i.next(); + //System.err.println("adding: " + toAdd); for (Iterator j = acc.iterator(); j.hasNext();) { ResolvedPointcutDefinition existing = (ResolvedPointcutDefinition) j.next(); diff --git a/weaver/testdata/dummyAspect.jar b/weaver/testdata/dummyAspect.jar index 784a3b611f19fcdcc97e313a39ebf6b39e50394b..100b7d8f187183d4b8b1f885750ed57005491ae8 100644 GIT binary patch delta 32 kcmX@ha+ZZJz?+#xgnn+a delta 32 kcmX@ha+ZZJz?+#xgn?GIRF3v diff --git a/weaver/testdata/megatrace.jar b/weaver/testdata/megatrace.jar index eda290200f41cc7af67a1af558cbd2222c9f4115..927615c58c0b63683fd1b12aa2294c461ae000dc 100644 GIT binary patch delta 2411 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 delta 3778 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 B(Wd|a diff --git a/weaver/testdata/megatraceNoweave.jar b/weaver/testdata/megatraceNoweave.jar index fcf480940144bbe2bbc206e9252235e6649dbff6..8a62739958f60833c968af3908fdcbdf7990f1a9 100644 GIT binary patch delta 1716 zcmY*ac{~#e9G@{!nar4Dy(t~j;YiIDPif6uTWPN3s+KUv7^<-kA;;pexrgmB$D8%Y zQ6W@j&z1BXC3=oDay@r6JpJ?f^!t9kpWpHMe!hSHzVS-wN?^RTq!bh&vjfW%ZS7Pr zl4h??fNuFiEG_LTs$-QCL9wV9gcg^tG&q>?)*Xnx@6A`%8HHrT4R;bH1wkQj1a$#> zORUaX;2LX^C?V8Utgt5tz70Sux4{Z}=jY<2(qgsj^n=OsbEa#or3leb@LD~sQ7nCK z*%QltQF+tlu#j-kZpvBZ{73@&8SMna`8F}lfCwWD%4#CtT;U8FY0sLpg9|URSLvQ= zuZ^NS8t%Dhoc8J}Q+XMGLE${pzjd#@Ei{9eZhH7ul@&Xv)2d^px>|12m8wcsrZ+U_ zSMGLv1tgL6hP6mMkJpqsp8kZn9ohGY8S#B~QKv{{-s`P)R&r%gTHF+p_JR5S6DVxj zvcDbXccuY50J=MTsuP>|cQ(1`deKqt?B1{x!l@UQU~&L0C}2A=t)qReN%x6gQQwiz zmw9(ECu1u!i=03hkEUCl6=@9AW)b{q8+TM?wXh8Q?Tt;G!Axi=0;3mhd_jw{p(W@!6xEgMyG3N9! zr@1kF1^gxSckAh26y8ls>e8Q@8W@J*cU)8$BA=wOSwxYcMd9H(zu%c6JEO_*?H=4ws3|4IYt(g%? zc$VdICJ%%*0489B&{pUDmtGu-{>q=-Q_`{+Y={sTxq2XttEzlHJ|+-|yOOQrAhg~k zp&LY-AfCJn%MvB|bd>C(InPgLKR*^|H(dwNQ9ou9_E7E*ANz@_fw#uC&st7-KXhE> zjMc#g8g8z1S(!xZMOEcSaC?(o1-enS*GdI)QN|=Jte4&##TW0P`-g_3jWX#}JL9R? zJkOb7wd*U+u*t=;$Cp;=)z?q(n5lZ)@qBg_VRV+Bay#U>E<4C-G_MCzxjAeZ+FTJ+6#EmV$^w_iOQ3ZmsK9-tJmg=lvt&WV?Tzed* zqlmd^@K0y~MV|I0UcelpoZo-wfK)Va-^5?X3$`g#D>4-B3t6k2*0%%3FEsT>sJ8fT z3D1Ih3!^jxa5EeSO_9*&psSNJz81K3a_ehklvn@1^R@XNuW;XZYm$>=M^#awV2y@j|))0rs#QEfrdTa1>TnlMvZ1`OY?5sHyj13 zv|w3da}MxkeM8$og$Pj~HG`Lv=gHCnWwVL+`#7nli{5guCiGa#Pp`!!LpRyJ6G5S;jfMx(nl9Eo`LmD93q7`78fXKg~)? zxP(rfro3*A`xy0f1*MQ;8yB+ceTV_qRy4`hBnBPKcKC=_^I2pL58ZllJ{Gj`2qnQ@BZcvoJoboPeGiesr?tT#Iiqa@v zF@GABqZX4<+`!2=TG5y3_52$w)9=>`-l(x_0WNXEdf`sFWIy| zd1HE?y7@C`+iIkMA|$D7WOBvv3#pt#>d#X_*>j-WqfSD z6N@>r6na;~S%Gy=spp0X`e>N^#38iE3RYyh9=&K9w8%^XTfq+78DZ`)7Eu$|+J#I6 z^4Cj|9I@5uAw@$wBQ&S0`6@FEsa1eC7-O5=NW<|qzeD&Af7A(S#oFbM4fbjf^RAlFM9%6jJVUoBK7HHHHz9AD&sbR2}QQSWLsYmgM!Os%XLh5 zcofxrDb-H5A46*X*jc5#Amn^Fym^6^_`&v{^;h*0ZNh4mMa3N?e(8-NQfKsf%SZ0{ z%gO0Vf8UiML=qo(3`FT8AAQmQ9^dR^_>l_+YEg?6!yuUZWVX_&5x25QBdxV_oI6Sy znCKVUQj5iA+A}7aKOAG}p3Ve^mV=L@4RM*(s^WGHoYK4oZt)Bs(;0v<&X{V z2Jt=Ivw2MdkgwF$(d)t;5pw*K&zJ3uMs-Fhqp_K7?9&gF^3tcLE>BN&G3M**zaXy^ z{L(nt=NGEKQB?un&V$s%H1$a!2Ft)x+L>MbaEZ!+o)7V&UkGm|TQosWd_`KVq| z(EE;wseEZdRR@&WD2u3>)|oc3XU1Q>%>X&+B6SO0gRJO={t9T)n}}hAPE)zLZycIF z#%kA3P5SU&;q{tD;h4#Zr{h0$gL%Mv#mV>daW(`3cj?H|v_YBC6k6Sq@>S><8H}@v zKwYel<+;$kJ;SS$ISa~>pN_2Ls06B8BgAP5x9`k2)D+{qf|5%DJ+YxZ&pbZ0WCz&H z+IBtmvu8dWN@K{U_LZ|CJ>I`m1?Z;jFxMm=^$DWSAf6lfDM3o!dg}+jeSEq>n5|OQ zhuGR<6;aOsaH-F8=-8XaA=Sdu>P z@{_8X*XJHK)OLD@j0f7!t_EFJYf|>qv8RW_LL<%Tj=rNHedWji^{>G4A_afvAr)mB z#W4XJtg{`VfZOthEeWdYowsuuaT+yLovUcJ$%WvW*|nV9keCot|0iT|)D~HIZAur@ zrRZaCbq48KcMO;cDu>qTEq>%Yh!m>SuDHRG2L@(aqwq4TjjhBbyV}nAvdg~EtV?pUZM>V}`0zzY|;x`fX@DSGctW*@az3YDG8{^ z`L!&Q*P-)!Ud;s(>Jl7}?yl#EzmS+$+Fv79#0>TtUw#%->5JNohVO`L8p zjXN^S!Yx47y;#25#Qkv08E;{+a43|*dtay`&my*vOL5N0j&YsLtmO=AOQG0lWY!SCVMzM|>b!aat(QFs< zF3!nmFN*9p1+`ZGXM+p1R(SGmH!w-c)jHa}kN_uV4FEX&_m|T2SD`}&M}2R?HW}vx zDK1}BhOC8s4PC~s*pRXuNLN{h34~Njj?2W$@Gur%Is0auCB1koW#yx)e^QQVm@(~U z6?1T0H9?VAU~T@kx;t#?wC$XY@NU`Ntn4*j zISRip`G#XAbIx3f#t+>&KC~!JbBarHL0@kgHd#indjEz^(WqS(m}a7x{YvVb$nV&U zf?u&0GdPpUdY)~i9{c=>S?~EcO!$C$S^r?jK|Yiyqqy zvZ@a?k~{Y7Z#gb2a%^u6-PJNL5`Y$NSg{*4&z`zOJ+lB`aNtZ)Nook!Wcr@P?#}{s+-zxg z6h}=wTx5pPZoZo#P+JJ*Y*5ed3uElyqF}Wpdj2#B0C1HC0RI2sLmQMu?*JwLn*x-x zB5art5CZrPhW{i``o#@6aWYS2mnWqE-sM{A%7f25Pj{L^?rCDj!EnU;$%ZiVkc%t z77&PS0=DBIqRof0QIJtC?b+USFYD=5Pp?1zNN(Z4IR|1S8(|4js4HV>ZZmk(Gfx@(71bn6#fGOx0V*g}FoY3?Q*{}O2mQ@;p`Y;e zE&<2tD&pOzTubX`o5PDPXMj^S(#I&}H5)Qvn6!C$%Lx5gn7)pQ-BiYA>Lx{Ao33~G z77x2TZif%oJ0da*CwDB-^GdgCJn50&sef$?z9n>RsktR>hoeUkjorkE%_7FBLDe@5 zXVY|2g^#q1O~YuxHx~k&!}&5M@IJ%%K(rxDd%53g30=emhCu8{GheN4OS4fe;UeW5 zWSruOpKZNb!6Yt|8obvNag$*-r@5IE(P=eebOlp3!$)*WMx|#AXQod^5cV3TEq``~ z;k}&pinu|O(z6@gIH18HYO|;@FlBG>1S!%=3(~5T>ie+8FhX^Y#^z$4_?^aXY&L|E zQGf!5%QP}K=|%|}X3(_A1GVJbWz~eC8L8qTzNp}q9hLG1Pf~;%%I{qwJAk8E z%1T4^btLXeJ8MD4s%E=jxSGT4k$XW<+NPqsX2wpkdI}XF#8ukUskRd(oPT~3i zPFv^@-lhM*Z31I1`Cu@O0?rWXEP1Pbi4Kg_sR`!g-MP#1!rDLCkJiu0et)#-V!LoW zR;eG4o)dfc;1H8*W0wx_;p{%H?&JDC!sE;Wdfvqx?O0~^4ygf*6UQ<>!KdVZ=IW+W zcy2wqhtJnu!~gjZx7H3Y|3`*cz~V9dc-DDk4`04U!GGz!Onv*kI)D^Zli#&9o;1?yXKF+jDJqSw}R#ARq*~t$9rUTCl+v@d5&nI0KciE0rQU(&RgLb znIL;i*2=Q9uwr}j*<0Kl@*}LS%!f4AvX_W(Tj?K?9#IYlhm&`jrWPqJLL(B>3@>0Cffc01i+~0|XQR2mlBG zM~^NplduCHe;id5J#RjkVH^VtgoJ!aA|b;7(*a405M#&$j5-05Ay6q7R@3u<9*6F! zo;N@?E-W`zx$rOO&XtJ^5feYdC#qNn*`<=Se^d-%ftJg*W2-9y;q<_QKqTiD zWfD=eBoIMdpe=7Za;CPnB)xfasVoIjdDk+_3#Mo5=lWtqt=d(ASl*8}A<$`-tiC0= z?0T}#U+cRtB5*jJ-_K$~hwX8_m8@B<@VS)TkmkDdvXjMi+md^D7w%P+T#KQDblsYw zzioH6e{0NnwxbHlljhn)5}oL3MGA+>NIFV-wR ziQ_ntz%iU;WVvZ+6%Hg)Puld{np3PNZE@?>be`!M_4Ev{<|unj8n!0pm}O(qe<4?P zt2Iwf3@@-43r4KBwzQ*8Lb@oy|%`Iz@q@ zpb{L&dD}0Q9K?|JFf0&P?zT;!D}C?{?lo{;?`55j1qe~`TuaJg5-;IQ0wIi1Y`JMG zzFQ~VyJ4$U&HSQ32R*!F?pB7>|BH?+lqcCDiK$IXR+Q~J)tv_LSh{0; zs$+N0q(=v|_^%5b52Dbh-y4|L^?Os`Xh8kyUh-7F;MP1#PTTr`NceuTnu9=pfZB5| ziCZ;wU0P++Gj+lK0*$#rZN((S}?8MDsXHmm!X=U!Xg6bPJ~*_|X!6bZv+tf9`WQ zjWhM=g{TPoETd6Gimt67BF!K{GyF#UPW(vxq2K*pPq6FKTt1*uTC0nxzMG`;HTv(S z(hrdt+Cp{{fckl{{w{i9Y*Fwn9I__I_dfiNo zdHYX2w49>oW0XCv&l;{?Y4FPMe_c&FnF&8eWDD1yAadWAX?MwVG(Za<;mWJT6sGHv z-HJX_!NgC*&rRLL55zBYFTT-}9j(L;vG?kNjqONsgOUt3)f#$)w;FQYe41QI&hBs~ zaD*$Dm`VugJ#wY|NF9_dg%kX(97PwU;%B`_s!J4AcTM|Xgi_rNXA1k}f9j?^*6473 zE%;?>3fF=epW7_vI1V-bAJ8tEA_i&L+ zR_M&w{Xv_hqRLwQ17avyRYg;oM%A-MjOIz?=b&2($P=@KBEBRZ6HkagnJjY@YzVPP zd`x^wd`5gu{L1t?i7|rTHe=|0;zQyi%xj%O{{T=+2M8i@6aWYS2mowbpDmFNA%7G{5Pj{L^?rB=#sM1wh9z;pCeDsX zfCSqiv5k>}mJhLr$Wbos**-ZbuRs0>H*(0CLokw!VkxzeuJzd!$ihc9u5p?GimvF4E|f-w}brN?lZx1))!&9T`h=i@}?mdcxo@swQD7HatBFP(i7J0Sqx5ugh56@2#&0{g|(G z2slz#5$`A%v7tJ(yUcWI8XWd z8K-#SXIrmUFpi6)2Jd!7++>)}X>RIBbXtuVeTE5};d8nrqtY{mlaogy2zwcm7Joa% z@NrIiMSMY%(zP3%IH18HYSXAOFlBG>2r1G^3(~5T>ieL@Fhq3^#^!vU`0d7aY}SO4 zQGfyl%QP}K=tc<|X3(_AeKqgg1=Wk2OIwlX8mZzUzOCS<9hLGLPf~;%%AZ{#JAlJk z%1T4^bR_ObJ8MD4s%E=jxRk@}p?{*rqn^1fq7K*GR{Nj%$*NX!&eEETDmG%v^;5FnY`WMk9Dk1`>c^w! z*bdI_V|;n!!X7@I-o>R|T-ilW%6RJ~zJK91 z3i!d%oyUS}{@|176nrmOo_}5i?*lsCC96BJfP2hyL<$K57B!qVbQNb@Yai3m59{x#_m<*DqDON=FxtTV41Q)aTrUgpX^dj(6tC`FPJc@AE$Id(X{xe|_~W z!WhFXf#{NFS~3P9&{;A!OrvZ%tH#1|Nm_p@hOj`}Mcc8}C4q2ynCl}swHK~c)7ovH>#b(ZYK7xcc2k-g(#y^iH*8Dp;a#{}RdPLsF4A>tis#jjvt55< z(X$;@P@Xi`r<3SLPdidLOh(dC(wiEH;|NIwtd60Nt15b;?CfL66}GcVhDjX9i3E<} zIeL~`mR8|FAdR3+&#gJdM$i_QUQXv3p3w-;@M?~-*QH@=VvbohX8aAgvRkcra(X!E z;LtTYju!-a_j9{aTUn7_45tMSRh56~se!tC9q<{QN3tHmF!O9yD$*$mj0UCPK+N@X zspJSo^$BAFapl%+0zK)2JGj=sS-qBdJ{BNE#d9qwi%GnQQwfAHNwMXYt+=;AdSKI5 zYnu6afi9l#j=5VIQvWYHGEtsni6myXELl;u>r{6Nz-PU*=DC}?cw@LI&>w$PfThA+ zN3BU^Gl`j}cOAp4+IfxDbSC}wlhtlaB{73530y{w;vUd$e3=Ap2ITF3*Hzc`GQ;XEIDWE3nJm4lhqsqh62=HbV=N*sjJc| zo1Uo?_AmE>KNJ`Uu+=^0TuOhirGm41+iwcWRQlR7z16ezW;}9|K}DdSHVAzM@;Anj z!B()1W*(sZK06^i!{4MosoQ7yn`mrEMeH;h=lNKV_Y8|86|& zuMib&xZ!s+kJCId#J2ql^rnt(qyN6|E#Z6DhA84bhm$zf@Lq_Du+M)o8bze&+6p4l zauU?TZ^ZA!kHjB(@AtZcU61DS0hQ8Polgy3C!Mb`bSIU5fXwJNvfG#-xsiuBH@{B* zWw=+9PG-W75ZT7n$B2L2^JUtdGVKk}!bdps3NeehhGaLQPn9t76Y+CPH}M1U3y&Ay z=+2H-Vu#p!4Z$XNB)LXOMp|l(KE#_%xvoD+t|WU}B!MHGxxi3DNbiv=<$LO)Y$=@J zw{QYIl!~wI9;q%+R9!WlBN0k&<|4O928D02BZS00;nVTc0hUr1pnr0{{SSlY$5? uA8cEnE#WyB$ae$)0AmRN01E&B00000000000001@lg|hq22uzB0001X@g1K4 -- 2.39.5