package husacct.analyse.task.analyse.csharp.generators; import husacct.analyse.task.analyse.csharp.generators.CSharpGeneratorToolkit; import husacct.analyse.infrastructure.antlr.csharp.CSharpParser; import husacct.common.enums.DependencySubTypes; import java.util.*; import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.Tree; public class CSharpParameterGenerator extends CSharpGenerator { private String belongsToMethod; //this includes the signature of the method (uniqueName) private String belongsToClass; private String declareName; private String declareType; private int lineNumber; private String uniqueName; private String paramTypesInSignature = ""; // Builds up to e.g. (String,int). Used to identify methods with the same name, but different parameters. private boolean nameFound = false; private boolean declareTypeFound = false; private ArrayList<ArrayList<Object>> parameterQueue; // The parameters need to be stored, until signature has been build up completely. //private final Logger logger = Logger.getLogger(CSharpParameterGenerator.class); public String generateParameterObjects(CommonTree allParametersTree, String belongsToMethod, String belongsToClass) { // allParametersTree = FORMAL_PARAMETER_LIST String returnvalue = ""; this.parameterQueue = new ArrayList<ArrayList<Object>>(); this.belongsToClass = belongsToClass; this.belongsToMethod = belongsToMethod; /* Test helper if (this.belongsToClass.contains("DeclarationParameter")){ //if (belongsToMethod.contains("performExternalScript")) { boolean breakpoint1 = true; //} } */ if (allParametersTree != null) { lineNumber = allParametersTree.getLine(); deriveParametersFromTree(allParametersTree); writeParametersToDomain(); returnvalue = paramTypesInSignature; } return returnvalue; } private void deriveParametersFromTree(Tree allParametersTree) { int totalParameters = allParametersTree.getChildCount(); for (int currentChild = 0; currentChild < totalParameters; currentChild++) { CommonTree child = (CommonTree) allParametersTree.getChild(currentChild); int treeType = child.getType(); if (treeType == CSharpParser.FIXED_PARAMETER) { getParameterName(child); getTypeOfParameter(child); if (this.nameFound && this.declareTypeFound) { this.addToQueue(); } nameFound = false; declareTypeFound = false; } deriveParametersFromTree(child); } } private void getParameterName(CommonTree tree) { Tree parameterNameTree = tree.getFirstChildWithType(CSharpParser.IDENTIFIER); if (parameterNameTree != null) { this.declareName = parameterNameTree.getText(); if ((this.declareName != null)&& (!this.declareName.trim().equals(""))) { this.nameFound = true; } } } private void getTypeOfParameter(CommonTree tree) { CommonTree typeOfParameterTree = CSharpGeneratorToolkit.getFirstDescendantWithType(tree, CSharpParser.TYPE); if (typeOfParameterTree != null) { CSharpInvocationGenerator cSharpInvocationGenerator = new CSharpInvocationGenerator(this.belongsToClass); this.declareType = cSharpInvocationGenerator.getCompleteToString(typeOfParameterTree, belongsToClass, DependencySubTypes.DECL_PARAMETER); this.lineNumber = typeOfParameterTree.getLine(); if (this.declareType.endsWith(".")) { this.declareType = this.declareType.substring(0, this.declareType.length() - 1); //deleting the last point } if(!this.declareType.trim().equals("")) { this.declareTypeFound = true; this.paramTypesInSignature += !this.paramTypesInSignature.equals("") ? "," : ""; this.paramTypesInSignature += this.declareType; } } } private void addToQueue() { ArrayList<Object> myParam = new ArrayList<Object>(); myParam.add(this.declareType); myParam.add(this.declareName); myParam.add(this.lineNumber); parameterQueue.add(myParam); this.declareType = null; this.declareName = null; } private void writeParametersToDomain() { for (ArrayList<Object> currentParameter : parameterQueue) { String type = (String) currentParameter.get(0); String name = (String) currentParameter.get(1); int lineNr = (int) currentParameter.get(2); this.uniqueName = this.belongsToClass + "." + this.belongsToMethod + "(" + this.paramTypesInSignature + ")." + name; String belongsToMethodToPassThrough = this.belongsToClass + "." + this.belongsToMethod + "(" + this.paramTypesInSignature + ")"; if (SkippableTypes.isSkippable(type)) { modelService.createParameterOnly(name, uniqueName, type, belongsToClass, lineNr, belongsToMethodToPassThrough); } else { modelService.createParameter(name, uniqueName, type, belongsToClass, lineNr, belongsToMethodToPassThrough); } } } }