public void caseAFile(AFile node) { inAFile(node); { Object temp[] = node.getModifier().toArray(); for (int i = 0; i < temp.length; i++) { ((PModifier) temp[i]).apply(this); } } if (node.getFileType() != null) { node.getFileType().apply(this); } if (node.getClassName() != null) { node.getClassName().apply(this); } String className = (String) mProductions.removeLast(); if (mSootClass == null) { mSootClass = new SootClass(className); mSootClass.setResolvingLevel(SootClass.BODIES); } else { if (!mSootClass.getName().equals(className)) throw new RuntimeException( "Invalid SootClass for this JimpleAST. The SootClass provided is of type: >" + mSootClass.getName() + "< whereas this parse tree is for type: >" + className + "<"); } if (node.getExtendsClause() != null) { node.getExtendsClause().apply(this); } if (node.getImplementsClause() != null) { node.getImplementsClause().apply(this); } if (node.getFileBody() != null) { node.getFileBody().apply(this); } outAFile(node); }
/* member = {field} modifier* type name semicolon | {method} modifier* type name l_paren parameter_list? r_paren throws_clause? method_body; */ public void outAFieldMember(AFieldMember node) { int modifier = 0; Type type = null; String name = null; name = (String) mProductions.removeLast(); type = (Type) mProductions.removeLast(); modifier = processModifiers(node.getModifier()); SootField f = new SootField(name, type, modifier); mSootClass.addField(f); }
public void outAFile(AFile node) { // not not pop members; they have been taken care of. List implementsList = null; String superClass = null; String classType = null; if (node.getImplementsClause() != null) { implementsList = (List) mProductions.removeLast(); } if (node.getExtendsClause() != null) { superClass = (String) mProductions.removeLast(); } classType = (String) mProductions.removeLast(); int modifierCount = node.getModifier().size(); int modifierFlags = processModifiers(node.getModifier()); if (classType.equals("interface")) modifierFlags |= Modifier.INTERFACE; mSootClass.setModifiers(modifierFlags); if (superClass != null) { mSootClass.setSuperclass(mResolver.makeClassRef(superClass)); } if (implementsList != null) { Iterator implIt = implementsList.iterator(); while (implIt.hasNext()) { SootClass interfaceClass = mResolver.makeClassRef((String) implIt.next()); mSootClass.addInterface(interfaceClass); } } mProductions.addLast(mSootClass); }
public void outAMethodMember(AMethodMember node) { int modifier = 0; Type type; String name; List parameterList = null; List throwsClause = null; JimpleBody methodBody = null; if (node.getMethodBody() instanceof AFullMethodBody) methodBody = (JimpleBody) mProductions.removeLast(); if (node.getThrowsClause() != null) throwsClause = (List) mProductions.removeLast(); if (node.getParameterList() != null) { parameterList = (List) mProductions.removeLast(); } else { parameterList = new ArrayList(); } Object o = mProductions.removeLast(); name = (String) o; type = (Type) mProductions.removeLast(); modifier = processModifiers(node.getModifier()); SootMethod method; if (throwsClause != null) method = new SootMethod(name, parameterList, type, modifier, throwsClause); else method = new SootMethod(name, parameterList, type, modifier); mSootClass.addMethod(method); if (method.isConcrete()) { methodBody.setMethod(method); method.setActiveBody(methodBody); } else if (node.getMethodBody() instanceof AFullMethodBody) throw new RuntimeException("Impossible: !concrete => ! instanceof"); }