/* Soot - a J*va Optimization Framework * Copyright (C) 2003 Jerome Miecznikowski * Copyright (C) 2005 Nomair A. Naeem * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ package soot.dava.internal.AST; import soot.*; import java.util.*; import soot.jimple.*; import soot.dava.internal.SET.*; import soot.dava.toolkits.base.AST.*; import soot.dava.toolkits.base.AST.analysis.*; public class ASTSwitchNode extends ASTLabeledNode { private ValueBox keyBox; private List<Object> indexList; private Map<Object, List<Object>> index2BodyList; public ASTSwitchNode( SETNodeLabel label, Value key, List<Object> indexList, Map<Object, List<Object>> index2BodyList) { super( label); this.keyBox = Jimple.v().newRValueBox( key ); this.indexList = indexList; this.index2BodyList = index2BodyList; Iterator<Object> it = indexList.iterator(); while (it.hasNext()) { List body = index2BodyList.get( it.next()); if (body != null) subBodies.add( body); } } /* Nomair A. Naeem 22-FEB-2005 Added for ASTCleaner */ public List<Object> getIndexList(){ return indexList; } public Map<Object, List<Object>> getIndex2BodyList(){ return index2BodyList; } public void replaceIndex2BodyList(Map<Object, List<Object>> index2BodyList){ this.index2BodyList=index2BodyList; subBodies = new ArrayList<Object>(); Iterator<Object> it = indexList.iterator(); while (it.hasNext()) { List body = index2BodyList.get( it.next()); if (body != null) subBodies.add( body); } } public ValueBox getKeyBox(){ return keyBox; } public Value get_Key() { return keyBox.getValue(); } public void set_Key(Value key){ this.keyBox = Jimple.v().newRValueBox( key ); } public Object clone() { return new ASTSwitchNode( get_Label(), get_Key(), indexList, index2BodyList); } public void perform_Analysis( ASTAnalysis a) { ASTWalker.v().walk_value( a, get_Key()); if (a instanceof TryContentsFinder) { TryContentsFinder.v().add_ExceptionSet( this, TryContentsFinder.v().remove_CurExceptionSet()); } perform_AnalysisOnSubBodies( a); } public void toString( UnitPrinter up ) { label_toString( up ); up.literal( "switch" ); up.literal( " " ); up.literal( "(" ); keyBox.toString( up ); up.literal( ")" ); up.newline(); up.literal( "{" ); up.newline(); Iterator<Object> it = indexList.iterator(); while (it.hasNext()) { Object index = it.next(); up.incIndent(); if (index instanceof String) up.literal( "default" ); else { up.literal( "case" ); up.literal( " " ); up.literal( index.toString() ); } up.literal( ":" ); up.newline(); List<Object> subBody = index2BodyList.get( index); if (subBody != null) { up.incIndent(); body_toString( up, subBody ); if (it.hasNext()) up.newline(); up.decIndent(); } up.decIndent(); } up.literal( "}"); up.newline(); } public String toString() { StringBuffer b = new StringBuffer(); b.append( label_toString( )); b.append( "switch ("); b.append( get_Key() ); b.append( ")"); b.append( NEWLINE); b.append( "{"); b.append( NEWLINE); Iterator<Object> it = indexList.iterator(); while (it.hasNext()) { Object index = it.next(); b.append( TAB); if (index instanceof String) b.append( "default"); else { b.append( "case "); b.append( ((Integer) index).toString()); } b.append( ":"); b.append( NEWLINE); List<Object> subBody = index2BodyList.get( index); if (subBody != null) { b.append( body_toString(subBody)); if (it.hasNext()) b.append( NEWLINE); } } b.append( "}"); b.append( NEWLINE); return b.toString(); } /* Nomair A. Naeem, 7-FEB-05 Part of Visitor Design Implementation for AST See: soot.dava.toolkits.base.AST.analysis For details */ public void apply(Analysis a){ a.caseASTSwitchNode(this); } }