diff options
author | jhugunin <jhugunin> | 2002-12-17 23:17:35 +0000 |
---|---|---|
committer | jhugunin <jhugunin> | 2002-12-17 23:17:35 +0000 |
commit | a6d1918ba0e713546a214901de6eda9376604877 (patch) | |
tree | 18ddd98ce46820a291f64b353bcc7ec967211855 /org.aspectj.ajdt.core/src | |
parent | 4f58fd779099e3a59c6c1e177f94b86b6c7b5f47 (diff) | |
download | aspectj-a6d1918ba0e713546a214901de6eda9376604877.tar.gz aspectj-a6d1918ba0e713546a214901de6eda9376604877.zip |
adding accessor methods for calls to protected methods from inter-type
declarations just like we have from calls to super methods
Diffstat (limited to 'org.aspectj.ajdt.core/src')
2 files changed, 32 insertions, 17 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeDeclaration.java index 43ca45e20..a9a73337a 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeDeclaration.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeDeclaration.java @@ -70,13 +70,14 @@ public abstract class InterTypeDeclaration extends MethodDeclaration { public void fixSuperCallsInBody() { SuperFixerVisitor v = new SuperFixerVisitor(this, onTypeBinding); this.traverse(v, (ClassScope)null); - HashSet set = new HashSet(); - for (Iterator i = v.superMethodsCalled.iterator(); i.hasNext(); ) { - MethodBinding b = (MethodBinding)i.next(); - set.add(EclipseWorld.makeResolvedMember(b)); - } - - munger.setSuperMethodsCalled(set); + munger.setSuperMethodsCalled(v.superMethodsCalled); +// HashSet set = new HashSet(); +// for (Iterator i = v.superMethodsCalled.iterator(); i.hasNext(); ) { +// MethodBinding b = (MethodBinding)i.next(); +// set.add(EclipseWorld.makeResolvedMember(b)); +// } +// +// munger.setSuperMethodsCalled(set); } protected void resolveOnType(ClassScope classScope) { diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/SuperFixerVisitor.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/SuperFixerVisitor.java index c1747778a..ab564f9f4 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/SuperFixerVisitor.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/SuperFixerVisitor.java @@ -16,6 +16,7 @@ package org.aspectj.ajdt.internal.compiler.ast; import java.util.*; import java.util.Arrays; +import org.aspectj.ajdt.internal.compiler.lookup.EclipseWorld; import org.aspectj.weaver.*; import org.aspectj.weaver.ShadowMunger; import org.eclipse.jdt.internal.compiler.AbstractSyntaxTreeVisitorAdapter; @@ -44,15 +45,28 @@ public class SuperFixerVisitor extends AbstractSyntaxTreeVisitorAdapter { // an error has already occurred if (call.codegenBinding == null) return; - if (!call.isSuperAccess() || call.binding.isStatic()) return; - - call.receiver = new ThisReference(); - MethodBinding superBinding = call.codegenBinding; - - char[] accessName = AstUtil.makeAjcMangledName( - ResolvedTypeMunger.SUPER_DISPATCH_NAME.toCharArray(), targetClass, superBinding.selector - ); + char[] accessName; + boolean isSuper; + if (call.isSuperAccess() && !call.binding.isStatic()) { + call.receiver = new ThisReference(); + accessName = + NameMangler.superDispatchMethod(EclipseWorld.fromBinding(targetClass), + new String(superBinding.selector)).toCharArray(); + } else if (call.receiver.isThis() && call.binding.isProtected() && !call.binding.isStatic()) { + //XXX this is a hack that violates some binary compatibility rules + if (superBinding.declaringClass.equals(targetClass)) { + accessName = + NameMangler.protectedDispatchMethod(EclipseWorld.fromBinding(targetClass), + new String(superBinding.selector)).toCharArray(); + } else { + accessName = + NameMangler.superDispatchMethod(EclipseWorld.fromBinding(targetClass), + new String(superBinding.selector)).toCharArray(); + } + } else { + return; + } //??? do we want these to be unique MethodBinding superAccessBinding = @@ -62,7 +76,7 @@ public class SuperFixerVisitor extends AbstractSyntaxTreeVisitorAdapter { call.codegenBinding = superAccessBinding; - superMethodsCalled.add(superBinding); - + ResolvedMember targetMember = EclipseWorld.makeResolvedMember(superBinding); + superMethodsCalled.add(targetMember); } } |