Transformation Language
For simplifying the implementation of refactorings and other program transformations, the IDC tool embeds a program transformation language, based on the Stratego language.
Example
This is the current development implementation of the SimplifyExpression refactoring:
# Transformation to simplify an expression simplify = Binary(Eq(t),Binary(Minus(t),x,y),Lit(t,0)) -> Binary(Eq(t),x,y) | Unary(Not(Bool),Binary(Eq(t),x,y)) -> Binary(NotEq(t),x,y) | Binary(And(_),x,x) -> x # Transformation to check whether this refactoring is applicable given the root term and the current selection applicable = # boilerplate code to extract the selection ir.path.Applicable( # get the currently selected subterm ir.path.projectSelection ; # check if it is an expression ir.match.expr ; # and that 'simplify' succeeds once, from top to down OnceTD(simplify) ) # Ask and process user input, and return a list of arguments input = # no user input is required ir.path.Input(![]) # Transformation to apply this refactoring given the root term, selection, and arguments apply = # boilerplate code to extract the selection ir.path.Apply( # discard the arguments [root,[]] -> root ; # apply 'simplify' once in the current selection, from top to down OnceTD( ir.path.isSelected ; InnerMost(simplify) ) ) # Transformation to perform some unit testing testAnd = simplify Binary(And(Int(32,Signed)),Sym("x"),Sym("x")) => Sym("x")