/** * 6.6: Access Control * * @author Martin Bravenboer <martin@cs.uu.nl> */ module dryad/jls/names/AccessControl strategies /** * Packages */ strategies /** * A package is always accessible. */ is-accessible-from(|from) = instanceof-JavaPackage ; true /** * Top level classes */ strategies /** * Public top level classes are accessible. * * @todo Exclude array classes? * @param Class object * @type Class object -> Class object */ is-accessible-from(|from) = instanceof-JavaClass ; is-top-level-class ; is-public /** * Top level classes with default access are only accessible in the same package. * * @todo Exclude array classes? * @param Class object * @type Class object -> Class object */ is-accessible-from(|from) = instanceof-JavaClass => this ; is-top-level-class ; where( get-access => DefaultAccess() ; <get-package> this => decpackage ; <get-package> from => decpackage ) /** * Arrays */ strategies /** * Array class is accessible if its element type is accessible. * * @param Class object * @type Class object -> Class object */ is-accessible-from(|from) = instanceof-JavaClass ; is-array-class ; get-element-type ; if is-reference-type then lookup-class ; is-accessible-from(|from) else // primitives @todo Report missing specification of accessible primitives. true end /** * Members */ strategies is-accessible-from(|from) = public-member-is-accessible(|from) <+ protected-member-is-accessible-from-same-package(|from) <+ protected-member-is-accessible-from-subclass(|from) <+ private-member-is-accessible-from(|from) <+ default-access-member-is-accessible-from(|from) is-accessible-from(|to, from) = public-member-is-accessible(|from) <+ protected-member-is-accessible-from-same-package(|from) <+ protected-member-is-qualified-accessible-from-subclass(|to, from) <+ private-member-is-accessible-from(|from) <+ default-access-member-is-accessible-from(|from) /** * Public members are accessible (if the declaring class is accessible). * * @param Class object * @type Member object -> Member object */ public-member-is-accessible(|from) = (instanceof-JavaMember + instanceof-JavaConstructor) => this ; where( <get-declaring-class> this => decclass ; <is-public> this ; <is-accessible-from(|from)> decclass ) /** * Protected members are accessible if the access occurs within this package. * * @param Class object * @type Member object -> Member object */ protected-member-is-accessible-from-same-package(|from) = (instanceof-JavaMember + instanceof-JavaConstructor) => this ; where( <is-protected> this ; <get-declaring-class> this => decclass ; <is-accessible-from(|from)> decclass ; <get-package> decclass => decpackage ; <get-package> from => decpackage ) /** * Protected members are accessible if access is correct according to 6.6.2. * * @type Member object -> Member object */ protected-member-is-accessible-from-subclass(|from) = instanceof-JavaMember => this ; where( <is-protected> this ; <get-declaring-class> this => decclass ; <is-accessible-from(|from)> decclass ; <is-subclass(|decclass)> from ) protected-member-is-qualified-accessible-from-subclass(|to, from) = where(is-static + not(instanceof-JavaField + instanceof-JavaMethod)) ; protected-member-is-accessible-from-subclass(|from) /** * Protected members are accessible if access is correct according to 6.6.2. * * @param Use site, static class object of which a member is accessed (type of E) * @param Class object from which the member is accessed (S) * @type Member object -> Member object */ protected-member-is-qualified-accessible-from-subclass(|to, from) = instanceof-JavaMember => this ; (instanceof-JavaField + instanceof-JavaMethod) ; not(is-static) ; where( <is-protected> this ; <get-declaring-class> this => decclass ; <is-accessible-from(|from)> decclass ; <is-subclass(|decclass)> from ; <?from + is-subclass(|from)> to ) /** * @todo Protected constructors. */ is-accessible-from(|from) = fail /** * Private access is allowed in the same top level class. * * @param Class object * @type Member object -> Member object */ private-member-is-accessible-from(|from) = (instanceof-JavaMember + instanceof-JavaConstructor) ; ?this ; let get-top-level-class = repeat(get-declaring-class) in where( <is-private> this ; <get-declaring-class> this => decclass ; <is-accessible-from(|from)> decclass ; <get-top-level-class> this => to ; <get-top-level-class> from => to ) end /** * Default access is allowed in the same package. * * @param Class object * @type Member object -> Member object */ default-access-member-is-accessible-from(|from) = (instanceof-JavaMember + instanceof-JavaConstructor) ; ?this ; where( get-access => DefaultAccess() ; <get-declaring-class> this => decclass ; <is-accessible-from(|from)> decclass ; <get-package> decclass => decpackage ; <get-package> from => decpackage )