package husacct.analyse.task.analyse.csharp.generators.buffers;
import husacct.analyse.domain.IModelCreationService;
import husacct.analyse.domain.famix.FamixCreationServiceImpl;
import husacct.analyse.infrastructure.antlr.csharp.CSharpParser;
import org.antlr.runtime.tree.CommonTree;
import static husacct.analyse.task.analyse.csharp.generators.CSharpGeneratorToolkit.*;
import husacct.analyse.task.analyse.csharp.generators.CSharpParameterGenerator;
import husacct.analyse.task.analyse.csharp.generators.SkippableTypes;
public class DelegateBuffer {
protected IModelCreationService modelService = new FamixCreationServiceImpl();
public final String packageAndClassName;
public String returntype;
public String name;
public String paramTypesInSignature = "";
public DelegateBuffer(String packageAndClassName) {
this.packageAndClassName = packageAndClassName;
}
public DelegateBuffer store(CommonTree delegateTree) {
name = getName(delegateTree);
returntype = getReturnType(delegateTree);
paramTypesInSignature = handleParameters(delegateTree);
writeToFamix(delegateTree);
return this;
}
private String getName(CommonTree tree) {
return findHierarchicalSequenceOfTypes(tree, CSharpParser.IDENTIFIER).getText();
}
private String getReturnType(CommonTree tree) {
CommonTree typeTree = findHierarchicalSequenceOfTypes(tree, CSharpParser.TYPE);
if (typeTree != null) {
return getTypeNameAndParts(typeTree);
} else {
return "";
}
}
private String handleParameters(CommonTree tree) {
CommonTree paramTree = findHierarchicalSequenceOfTypes(tree, CSharpParser.FORMAL_PARAMETER_LIST);
CSharpParameterGenerator csParamGenerator = new CSharpParameterGenerator();
return csParamGenerator.generateParameterObjects(paramTree, name, packageAndClassName);
}
private void writeToFamix(CommonTree delegateTree) {
String accessControlQualifier = getVisibility(delegateTree);
String uniqueName = packageAndClassName + "." + name + "(" + paramTypesInSignature + ")";
boolean isConstructor = false;
boolean isAbstract = true;
boolean hasClassScope = true;
int lineNumber = delegateTree.getLine();
if(SkippableTypes.isSkippable(returntype)){
modelService.createMethodOnly(name, uniqueName, accessControlQualifier, paramTypesInSignature, returntype, packageAndClassName, isConstructor, isAbstract, hasClassScope, lineNumber);
} else {
modelService.createMethod(name, uniqueName, accessControlQualifier, paramTypesInSignature, returntype, packageAndClassName, isConstructor, isAbstract, hasClassScope, lineNumber);
}
}
}