Browse Source

tests and fix for pr71159, visibility not taken into account when determining matching signatures with overrides

tags/preDefaultReweavable
acolyer 19 years ago
parent
commit
7e0c3cdc37

+ 34
- 0
tests/bugs150/pr71159/PrivateITD.aj View File

@@ -0,0 +1,34 @@
class A {

}

class B extends A {
protected void foo() {}
}

class C extends B {}


class D extends C {
public void foo() {}
}

aspect X {
private void A.foo() {}
void bar() {
D d = new D();
d.foo();
}
declare warning : call(* B.foo()) : "should match";
declare warning : call(* A.foo()) : "should not match";
}

+ 7
- 0
tests/bugs150/pr71159/pkg1/A.java View File

@@ -0,0 +1,7 @@
package pkg1;

public class A {
//public void foo() {}
}

+ 3
- 0
tests/bugs150/pr71159/pkg1/B.java View File

@@ -0,0 +1,3 @@
package pkg1;

public class B {}

+ 7
- 0
tests/bugs150/pr71159/pkg1/C.java View File

@@ -0,0 +1,7 @@
package pkg1;

public class C {
public void foo() {}
}

+ 17
- 0
tests/bugs150/pr71159/pkg2/ITDInDiffPackage.aj View File

@@ -0,0 +1,17 @@
package pkg2;
import pkg1.*;

public aspect ITDInDiffPackage {
void B.foo() {}
void bar() {
C c = new C();
c.foo();
}
declare warning : call(* B.foo()) : "should not match";
declare warning : call(* C.foo()) : "should match";
}

+ 32
- 0
tests/bugs150/pr71159/pr71159.aj View File

@@ -0,0 +1,32 @@
class A {
private void foo() {}
}

class B extends A {
protected void foo() {}
}

class C extends B {}


class D extends C {
public void foo() {}
}

aspect X {
void bar() {
D d = new D();
d.foo();
}
declare warning : call(* B.foo()) : "should match";
declare warning : call(* A.foo()) : "should not match";
}

+ 12
- 0
tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java View File

@@ -334,6 +334,18 @@ public class Ajc150Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
runTest("inlined field access in proceed call");
}
public void testVisibiltyInSignatureMatchingWithOverridesPart1() {
runTest("visibility in signature matching with overrides - 1");
}

public void testVisibiltyInSignatureMatchingWithOverridesPart2() {
runTest("visibility in signature matching with overrides - 2");
}

public void testVisibiltyInSignatureMatchingWithOverridesPart3() {
runTest("visibility in signature matching with overrides - 3");
}
// helper methods.....
public SyntheticRepository createRepos(File cpentry) {

+ 18
- 0
tests/src/org/aspectj/systemtest/ajc150/ajc150.xml View File

@@ -397,6 +397,24 @@
</compile>
</ajc-test>
<ajc-test dir="bugs150/pr71159" pr="71159" title="visibility in signature matching with overrides - 1">
<compile files="pr71159.aj">
<message kind="warning" line="26" text="should match"/>
</compile>
</ajc-test>

<ajc-test dir="bugs150/pr71159" pr="71159" title="visibility in signature matching with overrides - 2">
<compile files="PrivateITD.aj">
<message kind="warning" line="28" text="should match"/>
</compile>
</ajc-test>

<ajc-test dir="bugs150/pr71159" pr="71159" title="visibility in signature matching with overrides - 3">
<compile files="pkg1/A.java,pkg1/B.java,pkg1/C.java,pkg2/ITDInDiffPackage.aj">
<message kind="warning" line="10" text="should match"/>
</compile>
</ajc-test>
<!-- ============================================================================ -->
<!-- ============================================================================ -->

+ 17
- 1
weaver/src/org/aspectj/weaver/ResolvedMemberImpl.java View File

@@ -210,7 +210,7 @@ public class ResolvedMemberImpl extends MemberImpl implements IHasPosition, Anno
if (!typesAlreadyVisited.contains(toLookIn)) {
typesAlreadyVisited.add(toLookIn);
ResolvedMemberImpl foundMember = (ResolvedMemberImpl) toLookIn.lookupResolvedMember(memberToMatch);
if (foundMember != null) {
if (foundMember != null && isVisibleTo(memberToMatch,foundMember)) {
List declaringTypes = new ArrayList();
// declaring type can be unresolved if the member can from an ITD...
ResolvedType resolvedDeclaringType = foundMember.getDeclaringType().resolve(toLookIn.getWorld());
@@ -231,6 +231,22 @@ public class ResolvedMemberImpl extends MemberImpl implements IHasPosition, Anno
}
}

/**
* Returns true if the parent member is visible to the child member
* In the same declaring type this is always true, otherwise if parent is private
* it is false.
* @param childMember
* @param parentMember
* @return
*/
private static boolean isVisibleTo(ResolvedMember childMember, ResolvedMember parentMember) {
if (childMember.getDeclaringType().equals(parentMember.getDeclaringType())) return true;
if (Modifier.isPrivate(parentMember.getModifiers())) {
return false;
} else {
return true;
}
}
// ----


Loading…
Cancel
Save