/** * 15.12.1: Compile-Time Step 1: Determine Class or Interface to Search * * @author Martin Bravenboer */ module dryad/type-check/invoke/StepSearch imports dryad/jls/types/Subtyping /** * For all MethodId alternatives, the following three strategies must be defined. */ strategies /** * Returns the type on which the invocation is to be performed. * * @type MethodId -> Type */ dryad-tc-search-class-of-method = fail /** * Returns the name of the method to be invoked. * * @type MethodId -> String */ dryad-tc-name-of-method = fail /** * Return a list of explicit actual type arguments specified in the invocation. * * @type MethodId -> List(ActualTypeArg) */ dryad-tc-explicit-type-arguments-method = fail /** * Form MethodName: Id */ strategies /** * @todo Instance access not allowed from static context. */ dryad-tc-search-class-of-method : Method(MethodName(Id(s))) -> type where <bigbagof-ThisType> () ; fetch-elem(where(lookup-class; has-method(|s))) ; ?type dryad-tc-name-of-method : Method(MethodName(Id(x))) -> x dryad-tc-explicit-type-arguments-method : Method(MethodName(Id(s))) -> [] /** * Form MethodName: TypeName.Id */ rules /** * @todo Method must be static. */ dryad-tc-search-class-of-method : Method(MethodName(tn@TypeName(_, _), _)) -> ClassType(tn, None()) where <log-lookup-class> tn => class ; <not(is-interface)> class dryad-tc-name-of-method : Method(MethodName(TypeName(_, _), Id(x))) -> x dryad-tc-explicit-type-arguments-method : Method(MethodName(TypeName(_, _), _)) -> [] /** * Form MethodName: FieldName.Id * * Note: FieldName is actually not an existing name in the * JLS. Probably, the authors wanted to refer to an ExprName. * * @todo Is this indeed an error in the JLS? Submitted. * @todo Duplicate cases: can this be normalized in the disamb phase? */ rules dryad-tc-search-class-of-method : Method(MethodName(en@Field(_, _), _)) -> <type-attr> en dryad-tc-search-class-of-method : Method(MethodName(en@Field(_), _)) -> <type-attr> en dryad-tc-search-class-of-method : Method(MethodName(en@ExprName(_), _)) -> <type-attr> en dryad-tc-name-of-method : Method(MethodName(Field(_, _), Id(x))) -> x dryad-tc-name-of-method : Method(MethodName(Field(_), Id(x))) -> x dryad-tc-name-of-method : Method(MethodName(ExprName(_), Id(x))) -> x dryad-tc-explicit-type-arguments-method : Method(MethodName(Field(_, _), _)) -> [] dryad-tc-explicit-type-arguments-method : Method(MethodName(Field(_), _)) -> [] dryad-tc-explicit-type-arguments-method : Method(MethodName(ExprName(_), _)) -> [] /** * Form Primary . TypeArgs? Identifier * * In fact, the syntax allows any expression. */ rules /** * @todo Handle expression that has variable type (i.e. take upper bound) */ dryad-tc-search-class-of-method : Method(e, _, _) -> <type-attr> e dryad-tc-name-of-method : Method(_, _, Id(x)) -> x dryad-tc-explicit-type-arguments-method : Method(_, None(), _) -> [] dryad-tc-explicit-type-arguments-method : Method(_, Some(TypeArgs(args)), _) -> args /** * Form super . TypeArgs? Identifier */ rules /** * @todo Super invoke: get-superclass-as-type requires the argument types of this class? */ dryad-tc-search-class-of-method = ?SuperMethod(_, _) ; <ThisType> () ; log-lookup-class ; get-superclass-as-type dryad-tc-name-of-method : SuperMethod(_, Id(x)) -> x dryad-tc-explicit-type-arguments-method : SuperMethod(None(), _) -> [] dryad-tc-explicit-type-arguments-method : SuperMethod(Some(TypeArgs(args)), _) -> args /** * Form TypeName.super.TypeArgs? Identifier */ rules /** * @todo Super invoke: get-superclass-as-type requires the argument types of this class? */ dryad-tc-search-class-of-method = ?QSuperMethod(tn, _, _) ; <bigbagof-ThisType> () ; fetch-elem(?ClassType(tn, _)) ; log-lookup-class ; get-superclass-as-type dryad-tc-name-of-method : QSuperMethod(_, _, Id(x)) -> x dryad-tc-explicit-type-arguments-method : QSuperMethod(_, None(), _) -> [] dryad-tc-explicit-type-arguments-method : QSuperMethod(_, Some(TypeArgs(args)), _) -> args /** * Form TypeName. TypeArgs Identifier * * @todo This could be an expression name. */ rules dryad-tc-search-class-of-method : GenericMethod(tn@TypeName(_, _), _, _) -> ClassType(tn, None()) where <log-lookup-class> tn => class ; <not(is-interface)> class dryad-tc-name-of-method : GenericMethod(TypeName(_, _), _, Id(x)) -> x dryad-tc-explicit-type-arguments-method : GenericMethod(_, TypeArgs(args), _) -> args