summaryrefslogtreecommitdiffstats
path: root/org.aspectj.ajdt.core/src
diff options
context:
space:
mode:
authorjhugunin <jhugunin>2002-12-17 23:17:35 +0000
committerjhugunin <jhugunin>2002-12-17 23:17:35 +0000
commita6d1918ba0e713546a214901de6eda9376604877 (patch)
tree18ddd98ce46820a291f64b353bcc7ec967211855 /org.aspectj.ajdt.core/src
parent4f58fd779099e3a59c6c1e177f94b86b6c7b5f47 (diff)
downloadaspectj-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')
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeDeclaration.java15
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/SuperFixerVisitor.java34
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);
}
}