Skip to content

Commit 2f03b94

Browse files
committed
GROOVY-11352
1 parent 49da260 commit 2f03b94

File tree

4 files changed

+55
-15
lines changed
  • base
    • org.codehaus.groovy30/src/org/codehaus/groovy/classgen
    • org.codehaus.groovy40/src/org/codehaus/groovy/classgen
    • org.codehaus.groovy50/src/org/codehaus/groovy/classgen
  • base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic

4 files changed

+55
-15
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic/InnerClassTests.java

+25
Original file line numberDiff line numberDiff line change
@@ -2318,6 +2318,31 @@ public void testAccessOuterClassMemberFromInnerClassConstructor3() {
23182318
runConformTest(sources, "ok");
23192319
}
23202320

2321+
@Test // GROOVY-11352
2322+
public void testAccessOuterClassMemberFromInnerClassConstructor4() {
2323+
//@formatter:off
2324+
String[] sources = {
2325+
"Script.groovy",
2326+
"class Super {\n" +
2327+
" protected final String s\n" +
2328+
" Super(String s) { this.s = s }\n" +
2329+
"}\n" +
2330+
"class Outer {\n" +
2331+
" static String initValue() { 'ok' }\n" +
2332+
" static class Inner extends Super {\n" +
2333+
" Inner() {\n" +
2334+
" super(initValue())\n" + // here
2335+
" }\n" +
2336+
" }\n" +
2337+
" String test() { new Inner().s }\n" +
2338+
"}\n" +
2339+
"print new Outer().test()\n",
2340+
};
2341+
//@formatter:on
2342+
2343+
runConformTest(sources, "ok");
2344+
}
2345+
23212346
@Test // GROOVY-9501
23222347
public void testAccessOuterClassMemberFromInnerClassMethod1() {
23232348
//@formatter:off

base/org.codehaus.groovy30/src/org/codehaus/groovy/classgen/Verifier.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -749,12 +749,17 @@ public void visitMapEntryExpression(MapEntryExpression mee) {
749749
@Override
750750
public void visitMethodCallExpression(MethodCallExpression mce) {
751751
if (inSpecialConstructorCall() && isThisObjectExpression(mce)) {
752-
MethodNode methodTarget = mce.getMethodTarget();
753-
if (methodTarget == null || !(methodTarget.isStatic() || classNode.getOuterClasses().contains(methodTarget.getDeclaringClass()))) {
754-
if (!mce.isImplicitThis()) {
755-
throw newVariableError(mce.getObjectExpression().getText(), mce.getObjectExpression());
756-
} else {
752+
boolean outerOrStaticMember = false;
753+
if (mce.getMethodTarget() != null) {
754+
outerOrStaticMember = mce.getMethodTarget().isStatic() || classNode.getOuterClasses().contains(mce.getMethodTarget().getDeclaringClass());
755+
} else if (mce.isImplicitThis()) { // GROOVY-11352
756+
outerOrStaticMember = classNode.getOuterClasses().stream().anyMatch(oc -> oc.hasPossibleStaticMethod(mce.getMethodAsString(), mce.getArguments()));
757+
}
758+
if (!outerOrStaticMember) {
759+
if (mce.isImplicitThis()) {
757760
throw newVariableError(mce.getMethodAsString(), mce.getMethod());
761+
} else {
762+
throw newVariableError(mce.getObjectExpression().getText(), mce.getObjectExpression());
758763
}
759764
}
760765
nodes.push(mce);

base/org.codehaus.groovy40/src/org/codehaus/groovy/classgen/Verifier.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -828,12 +828,17 @@ public void visitMapEntryExpression(MapEntryExpression mee) {
828828
@Override
829829
public void visitMethodCallExpression(MethodCallExpression mce) {
830830
if (inSpecialConstructorCall() && isThisObjectExpression(mce)) {
831-
MethodNode methodTarget = mce.getMethodTarget();
832-
if (methodTarget == null || !(methodTarget.isStatic() || classNode.getOuterClasses().contains(methodTarget.getDeclaringClass()))) {
833-
if (!mce.isImplicitThis()) {
834-
throw newVariableError(mce.getObjectExpression().getText(), mce.getObjectExpression());
835-
} else {
831+
boolean outerOrStaticMember = false;
832+
if (mce.getMethodTarget() != null) {
833+
outerOrStaticMember = mce.getMethodTarget().isStatic() || classNode.getOuterClasses().contains(mce.getMethodTarget().getDeclaringClass());
834+
} else if (mce.isImplicitThis()) { // GROOVY-11352
835+
outerOrStaticMember = classNode.getOuterClasses().stream().anyMatch(oc -> oc.hasPossibleStaticMethod(mce.getMethodAsString(), mce.getArguments()));
836+
}
837+
if (!outerOrStaticMember) {
838+
if (mce.isImplicitThis()) {
836839
throw newVariableError(mce.getMethodAsString(), mce.getMethod());
840+
} else {
841+
throw newVariableError(mce.getObjectExpression().getText(), mce.getObjectExpression());
837842
}
838843
}
839844
nodes.push(mce);

base/org.codehaus.groovy50/src/org/codehaus/groovy/classgen/Verifier.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -805,12 +805,17 @@ public void visitMapEntryExpression(MapEntryExpression mee) {
805805
@Override
806806
public void visitMethodCallExpression(MethodCallExpression mce) {
807807
if (inSpecialConstructorCall() && isThisObjectExpression(mce)) {
808-
MethodNode methodTarget = mce.getMethodTarget();
809-
if (methodTarget == null || !(methodTarget.isStatic() || classNode.getOuterClasses().contains(methodTarget.getDeclaringClass()))) {
810-
if (!mce.isImplicitThis()) {
811-
throw newVariableError(mce.getObjectExpression().getText(), mce.getObjectExpression());
812-
} else {
808+
boolean outerOrStaticMember = false;
809+
if (mce.getMethodTarget() != null) {
810+
outerOrStaticMember = mce.getMethodTarget().isStatic() || classNode.getOuterClasses().contains(mce.getMethodTarget().getDeclaringClass());
811+
} else if (mce.isImplicitThis()) { // GROOVY-11352
812+
outerOrStaticMember = classNode.getOuterClasses().stream().anyMatch(oc -> oc.hasPossibleStaticMethod(mce.getMethodAsString(), mce.getArguments()));
813+
}
814+
if (!outerOrStaticMember) {
815+
if (mce.isImplicitThis()) {
813816
throw newVariableError(mce.getMethodAsString(), mce.getMethod());
817+
} else {
818+
throw newVariableError(mce.getObjectExpression().getText(), mce.getObjectExpression());
814819
}
815820
}
816821
nodes.push(mce);

0 commit comments

Comments
 (0)