package husacct.analyse.task.analyse.csharp.generators;
import static husacct.analyse.task.analyse.csharp.generators.CSharpGeneratorToolkit.*;
import husacct.analyse.infrastructure.antlr.csharp.CSharpParser;
import husacct.common.enums.DependencySubTypes;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.Tree;
public class CSharpMethodGeneratorController extends CSharpGenerator {
String belongsToClass;
String name;
String uniqueName;
String accessControlQualifier;
String paramTypesInSignature = "";
String returnType = "";
boolean isConstructor = false;
boolean isAbstract = false;
boolean hasClassScope = false;
int lineNumber;
public void generateMethodToDomain(CommonTree methodTree, String currentUniqueClassName) {
/* Test helper
if (currentUniqueClassName.equals("Domain.Direct.Violating.CallConstructorSuper")){
// if (child.getLine() == 8) {
boolean breakpoint1 = true;
// }
} */
belongsToClass = currentUniqueClassName;
accessControlQualifier = getVisibility(methodTree);
lineNumber = methodTree.getLine();
checkMethodType(methodTree, belongsToClass);
walkThroughMethod(methodTree);
createMethodObject();
}
private void checkMethodType(CommonTree methodTree, String belongsToClass) {
switch (methodTree.getType()) {
case CSharpParser.CONSTRUCTOR_DECL:
name = getClassOfUniqueName(belongsToClass);
isConstructor = true;
break;
default:
getReturnType(methodTree);
name = getMethodName(methodTree);
break;
}
}
private String getClassOfUniqueName(String uniqueName) {
String[] parts = uniqueName.split("\\.");
return parts[parts.length - 1];
}
private void getReturnType(CommonTree methodTree) {
for (int i = 0; i < methodTree.getChildCount(); i++) {
if (methodTree.getChild(i).getType() == CSharpParser.TYPE) {
CommonTree typeTree = (CommonTree) methodTree.getChild(i);
CSharpInvocationGenerator csharpInvocationGenerator = new CSharpInvocationGenerator(this.belongsToClass);
String foundType = csharpInvocationGenerator.getCompleteToString(typeTree, belongsToClass, DependencySubTypes.DECL_RETURN_TYPE);
if ((foundType != null) && !foundType.equals("")) {
this.returnType = foundType;
}
}
}
}
private String getMethodName(CommonTree methodTree) {
CommonTree memberTree = (CommonTree) methodTree.getFirstChildWithType(CSharpParser.MEMBER_NAME);
Tree nameTree = memberTree.getFirstChildWithType(CSharpParser.NAMESPACE_OR_TYPE_NAME);
return nameTree.getChild(0).getText();
}
private void walkThroughMethod(CommonTree methodTree) {
for (int childCount = 0; childCount < methodTree.getChildCount(); childCount++) {
Tree child = methodTree.getChild(childCount);
switch (child.getType()) {
case CSharpParser.ABSTRACT:
isAbstract = true;
break;
case CSharpParser.STATIC:
hasClassScope = true;
break;
case CSharpParser.FORMAL_PARAMETER_LIST:
CSharpParameterGenerator csParameterGenerator = new CSharpParameterGenerator();
paramTypesInSignature = csParameterGenerator.generateParameterObjects((CommonTree) child, name, belongsToClass);
deleteTreeChild(child);
break;
case CSharpParser.BASE:
CSharpInvocationGenerator csharpInvocationGenerator = new CSharpInvocationGenerator(this.belongsToClass);
csharpInvocationGenerator.generateConstructorInvocToDomain((CommonTree) child, this.name);
break;
case CSharpParser.BLOCK:
CommonTree blockTree = (CommonTree) child;
stepIntoBlock(blockTree);
break;
default:
walkThroughMethod((CommonTree) child);
}
}
}
private void stepIntoBlock(CommonTree blockTree) {
String belongsToMethod = name + createArgumentString();
CSharpBlockScopeGenerator csBlockScopeGenerator = new CSharpBlockScopeGenerator();
csBlockScopeGenerator.walkThroughBlockScope(blockTree, belongsToClass, belongsToMethod);
}
private void createMethodObject() {
String argumentTypes = createArgumentString();
this.uniqueName = getMethodUniqueName(belongsToClass, name, argumentTypes);
if(SkippableTypes.isSkippable(returnType)){
modelService.createMethodOnly(name, uniqueName, accessControlQualifier, argumentTypes, returnType, belongsToClass, isConstructor, isAbstract, hasClassScope, lineNumber);
} else {
modelService.createMethod(name, uniqueName, accessControlQualifier, argumentTypes, returnType, belongsToClass, isConstructor, isAbstract, hasClassScope, lineNumber);
}
}
private String createArgumentString() {
return "(" + paramTypesInSignature + ")";
}
private String getMethodUniqueName(String belongsToClass, String name, String argumentTypes) {
return CSharpGeneratorToolkit.getUniqueName(belongsToClass, name) + argumentTypes;
}
}