File tree Expand file tree Collapse file tree
base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/basic
org.codehaus.groovy30/src/org/codehaus/groovy/classgen
org.codehaus.groovy40/src/org/codehaus/groovy/classgen
org.codehaus.groovy50/src/org/codehaus/groovy/classgen Expand file tree Collapse file tree Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 );
Original file line number Diff line number Diff 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 );
Original file line number Diff line number Diff 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 );
You can’t perform that action at this time.
0 commit comments