can't resolve nested public interfaces FIXED: Bugzilla Bug 32399 Incorrect binding of protected (marker) interfacestags/v1_1_0_RC1
@@ -24,6 +24,7 @@ import org.aspectj.weaver.IHasPosition; | |||
import org.aspectj.weaver.ResolvedTypeX; | |||
import org.aspectj.weaver.TypeX; | |||
import org.aspectj.weaver.World; | |||
import org.aspectj.weaver.patterns.*; | |||
import org.aspectj.weaver.patterns.FormalBinding; | |||
import org.aspectj.weaver.patterns.IScope; | |||
import org.eclipse.jdt.internal.compiler.lookup.ClassScope; | |||
@@ -60,6 +61,17 @@ public class EclipseScope implements IScope { | |||
public TypeX lookupType(String name, IHasPosition location) { | |||
TypeBinding b = scope.getType(WildTypePattern.splitNames(name)); | |||
//FIXME need reasonable error handling... | |||
if (!b.isValidBinding()) { | |||
return ResolvedTypeX.MISSING; | |||
} | |||
//System.err.println("binding: " + b); | |||
// Binding(tokens, bits & RestrictiveFlagMASK, this) | |||
return world.fromBinding(b); | |||
/* | |||
computeImports(); | |||
// System.out.println("lookup: " + name + " in " + | |||
@@ -98,6 +110,7 @@ public class EclipseScope implements IScope { | |||
} | |||
return resolveVisible(name); | |||
*/ | |||
} | |||
@@ -5599,5 +5599,15 @@ | |||
<run class="WeaveLocal"/> | |||
</ajc-test> | |||
<ajc-test dir="bugs" pr="32428" | |||
title="can't use pointcuts defined in inner aspects "> | |||
<compile files="InnerPointcut.java"/> | |||
<run class="InnerPointcut"/> | |||
</ajc-test> | |||
<ajc-test dir="bugs/interfaceNames" pr="32421" | |||
title="can't resolve nested public interfaces (also PR#32399)"> | |||
<compile files="TransactionTest.java,sub/ExecutionMonitor.java,sub/ObserverProtocol.aj"/> | |||
<run class="TransactionTest"/> | |||
</ajc-test> | |||
</suite> |
@@ -0,0 +1,20 @@ | |||
// for Bug#: 32428 | |||
import org.aspectj.testing.Tester; | |||
public class InnerPointcut { | |||
public static void main(String[] args) { | |||
Tester.checkEqual(TrackTestCase.note, "ran"); | |||
} | |||
pointcut testcutOuter(): within(InnerPointcut); | |||
static aspect TrackTestCase { | |||
static String note = "not run yet"; | |||
pointcut testcut() : execution(public void mai*(..)); | |||
before() : testcut() && testcutOuter() { | |||
note = "ran"; | |||
} | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
import sub.ExecutionMonitor; | |||
import sub.ObserverProtocol; | |||
public class TransactionTest { | |||
public static void main(String[] args) { | |||
} | |||
static Transaction theTransaction; | |||
private void assertCommitted() { | |||
theTransaction.getCount("method-execution", "commit"); | |||
} | |||
static aspect MonitorTest { | |||
declare parents: Transaction implements ExecutionMonitor.MonitoredItem; | |||
} | |||
} | |||
class Transaction { | |||
} | |||
aspect TransactionControl { | |||
void begin() { | |||
CommitObserver.aspectOf().add(this); | |||
} | |||
static aspect CommitObserver extends ObserverProtocol { | |||
declare parents: TransactionControl implements Observer; | |||
} | |||
} |
@@ -0,0 +1,11 @@ | |||
package sub; | |||
public aspect ExecutionMonitor { | |||
public interface MonitoredItem { | |||
int getCount(String eventType, String eventName); | |||
} | |||
public int MonitoredItem.getCount(String eventType, String eventName) { | |||
return 0; | |||
} | |||
} |
@@ -0,0 +1,6 @@ | |||
package sub; | |||
public abstract aspect ObserverProtocol { | |||
protected interface Observer { } | |||
public void add(Observer o) {} | |||
} |
@@ -1,8 +1,6 @@ | |||
<!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd"> | |||
<suite> | |||
<!-- | |||
@@ -1,9 +1,20 @@ | |||
/* | |||
* Modified this test case to reflect the fact that types in the default package | |||
* can only be used in named packages if they are imported. | |||
* | |||
* I believe that according to the 1.1 interpretation of the JLS that this import | |||
* is also disallowed and there is no way to refer to types in the default package | |||
* from a named package. | |||
*/ | |||
package the.deep.pkg; | |||
import org.aspectj.testing.Tester; | |||
import EachObjectTarget; | |||
aspect Aspect pertarget(target(EachObjectTarget)) { | |||
before(): call(void foo(..)) { | |||
EachObjectTarget t = null; | |||
Tester.check(true, "Dummy test"); | |||
} | |||
} |