/** * Source Class * * @author Martin Bravenboer <martin@cs.uu.nl> */ module dryad/model/source-class imports dryad/lib-ext/oo/classes dryad/model/class dryad/model/compilation-unit dryad/model/source-field dryad/model/source-constructor dryad/model/source-method dryad/util/jtree dryad/util/jtree-overlays signature constructors JavaSourceClass : ClassName /** * Stratego class support for source classes. */ strategies /** * Constructs a new source class. * * @type _ -> Class */ new-source-class(|simple-name) = <classes_get-class> JavaSourceClass() ; classes_new-instance ; classes_set-instance-field(|"simple-name", simple-name) /** * Succeeds if the current term is an instance of Java source class */ instanceof-JavaSourceClass = classes_instanceof(|JavaSourceClass()) /** * Succeeds if the current term is an instance of a Java class. * This alternative declares a JavaSourceClass to be a JavaClass. */ instanceof-JavaClass = instanceof-JavaSourceClass /** * Access Control */ strategies /** * @todo This is the same for all source members. Generalize? * @type SourceClass Object -> Access Modifier */ get-access = instanceof-JavaSourceClass; ?this; get-modifiers ; ( fetch-elem(?Public() + ?Private() + ?Protected()) <+ if <get-declaring-class> this; is-interface then !Public() else !DefaultAccess() end ) get-modifiers = instanceof-JavaSourceClass; get-reference-ast ; ( ?ClassDec(ClassDecHead(<id>, _, _, _, _), _) <+ ?InterfaceDec(InterfaceDecHead(<id>, _, _, _), _)) strategies /** * @type SourceClass Object -> Source Type * @todo java.lang.Object has no superclass. */ get-superclass-as-type = instanceof-JavaSourceClass; ?this; get-reference-ast ; ( get-superclass-of-typedec <+ if get-canonical-name => TypeName(PackageName([Id("java"), Id("lang")]), Id("Object")) then fail else !TypeObject() end ) /** * @type SourceClass Object -> List(Source Type) */ get-superinterfaces-as-type = instanceof-JavaSourceClass; get-reference-ast ; (get-superinterfaces-of-typedec <+ ![]) strategies /** * @type SourceClass Object -> List(TypeParam) */ get-formal-type-parameters = instanceof-JavaSourceClass; get-reference-ast ; ( ?ClassDec(ClassDecHead(_, _, Some(TypeParams(<id>)), _, _), _) <+ ?InterfaceDec(InterfaceDecHead(_, _, Some(TypeParams(<id>)), _), _) <+ ?ClassDec(ClassDecHead(_, _, None(), _, _), _) ; ![] <+ ?InterfaceDec(InterfaceDecHead(_, _, None(), _), _) ; ![] ) /** * Compilation Units */ strategies /** * @type SourceClass Object -> CompilationUnit Object */ get-compilation-unit = instanceof-JavaSourceClass; classes_get-instance-field(|"compilation-unit") /** * @param CompilationUnit Object * @type SourceClass Object -> SourceClass Object */ set-compilation-unit(|cu) = instanceof-JavaSourceClass; classes_set-instance-field(|"compilation-unit", cu) /** * @todo Maybe move the fallback to the declaring class' compilation-unit into get-compilation-unit. * @type SourceClass Object -> Package Object */ get-package = (get-compilation-unit <+ get-declaring-class; get-compilation-unit) ; get-package strategies /** * Succeeds if this class is an interface. */ is-interface = instanceof-JavaSourceClass; where( get-reference-ast ; ?InterfaceDec(_, _) ) /** * Succeeds if the class is a static (inner) class. */ is-static = instanceof-JavaClass; where( get-modifiers ; fetch(Static()) ) /** * Constructors */ strategies /** * Initializes the declared constructors list of the source class. * * @type SourceClass Object -> List(SourceConstructor Object) */ init-get-declared-constructor-list = instanceof-JavaSourceClass; get-reference-ast ; get-body-decs-of-typedec ; filter(instanceof-JavaConstructor) /** * @todo Default constructor for enum type must have private access. * @todo The constructor should not be created again and again, since it is not garbage collected. * @todo DRY-203: No super invocation for java.lang.Object source file. * @todo DRY-202: Set the appropiate access modifiers (see 8.8.9) */ get-default-constructor = instanceof-JavaSourceClass; ?this; where(get-simple-name => name) ; !ConstrDec( ConstrDecHead([<get-access-of-default-constructor> this],None(), Id(name),[], None()) , ConstrBody(Some(SuperConstrInv(None(),[])),[]) ) ; new-source-constructor(|<id>) ; set-declaring-class(|this) get-access-of-default-constructor = instanceof-JavaClass; ?this; <get-access> this /** * Fields */ strategies /** * Initializes the field table of a source class. * * @todo A fielddec can declare multiple variables. How should this be represented in the table? * @type SourceClass Object -> List(SourceClass Object) */ init-get-declared-field-list = instanceof-JavaSourceClass; get-reference-ast ; get-body-decs-of-typedec ; filter(instanceof-JavaField) /** * Methods */ strategies /** * Initializes the declared method table of a source class. * * @type SourceClass Object -> List(SourceMethod Object) */ init-get-declared-method-list = instanceof-JavaSourceClass; get-reference-ast ; get-body-decs-of-typedec ; filter(instanceof-JavaMethod) /** * Member classes */ strategies /** * Initializes the declared member classes table of a source class. * * @type SourceClass Object -> SourceClass Object */ init-declared-member-type-table = instanceof-JavaSourceClass; ?this; where( get-reference-ast ; where(new-hashtable => classtbl) ; get-body-decs-of-typedec ; filter(instanceof-JavaClass) ; map({class, name: ?class ; get-simple-name => name ; <hashtable-put(|name, class)> classtbl }) ) ; classes_set-instance-field(|"declared-member-type-table", classtbl) /** * Reference AST of this source class. */ strategies /** * Returns the Reference AST of this source class. * * @type SourceClass Object -> ReferenceAST(TypeDec) */ get-reference-ast = instanceof-JavaSourceClass; classes_get-instance-field(|"reference-ast") /** * @param ReferenceAST(TypeDec) * @type SourceClass Object -> SourceClass Object */ set-reference-ast(|ref-ast) = instanceof-JavaSourceClass; classes_set-instance-field(|"reference-ast", ref-ast) strategies /** * Returns the AST of this source class. * * @type SourceClass Object -> TypeDec */ get-ast = instanceof-JavaSourceClass; get-reference-ast ; apply-to-body-decs-of-typedec(try(get-ast)) /** * Initializes the RefAST of this SourceClass from the given AST. * * @param TypeDec * @type SourceClass Object -> SourceClass Object */ set-ast(|ast) = instanceof-JavaSourceClass; ?this; where( !ast // Handle field declarations. ; apply-to-field-decs-of-typedec({fdec, vdec, x, field : ?fdec ; let name-of-field = ?VarDec(Id(<id>)) + ?VarDec(Id(<id>), _) + ?VarDec(ArrayVarDecId(Id(<id>), _)) + ?VarDec(ArrayVarDecId(Id(<id>), _), _) in (?FieldDec(_, _, [vdec]) + ?ConstantDec(_, _, [vdec])) ; where(<name-of-field> vdec => x) ; new-source-field(|x, fdec) => field ; set-declaring-class(|this) end }) // Handle method declarations ; apply-to-method-decs-of-typedec( new-source-method(|<id>) ; set-declaring-class(|this) ) // Handle constructor declarations ; apply-to-constructor-decs-of-typedec( new-source-constructor(|<id>) ; set-declaring-class(|this) ) // Handle member type declarations. ; apply-to-member-type-decs-of-typedec({tast, name, class: ?tast ; get-name-of-typedec => name ; new-source-class(|name) => class ; set-declaring-class(|this) ; set-ast(|tast) }) ; ?ref-ast ) ; set-reference-ast(|ref-ast)