package husacct.analyse.task.analyse.csharp.generators; import husacct.analyse.infrastructure.antlr.csharp.CSharpParser; import java.util.Stack; import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.Tree; public class CSharpNamespaceGenerator extends CSharpGenerator { private Stack<String> namespaceStack = new Stack<>(); public String generateModel(String rootParentNamespace, Tree namespaceTree) { String namespaceName = ""; Tree qualifiedIdentierTree = ((CommonTree)namespaceTree).getFirstChildWithType(CSharpParser.QUALIFIED_IDENTIFIER); if (qualifiedIdentierTree != null) { namespaceName = getQualifiedIdentifiers((CommonTree)qualifiedIdentierTree); if (rootParentNamespace.isEmpty()) { createPackageModelForEachNamespace(rootParentNamespace); } else { String uniqueName = CSharpGeneratorToolkit.getUniqueName(rootParentNamespace, namespaceName); modelService.createPackage(uniqueName, rootParentNamespace, namespaceName); } } return namespaceName; } private String getQualifiedIdentifiers(CommonTree tree) { String result = ""; if (tree.getType() == CSharpParser.QUALIFIED_IDENTIFIER) { for (int child = 0; child < tree.getChildCount(); child++) { result += "." + tree.getChild(child).getText(); namespaceStack.push(tree.getChild(child).getText()); } } if (result.length() > 0) { result = result.substring(1); // Remove first "." } return result; } private void createPackageModelForEachNamespace(String rootNamespace) { String namespaceName; String uniqueName; String parentNamespace; for (int i = namespaceStack.size(); i > 0; i--) { namespaceName = namespaceStack.peek(); uniqueName = CSharpGeneratorToolkit.getUniqueName(rootNamespace, CSharpGeneratorToolkit.getNameFromStack(namespaceStack)); namespaceStack.pop(); parentNamespace = CSharpGeneratorToolkit.getNameFromStack(namespaceStack); modelService.createPackage(uniqueName, parentNamespace, namespaceName); } } public String generateNo_Namespace(String sourcePathShort) { String uniqueName = "No_Namespace" + sourcePathShort; String parentNamespace = ""; String namespaceName = "No_Namespace__" + sourcePathShort; modelService.createPackage(uniqueName, parentNamespace, namespaceName); return uniqueName; } }