/** * Declare local variables. * * @author Martin Bravenboer <martin@cs.uu.nl> */ module dryad/reclassify/declare/LocalVariables strategies /** * Declares a local variable */ declare-local-variables(rec) = ?[LocalVarDecStm(_) | _]; {| ReclassifySimpleInScopeVar : [ LocalVarDecStm(declare-local-vardec-helper(rec)) | id] ; [id | rec] |} /** * Declares local variable of a for loop. */ declare-local-variables(rec) = ?For(LocalVarDec(_, _, _), _, _, _); {| ReclassifySimpleInScopeVar : For(declare-local-vardec-helper(rec), rec, rec, rec) |} /** * @todo Traverse the rhs of the header first. */ declare-local-variables(rec) = ForEach(rec, rec, id) ; {| ReclassifySimpleInScopeVar : ?ForEach(param, _, _) ; where(<declare-param-helper> param) ; ForEach(id, id, rec) |} /** * Helpers for variable declarations */ strategies declare-local-vardec-helper(rec) = LocalVarDec(id, rec, map(declare-var-helper; rec)) declare-var-helper = ( ?VarDec(Id(x)) + ?VarDec(Id(x), _) + ?VarDec(ArrayVarDecId(Id(x), _)) + ?VarDec(ArrayVarDecId(Id(x), _), _) ) ; rules( ReclassifySimpleInScopeVar : AmbName(Id(x)) -> ExprName(Id(x)) /** * Hides a possibly defined reclassify rule for fields. * * @todo Use a different constructor for local variables? */ ReclassifySimpleInScopeVar : ExprName(Id(x)) -> ExprName(Id(x)) ) declare-param-helper = ( ?Param(_, _, Id(x)) + ?Param(_, _, ArrayVarDecId(Id(x), _)) ) ; rules( ReclassifySimpleInScopeVar: AmbName(Id(x)) -> ExprName(Id(x)) /** * Hides a possibly defined reclassify rule for fields. * * @todo Use a different constructor for local variables? */ ReclassifySimpleInScopeVar : ExprName(Id(x)) -> ExprName(Id(x)) ) /** * @todo I don't think this code is really necessary. Check * Maybe it is necessary to hide variables in outer scopes, * but it might be cleaner to use an undefine dynamic rule for that. */ declare-field-var-helper = (?VarDec(Id(x)) + ?VarDec(Id(x), _)); rules( ReclassifySimpleInScopeVar : AmbName(Id(x)) -> Field(Id(x)) ReclassifySimpleInScopeVar : ExprName(Id(x)) -> Field(Id(x)) )