package Ġme . hay den che ers . simpl ag . manifest Ċ Ċ import Ġme . hay den che ers . simpl ag . Parser Ċ import Ġme . hay den che ers . simpl ag . util . FileUtils Ċ import Ġorg . eclipse . jdt . core . dom .* Ċ import Ġjava . nio . file . Path Ċ Ċ object ĠManifest s Ġ{ ĊĠĠĠ Ġfun Ġbuild For Submission ( submission : ĠPath , Ġvariant Id : ĠInt ): ĠMutable Assignment Manifest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsources Ġ= ĠFileUtils . list Files ( submission , Ġ". java ") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMutable Assignment Manifest ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmission . fileName . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmission , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources . map Ġ{ Ġbuild For File ( it , Ġsubmission ) Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild For File ( file : ĠPath , Ġroot : ĠPath ): ĠMutable File Manifest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Visitor Ġ= Ġobject Ġ: ĠAST Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġmutable ListOf < Abstract Type Declaration >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠType Declaration ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠEnum Declaration ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠAnnotation Type Declaration ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtypes . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= ĠParser . parse ( file ) ĊĠĠĠĠĠĠĠ Ġast . accept ( type Visitor ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMutable File Manifest ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . rel ativ ize ( file ). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġast , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Visitor . types . map Ġ{ Ġbuild ForType Declaration ( it ) Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild ForType Declaration ( node : ĠAbstract Type Declaration ): ĠMutable Type Manifest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Visitor Ġ= Ġobject Ġ: ĠAST Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġmutable ListOf < Method Declaration >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠMethod Declaration ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . body Ġ!= Ġnull ) Ġmethods . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnode . accept ( method Visitor ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMutable Type Manifest ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . name . identifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Visitor . methods . map Ġ{ Ġbuild For Method ( it ) Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild For Method ( method : ĠMethod Declaration ): ĠMutable Method Manifest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Visitor Ġ= Ġobject Ġ: ĠAST Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġmutable ListOf < Statement >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠBlock ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . parent Ġ! is ĠMethod Declaration ) Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠDo Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠEn hanced For Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠExpression Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠFor Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠIf Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠSwitch Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠTry Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠWhile Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠBreak Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠContinue Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠEmpty Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠReturn Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( node : ĠThrow Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmethod . accept ( block Visitor ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMutable Method Manifest ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . name . identifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Visitor . statements . map Ġ{ ĠMutable Statement Manifest ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMutable Assignment Manifest ( ĊĠĠĠ Ġvar Ġname : ĠString , ĊĠĠĠ Ġvar Ġroot : ĠPath , ĊĠĠĠ Ġvar Ġvariant Id : ĠInt , ĊĠĠĠ Ġvar Ġfiles : ĠMutable List < Mutable File Manifest > Ċ ) Ċ Ċ class ĠMutable File Manifest ( ĊĠĠĠ Ġvar Ġrelative Name : ĠString , ĊĠĠĠ Ġvar Ġoriginal Path : ĠPath , ĊĠĠĠ Ġvar Ġast : ĠAST Node , ĊĠĠĠ Ġvar Ġtypes : ĠMutable List < Mutable Type Manifest > Ċ ) Ċ Ċ class ĠMutable Type Manifest ( ĊĠĠĠ Ġvar Ġname : ĠString , ĊĠĠĠ Ġvar Ġnode : ĠAbstract Type Declaration , ĊĠĠĠ Ġvar Ġmethods : ĠList < Mutable Method Manifest > Ċ ) Ċ Ċ class ĠMutable Method Manifest ( ĊĠĠĠ Ġvar Ġname : ĠString , ĊĠĠĠ Ġvar Ġnode : ĠMethod Declaration , ĊĠĠĠ Ġvar Ġstatements : ĠList < Mutable Statement Manifest > Ċ ) Ċ Ċ class ĠMutable Statement Manifest ( ĊĠĠĠ Ġvar Ġnode : ĠStatement Ċ )