/* * This file is part of the OpenJML project. * Author: David R. Cok */ package org.jmlspecs.openjml; // FIXME - not ready for use - review and fix import java.util.ArrayList; import java.util.Iterator; import org.jmlspecs.openjml.JmlTree.*; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.TreeTranslator; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; /** This class translates a parse tree in-place, extending * TreeTranslator to include JML nodes. However, it adds to * TreeTranslator the ability to make a deep copy of the input * tree along with translating. * * @author David R. Cok */ public class JmlTreeTranslator extends TreeTranslator implements IJmlVisitor { // FIXME - TreeTranslator uses some specialized translate routines, e.g. // translateTypeParams, trnaslateVarDefs - find others and make sure that // Jml methods below use them as appropriate // FIXME - the copy functionality is barely started - perhaps it should be left to // JmlTreeCopier - or perhaps JmlTreeCopier should be combined into here to make one // less maintenance problem protected boolean copy = false; public JmlTreeTranslator() { } public <T extends JCTree> ListBuffer<T> translate(ListBuffer<T> trees) { if (trees == null) return null; // if (!copy) { // for (List<T> l = trees.elems; l.nonEmpty(); l = l.tail) // l.head = translate(l.head); // return trees; // } else { ListBuffer<T> newlist = new ListBuffer<T>(); Iterator<T> iter = trees.iterator(); while (iter.hasNext()) newlist.append(translate(iter.next())); return newlist; // } } public <T extends JCTree> java.util.List<T> translate(java.util.List<T> trees) { if (trees == null) return null; java.util.List<T> newlist = new ArrayList<T>(trees.size()); for (T t : trees) newlist.add(translate(t)); return newlist; } //@ ensures \typeof(result) <: \type(JmlBinary); @Override public void visitJmlBinary(JmlBinary that) { JmlBinary r = copy ? new JmlBinary(that) : that; r.lhs = translate(that.lhs); r.rhs = translate(that.rhs); // Not translating: op, opcode, operator result = r; } @Override public void visitJmlBlock(JmlBlock that) { that.stats = translate(that.stats); that.cases = translate(that.cases); result = that; } @Override public void visitJmlChoose(JmlChoose that) { JmlChoose r = that; r.orBlocks = translate(that.orBlocks); r.elseBlock = translate(that.elseBlock); // Not translating: token result = r; } @Override public void visitJmlClassDecl(JmlClassDecl that) { visitClassDef(that); JmlClassDecl r = (JmlClassDecl)result; r.docComment = that.docComment; r.toplevel = that.toplevel; // FIXME - need to adjust reference r.typeSpecs = that.typeSpecs; if (that.typeSpecs != null) { JmlSpecs.TypeSpecs rt = r.typeSpecs;// = new JmlSpecs.TypeSpecs(); JmlSpecs.TypeSpecs tt = that.typeSpecs; // rt.blocks = (tt.blocks); // rt.checkInvariantDecl = (tt.checkInvariantDecl); // rt.checkStaticInvariantDecl = (tt.checkStaticInvariantDecl); // rt.clauses = translate(tt.clauses); // } // specsDecls, typeSpecs, env - FIXME // Not translating: FIXME } @Override public void visitJmlCompilationUnit(JmlCompilationUnit that) { visitTopLevel(that); JmlCompilationUnit r = (JmlCompilationUnit)result; // r.parsedTopLevelModelTypes = translate(that.parsedTopLevelModelTypes); //r.specsSequence //r.specsTopLevelModelTypes - FIXME // not translating: mode, FIXME result = r; } @Override public void visitJmlDoWhileLoop(JmlDoWhileLoop that) { visitDoLoop(that); JmlDoWhileLoop r = (JmlDoWhileLoop)result; r.loopSpecs = translate(that.loopSpecs); result = r; // Not translating: none } @Override public void visitJmlEnhancedForLoop(JmlEnhancedForLoop that) { visitForeachLoop(that); JmlEnhancedForLoop r = (JmlEnhancedForLoop)result; r.loopSpecs = translate(that.loopSpecs); result = r; // Not translating: none } @Override public void visitJmlForLoop(JmlForLoop that) { visitForLoop(that); JmlForLoop r = (JmlForLoop)result; r.loopSpecs = translate(that.loopSpecs); result = r; // Not translating: none } @Override public void visitJmlGroupName(JmlGroupName that) { JmlGroupName r = that; r.selection = translate(that.selection); result = r; // Not translating: sym } @Override public void visitJmlImport(JmlImport that) { visitImport(that); // not translating: isModel, staticImport } public void visitJmlLabeledStatement(JmlLabeledStatement that) { JmlLabeledStatement s = that; // that.extraStatements = // FIXME that.body = translate(that.body); } @Override public void visitJmlLblExpression(JmlLblExpression that) { JmlLblExpression r = that; r.expression = translate(that.expression); result = r; // Not translating: token, label } @Override public void visitJmlMethodClauseCallable(JmlMethodClauseCallable that) { JmlMethodClauseCallable r = that; r.keyword = translate(that.keyword); r.methodSignatures = translate(that.methodSignatures); result = r; } @Override public void visitJmlMethodClauseConditional(JmlMethodClauseConditional that) { JmlMethodClauseConditional r = that; r.expression = translate(that.expression); r.predicate = translate(that.predicate); result = r; // Not translating: token } @Override public void visitJmlMethodClauseDecl(JmlMethodClauseDecl that) { JmlMethodClauseDecl r = that; r.decls = translate(that.decls); result = r; // Not translating: token, sourcefile } @Override public void visitJmlMethodClauseExpr(JmlMethodClauseExpr that) { JmlMethodClauseExpr r = that; r.expression = translate(that.expression); result = r; // Not translating: token } @Override public void visitJmlMethodClauseGroup(JmlMethodClauseGroup that) { JmlMethodClauseGroup r = that; r.cases = translate(that.cases); result = r; // Not translating: token } @Override public void visitJmlMethodClauseSigOnly(JmlMethodClauseSignalsOnly that) { JmlMethodClauseSignalsOnly r = that; r.list = translate(that.list); result = r; // Not translating: token } @Override public void visitJmlMethodClauseSignals(JmlMethodClauseSignals that) { JmlMethodClauseSignals r = that; r.vardef = translate(that.vardef); r.expression = translate(that.expression); result = r; // Not translating: token } @Override public void visitJmlMethodClauseStoreRef(JmlMethodClauseStoreRef that) { JmlMethodClauseStoreRef r = that; r.list = translate(that.list); result = r; // Not translating: token } @Override public void visitJmlMethodDecl(JmlMethodDecl that) { visitMethodDef(that); JmlMethodDecl r = (JmlMethodDecl)result; r.defaultValue = translate(that.defaultValue); // Should be in visitMethodDef - TODO r.methodSpecsCombined = that.methodSpecsCombined; if (that.methodSpecsCombined != null) { //r.methodSpecsCombined = new JmlSpecs.MethodSpecs( r.methodSpecsCombined.mods = translate(that.methodSpecsCombined.mods); r.methodSpecsCombined.cases = translate(that.methodSpecsCombined.cases); } // FIXME - cases, methodSpecs, specsDecl, owner, docComment, _this result = r; // Not translating: name, sym, ??? FIXME } @Override public void visitJmlMethodInvocation(JmlMethodInvocation that) { visitApply(that); JmlMethodInvocation r = (JmlMethodInvocation)result; r.varargsElement = (that.varargsElement); // FIXME r.typeargs = translate(that.typeargs); // Should be in visitApply - TODO result = r; // Not translating: token, label } @Override public void visitJmlMethodSpecs(JmlMethodSpecs that) { // FIXME - decl, desugared JmlMethodSpecs r = that; r.cases = translate(that.cases); r.impliesThatCases = translate(that.impliesThatCases); r.forExampleCases = translate(that.forExampleCases); result = r; } @Override public void visitJmlPrimitiveTypeTree(JmlPrimitiveTypeTree that) { // nothing to translate result = that; // Not translating: token } @Override public void visitJmlQuantifiedExpr(JmlQuantifiedExpr that) { JmlQuantifiedExpr r = that; r.decls = translate(that.decls); r.range = translate(that.range); r.value = translate(that.value); r.racexpr = translate(that.racexpr); result = r; // Not translating: op } @Override public void visitJmlSetComprehension(JmlSetComprehension that) { JmlSetComprehension r = that; r.newtype = translate(that.newtype); r.variable = translate(that.variable); r.predicate = translate(that.predicate); result = r; // Not translating: none } @Override public void visitJmlSingleton(JmlSingleton that) { result = that; // Not translating: info, symbol, token, (pos, type) } @Override public void visitJmlSpecificationCase(JmlSpecificationCase that) { JmlSpecificationCase r = that; r.modifiers = translate(that.modifiers); r.clauses = translate(that.clauses); r.block = translate(that.block); result = r; // Not translating: token, also, code, sourcefile } @Override public void visitJmlStatement(JmlStatement that) { JmlStatement r = that; r.statement = translate(that.statement); result = r; // Not translating: token } @Override public void visitJmlStatementDecls(JmlStatementDecls that) { JmlStatementDecls r = that; r.list = translate(that.list); result = r; // Not translating: token } @Override public void visitJmlStatementExpr(JmlStatementExpr that) { JmlStatementExpr r = that; r.expression = translate(that.expression); r.optionalExpression = translate(that.optionalExpression); result = r; // Not translating: token, line, source, label, declPos - FIXME } @Override public void visitJmlStatementHavoc(JmlStatementHavoc that) { JmlStatementHavoc r = that; r.storerefs = translate(that.storerefs); result = r; } @Override public void visitJmlStatementLoop(JmlStatementLoop that) { JmlStatementLoop r = that; r.expression = translate(that.expression); result = r; // Not translating: token, line, source - FIXME } @Override public void visitJmlStatementSpec(JmlStatementSpec that) { JmlStatementSpec r = that; r.statementSpecs = translate(that.statementSpecs); result = r; // Not translating: none } @Override public void visitJmlStoreRefArrayRange(JmlStoreRefArrayRange that) { JmlStoreRefArrayRange r = that; r.expression = translate(that.expression); r.hi = translate(that.hi); r.lo = translate(that.lo); result = r; // Not translating: ( pos, type) } @Override public void visitJmlStoreRefKeyword(JmlStoreRefKeyword that) { // Not translating: token, ( pos, type ) result = that; } @Override public void visitJmlStoreRefListExpression(JmlStoreRefListExpression that) { JmlStoreRefListExpression r = that; r.list = translate(that.list); // Not translating pos, token, type result = r; } @Override public void visitJmlTypeClauseConditional(JmlTypeClauseConditional that) { JmlTypeClauseConditional r = that; r.modifiers = translate(that.modifiers); r.identifier = translate(that.identifier); r.expression = translate(that.expression); // Not translating: source, token, pos, type result = r; } @Override public void visitJmlTypeClauseConstraint(JmlTypeClauseConstraint that) { JmlTypeClauseConstraint r = that; r.modifiers = translate(that.modifiers); r.expression = translate(that.expression); r.sigs = translate(that.sigs); // Not translating: source, token, pos, type, notlist result = r; } @Override public void visitJmlTypeClauseDecl(JmlTypeClauseDecl that) { JmlTypeClauseDecl r = that; r.modifiers = translate(that.modifiers); r.decl = translate(that.decl); // No change to source, token, pos, type result = r; } @Override public void visitJmlTypeClauseExpr(JmlTypeClauseExpr that) { JmlTypeClauseExpr r = that; r.modifiers = translate(that.modifiers); r.expression = translate(that.expression); // No change to source, token, pos, type result = r; } @Override public void visitJmlTypeClauseIn(JmlTypeClauseIn that) { JmlTypeClauseIn r = that; // r.modifiers is a reference FIXME r.list = translate(that.list); result = r; // Not translating: source token } @Override public void visitJmlTypeClauseInitializer(JmlTypeClauseInitializer that) { JmlTypeClauseInitializer r = that; r.modifiers = translate(that.modifiers); r.specs = translate(that.specs); // Not translating pos, source, token, type result = r; } @Override public void visitJmlTypeClauseMaps(JmlTypeClauseMaps that) { JmlTypeClauseMaps r = that; r.modifiers = translate(that.modifiers); r.expression = translate(that.expression); r.list = translate(that.list); result = r; } @Override public void visitJmlTypeClauseMonitorsFor(JmlTypeClauseMonitorsFor that) { JmlTypeClauseMonitorsFor r = that; r.modifiers = translate(that.modifiers); r.identifier = translate(that.identifier); r.list = translate(that.list); // Not translating pos, source, token, type result = r; } @Override public void visitJmlTypeClauseRepresents(JmlTypeClauseRepresents that) { JmlTypeClauseRepresents r = that; r.modifiers = translate(that.modifiers); r.ident = translate(that.ident); r.expression = translate(that.expression); // Not translating pos, source, token, type, suchthat result = r; } @Override public void visitJmlVariableDecl(JmlVariableDecl that) { visitVarDef(that); JmlVariableDecl r = (JmlVariableDecl)result; if (that.fieldSpecsCombined == null) { r.fieldSpecsCombined = null; } else { // r.fieldSpecsCombined.mods = ??? FIXME // fieldSpecs??? r.fieldSpecsCombined.mods = that.fieldSpecsCombined.mods; r.fieldSpecsCombined.list = translate(that.fieldSpecsCombined.list); } // FIXME - specsDecl, fieldSpecs, mods result = r; // Not translating: sourcefile, docComment, name, sym } @Override public void visitJmlWhileLoop(JmlWhileLoop that) { visitWhileLoop(that); JmlWhileLoop r = (JmlWhileLoop)result; r.loopSpecs = translate(that.loopSpecs); result = r; // Not translating: none } public void visitJmlMethodSig(JmlMethodSig that) { JmlMethodSig r = that; r.argtypes = translate(that.argtypes); r.expression = translate(that.expression); result = r; // Not translating: none } public void visitJmlModelProgramStatement(JmlModelProgramStatement that) { JmlModelProgramStatement r = that; r.item = translate(that.item); result = r; } }