File tree 4 files changed +55
-15
lines changed
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 Original file line number Diff line number Diff line change @@ -2318,6 +2318,31 @@ public void testAccessOuterClassMemberFromInnerClassConstructor3() {
2318
2318
runConformTest (sources , "ok" );
2319
2319
}
2320
2320
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
+
2321
2346
@ Test // GROOVY-9501
2322
2347
public void testAccessOuterClassMemberFromInnerClassMethod1 () {
2323
2348
//@formatter:off
Original file line number Diff line number Diff line change @@ -749,12 +749,17 @@ public void visitMapEntryExpression(MapEntryExpression mee) {
749
749
@ Override
750
750
public void visitMethodCallExpression (MethodCallExpression mce ) {
751
751
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 ()) {
757
760
throw newVariableError (mce .getMethodAsString (), mce .getMethod ());
761
+ } else {
762
+ throw newVariableError (mce .getObjectExpression ().getText (), mce .getObjectExpression ());
758
763
}
759
764
}
760
765
nodes .push (mce );
Original file line number Diff line number Diff line change @@ -828,12 +828,17 @@ public void visitMapEntryExpression(MapEntryExpression mee) {
828
828
@ Override
829
829
public void visitMethodCallExpression (MethodCallExpression mce ) {
830
830
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 ()) {
836
839
throw newVariableError (mce .getMethodAsString (), mce .getMethod ());
840
+ } else {
841
+ throw newVariableError (mce .getObjectExpression ().getText (), mce .getObjectExpression ());
837
842
}
838
843
}
839
844
nodes .push (mce );
Original file line number Diff line number Diff line change @@ -805,12 +805,17 @@ public void visitMapEntryExpression(MapEntryExpression mee) {
805
805
@ Override
806
806
public void visitMethodCallExpression (MethodCallExpression mce ) {
807
807
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 ()) {
813
816
throw newVariableError (mce .getMethodAsString (), mce .getMethod ());
817
+ } else {
818
+ throw newVariableError (mce .getObjectExpression ().getText (), mce .getObjectExpression ());
814
819
}
815
820
}
816
821
nodes .push (mce );
You can’t perform that action at this time.
0 commit comments