package Ġpw . bin om . material Ċ Ċ import Ġpw . bin om . material . compiler .* Ċ Ċ interface ĠMaterial Vis iter Ġ{ ĊĠĠĠ Ġfun Ġvisit ( statement : ĠStatement Block Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatement . statements . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( statement : ĠReturn Statement Dest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatement . ext ?. let Ġ{ Ġvisit ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( expression : ĠMethod Call Expression Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression . from ?. let Ġ{ Ġvisit ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġexpression . args . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( expression : ĠInc Dec Expression Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit ( expression . exp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( expression : ĠExp Parent hesis Dest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit ( expression . exp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( expression : ĠNumber Expression Desc ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( expression : ĠExpression Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMethod Call Expression Desc Ġ-> Ġvisit ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNumber Expression Desc Ġ-> Ġvisit ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOperation Expression Desc Ġ-> Ġvisit ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠField Access Expression Desc Ġ-> Ġvisit ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInc Dec Expression Desc Ġ-> Ġvisit ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExp Parent hesis Dest Ġ-> Ġvisit ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" -> ${ expression :: class . java . name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( expression : ĠOperation Expression Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit ( expression . left ) ĊĠĠĠĠĠĠĠ Ġvisit ( expression . right ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( expression : ĠField Access Expression Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression . from ?. let Ġ{ Ġvisit ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( statement : ĠAssign Statement Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit ( statement . field ) ĊĠĠĠĠĠĠĠ Ġvisit ( statement . exp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( statement : ĠWhile Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit ( statement . condition ) ĊĠĠĠĠĠĠĠ Ġvisit ( statement . statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( statement : ĠStatement Expr Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit ( statement . exp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( statement : ĠIf Statement Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit ( statement . condition ) ĊĠĠĠĠĠĠĠ Ġvisit ( statement . then Block ) ĊĠĠĠĠĠĠĠ Ġstatement . else Block ?. let Ġ{ Ġvisit ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( module : ĠSource Module ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodule . global Methods . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . statement Block ?. let Ġ{ Ġvisit ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit ( statement : ĠStatement Desc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStatement Block Desc Ġ-> Ġvisit ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReturn Statement Dest Ġ-> Ġvisit ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAssign Statement Desc Ġ-> Ġvisit ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠWhile Desc Ġ-> Ġvisit ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStatement Expr Desc Ġ-> Ġvisit ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIf Statement Desc Ġ-> Ġvisit ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" -> ${ statement :: class . java . name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }