Skip to content

Commit c869670

Browse files
committed
GROOVY-10414
1 parent b91e6c2 commit c869670

File tree

4 files changed

+94
-46
lines changed

4 files changed

+94
-46
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

+24
Original file line numberDiff line numberDiff line change
@@ -4913,4 +4913,28 @@ public void testTypeChecked10351() {
49134913

49144914
runConformTest(sources);
49154915
}
4916+
4917+
@Test
4918+
public void testTypeChecked10414() {
4919+
//@formatter:off
4920+
String[] sources = {
4921+
"Main.groovy",
4922+
"@groovy.transform.TypeChecked\n" +
4923+
"class Outer {\n" +
4924+
" class Inner {\n" +
4925+
" void test() {\n" +
4926+
" foo = 'bar'\n" +
4927+
" print(foo);\n" +
4928+
" setFoo('baz')\n" +
4929+
" print(getFoo())\n" +
4930+
" }\n" +
4931+
" }\n" +
4932+
" def foo\n" +
4933+
"}\n" +
4934+
"new Outer.Inner(new Outer()).test()\n",
4935+
};
4936+
//@formatter:on
4937+
4938+
runConformTest(sources, "barbaz");
4939+
}
49164940
}

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+24-12
Original file line numberDiff line numberDiff line change
@@ -5764,18 +5764,7 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
57645764
curNode = curNode.getSuperClass();
57655765
}
57665766
*/
5767-
outer_upper: // can't use existsProperty because it calls findMethod
5768-
for (ClassNode cn = receiver; cn != null; cn = cn.getSuperClass()) {
5769-
property = cn.getProperty(pname);
5770-
if (property != null) break outer_upper;
5771-
if (!cn.isStaticClass() && cn.getOuterClass() != null
5772-
&& typeCheckingContext.getEnclosingClassNodes().contains(cn)) {
5773-
ClassNode outer = cn.getOuterClass();
5774-
do { property = outer.getProperty(pname);
5775-
if (property != null) break outer_upper;
5776-
} while (!outer.isStaticClass() && (outer = outer.getOuterClass()) != null);
5777-
}
5778-
}
5767+
property = findProperty(receiver, pname);
57795768
// GRECLIPSE end
57805769
if (property != null) {
57815770
int mods = Opcodes.ACC_PUBLIC | (property.isStatic() ? Opcodes.ACC_STATIC : 0);
@@ -5788,12 +5777,16 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
57885777
// maybe we are looking for a setter ?
57895778
String pname = extractPropertyNameFromMethodName("set", name);
57905779
if (pname != null) {
5780+
/* GRECLIPSE edit -- GROOVY-10414
57915781
ClassNode curNode = receiver;
57925782
PropertyNode property = null;
57935783
while (property == null && curNode != null) {
57945784
property = curNode.getProperty(pname);
57955785
curNode = curNode.getSuperClass();
57965786
}
5787+
*/
5788+
PropertyNode property = findProperty(receiver, pname);
5789+
// GRECLIPSE end
57975790
if (property != null && !Modifier.isFinal(property.getModifiers())) { // GRECLIPSE add
57985791
ClassNode type = property.getOriginType();
57995792
if (implementsInterfaceOrIsSubclassOf(wrapTypeIfNecessary(args[0]), wrapTypeIfNecessary(type))) {
@@ -5847,6 +5840,25 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
58475840
return EMPTY_METHODNODE_LIST;
58485841
}
58495842

5843+
// GRECLIPSE add
5844+
private PropertyNode findProperty(final ClassNode receiver, final String name) {
5845+
for (ClassNode cn = receiver; cn != null; cn = cn.getSuperClass()) {
5846+
PropertyNode property = cn.getProperty(name);
5847+
if (property != null) return property;
5848+
5849+
if (!cn.isStaticClass() && cn.getOuterClass() != null
5850+
&& typeCheckingContext.getEnclosingClassNodes().contains(cn)) {
5851+
ClassNode outer = cn.getOuterClass();
5852+
do {
5853+
property = outer.getProperty(name);
5854+
if (property != null) return property;
5855+
} while (!outer.isStaticClass() && (outer = outer.getOuterClass()) != null);
5856+
}
5857+
}
5858+
return null;
5859+
}
5860+
// GRECLIPSE end
5861+
58505862
private List<MethodNode> filterMethodsByVisibility(List<MethodNode> methods) {
58515863
if (!asBoolean(methods)) {
58525864
return EMPTY_METHODNODE_LIST;

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+25-13
Original file line numberDiff line numberDiff line change
@@ -5493,18 +5493,7 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
54935493
curNode = curNode.getSuperClass();
54945494
}
54955495
*/
5496-
outer_upper: // can't use existsProperty because it calls findMethod
5497-
for (ClassNode cn = receiver; cn != null; cn = cn.getSuperClass()) {
5498-
property = cn.getProperty(pname);
5499-
if (property != null) break outer_upper;
5500-
if (!cn.isStaticClass() && cn.getOuterClass() != null
5501-
&& typeCheckingContext.getEnclosingClassNodes().contains(cn)) {
5502-
ClassNode outer = cn.getOuterClass();
5503-
do { property = outer.getProperty(pname);
5504-
if (property != null) break outer_upper;
5505-
} while (!outer.isStaticClass() && (outer = outer.getOuterClass()) != null);
5506-
}
5507-
}
5496+
property = findProperty(receiver, pname);
55085497
// GRECLIPSE end
55095498
if (property != null) {
55105499
int mods = Opcodes.ACC_PUBLIC | (property.isStatic() ? Opcodes.ACC_STATIC : 0);
@@ -5517,12 +5506,16 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
55175506
// maybe we are looking for a setter ?
55185507
String pname = extractPropertyNameFromMethodName("set", name);
55195508
if (pname != null) {
5520-
ClassNode curNode = receiver;
55215509
PropertyNode property = null;
5510+
/* GRECLIPSE edit -- GROOVY-10414
5511+
ClassNode curNode = receiver;
55225512
while (property == null && curNode != null) {
55235513
property = curNode.getProperty(pname);
55245514
curNode = curNode.getSuperClass();
55255515
}
5516+
*/
5517+
property = findProperty(receiver, pname);
5518+
// GRECLIPSE end
55265519
if (property != null && !Modifier.isFinal(property.getModifiers())) { // GRECLIPSE add
55275520
ClassNode type = property.getOriginType();
55285521
if (implementsInterfaceOrIsSubclassOf(wrapTypeIfNecessary(args[0]), wrapTypeIfNecessary(type))) {
@@ -5571,6 +5564,25 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
55715564
return EMPTY_METHODNODE_LIST;
55725565
}
55735566

5567+
// GRECLIPSE add
5568+
private PropertyNode findProperty(final ClassNode receiver, final String name) {
5569+
for (ClassNode cn = receiver; cn != null; cn = cn.getSuperClass()) {
5570+
PropertyNode property = cn.getProperty(name);
5571+
if (property != null) return property;
5572+
5573+
if (!cn.isStaticClass() && cn.getOuterClass() != null
5574+
&& typeCheckingContext.getEnclosingClassNodes().contains(cn)) {
5575+
ClassNode outer = cn.getOuterClass();
5576+
do {
5577+
property = outer.getProperty(name);
5578+
if (property != null) return property;
5579+
} while (!outer.isStaticClass() && (outer = outer.getOuterClass()) != null);
5580+
}
5581+
}
5582+
return null;
5583+
}
5584+
// GRECLIPSE end
5585+
55745586
/**
55755587
* Given a method name and a prefix, returns the name of the property that should be looked up,
55765588
* following the java beans rules. For example, "getName" would return "name", while

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+21-21
Original file line numberDiff line numberDiff line change
@@ -4814,21 +4814,9 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
48144814
}
48154815
PropertyNode property = null;
48164816
if (pname != null) {
4817-
outer_upper: // can't use existsProperty because it calls findMethod
4818-
for (ClassNode cn = receiver; cn != null; cn = cn.getSuperClass()) {
4819-
property = cn.getProperty(pname);
4820-
if (property != null) break outer_upper;
4821-
if (!cn.isStaticClass() && cn.getOuterClass() != null
4822-
&& typeCheckingContext.getEnclosingClassNodes().contains(cn)) {
4823-
ClassNode outer = cn.getOuterClass();
4824-
do {
4825-
property = outer.getProperty(pname);
4826-
if (property != null) break outer_upper;
4827-
} while (!outer.isStaticClass() && (outer = outer.getOuterClass()) != null);
4828-
}
4829-
}
4830-
} else { // look for property via getGetterName() for non-canonical case
4831-
out:
4817+
property = findProperty(receiver, pname);
4818+
} else {
4819+
out: // look for property via getGetterName() for non-canonical case
48324820
for (ClassNode cn = receiver; cn != null; cn = cn.getSuperClass()) {
48334821
for (PropertyNode pn : cn.getProperties()) {
48344822
if (name.equals(pn.getGetterName())) {
@@ -4848,12 +4836,7 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
48484836
// maybe we are looking for a setter ?
48494837
String pname = extractPropertyNameFromMethodName("set", name);
48504838
if (pname != null) {
4851-
ClassNode curNode = receiver;
4852-
PropertyNode property = null;
4853-
while (property == null && curNode != null) {
4854-
property = curNode.getProperty(pname);
4855-
curNode = curNode.getSuperClass();
4856-
}
4839+
PropertyNode property = findProperty(receiver, pname);
48574840
if (property != null && !Modifier.isFinal(property.getModifiers())) {
48584841
ClassNode type = property.getOriginType();
48594842
if (implementsInterfaceOrIsSubclassOf(wrapTypeIfNecessary(args[0]), wrapTypeIfNecessary(type))) {
@@ -4898,6 +4881,23 @@ protected List<MethodNode> findMethod(ClassNode receiver, final String name, fin
48984881
return EMPTY_METHODNODE_LIST;
48994882
}
49004883

4884+
private PropertyNode findProperty(final ClassNode receiver, final String name) {
4885+
for (ClassNode cn = receiver; cn != null; cn = cn.getSuperClass()) {
4886+
PropertyNode property = cn.getProperty(name);
4887+
if (property != null) return property;
4888+
4889+
if (!cn.isStaticClass() && cn.getOuterClass() != null
4890+
&& typeCheckingContext.getEnclosingClassNodes().contains(cn)) {
4891+
ClassNode outer = cn.getOuterClass();
4892+
do {
4893+
property = outer.getProperty(name);
4894+
if (property != null) return property;
4895+
} while (!outer.isStaticClass() && (outer = outer.getOuterClass()) != null);
4896+
}
4897+
}
4898+
return null;
4899+
}
4900+
49014901
/**
49024902
* Given a method name and a prefix, returns the name of the property that should be looked up,
49034903
* following the java beans rules. For example, "getName" would return "name", while

0 commit comments

Comments
 (0)