6060import java .util .Collection ;
6161import java .util .List ;
6262import java .util .Map ;
63+ import java .util .Objects ;
6364import java .util .Set ;
6465
6566import static org .apache .groovy .ast .tools .ExpressionUtils .isThisExpression ;
8384import static org .codehaus .groovy .ast .ClassHelper .int_TYPE ;
8485import static org .codehaus .groovy .ast .ClassHelper .isPrimitiveType ;
8586import static org .codehaus .groovy .ast .ClassHelper .make ;
86- import static org .codehaus .groovy .classgen .AsmClassGenerator .samePackages ;
8787import static org .codehaus .groovy .transform .stc .StaticTypeCheckingSupport .chooseBestMethod ;
8888import static org .codehaus .groovy .transform .stc .StaticTypeCheckingSupport .findDGMMethodsByNameAndArguments ;
8989import static org .codehaus .groovy .transform .stc .StaticTypeCheckingSupport .implementsInterfaceOrIsSubclassOf ;
@@ -625,6 +625,7 @@ boolean makeGetField(final Expression receiver, final ClassNode receiverType, fi
625625 }
626626
627627 private static boolean isDirectAccessAllowed (FieldNode field , ClassNode receiver ) {
628+ /* GRECLIPSE edit -- GROOVY-9791
628629 ClassNode declaringClass = field.getDeclaringClass().redirect();
629630 ClassNode receiverType = receiver.redirect();
630631
@@ -643,6 +644,26 @@ private static boolean isDirectAccessAllowed(FieldNode field, ClassNode receiver
643644
644645 // finally public and visible
645646 return field.isPublic() || samePackages(receiver.getPackageName(), declaringClass.getPackageName());
647+ */
648+ // a public field is accessible from anywhere
649+ if (field .isPublic ()) return true ;
650+
651+ ClassNode declaringType = field .getDeclaringClass ().redirect ();
652+
653+ // any field is accessible from the declaring class
654+ if (receiver .equals (declaringType )) return true ;
655+
656+ // a private field isn't accessible beyond the declaring class
657+ if (field .isPrivate ()) return false ;
658+
659+ // a protected field is accessible from any subclass of the declaring class
660+ if (field .isProtected () && receiver .isDerivedFrom (declaringType )) return true ;
661+
662+ // a protected or package-private field is accessible from the declaring package
663+ if (Objects .equals (receiver .getPackageName (), declaringType .getPackageName ())) return true ;
664+
665+ return false ;
666+ // GRECLIPSE end
646667 }
647668
648669 @ Override
0 commit comments