package org.overture.codegen.visitor; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.definitions.PDefinition; import org.overture.ast.modules.AModuleExports; import org.overture.ast.modules.AModuleImports; import org.overture.ast.modules.AModuleModules; import org.overture.codegen.ir.IRInfo; import org.overture.codegen.ir.SDeclIR; import org.overture.codegen.ir.SExportsIR; import org.overture.codegen.ir.SImportsIR; import org.overture.codegen.ir.declarations.AFieldDeclIR; import org.overture.codegen.ir.declarations.AFuncDeclIR; import org.overture.codegen.ir.declarations.AMethodDeclIR; import org.overture.codegen.ir.declarations.AModuleDeclIR; import org.overture.codegen.ir.declarations.AModuleExportsIR; import org.overture.codegen.ir.declarations.AModuleImportsIR; import org.overture.codegen.ir.declarations.ANamedTraceDeclIR; import org.overture.codegen.ir.declarations.AStateDeclIR; import org.overture.codegen.ir.declarations.ATypeDeclIR; public class ModuleVisitorIR extends AbstractVisitorIR<IRInfo, AModuleDeclIR> { @Override public AModuleDeclIR caseAModuleModules(AModuleModules node, IRInfo question) throws AnalysisException { String name = node.getName().getName(); AModuleImports imports = node.getImports(); AModuleExports exports = node.getExports(); Boolean isDlModule = node.getIsDLModule(); Boolean isFlat = node.getIsFlat(); AModuleDeclIR moduleCg = new AModuleDeclIR(); moduleCg.setName(name); if (imports != null) { SImportsIR importsCg = imports.apply(question.getImportsVisitor(), question); if (importsCg instanceof AModuleImportsIR) { moduleCg.setImport((AModuleImportsIR) importsCg); } else { log.error("Expected imports to be of type '" + AModuleImportsIR.class.getSimpleName() + "'. Got: " + importsCg); } } if (exports != null) { SExportsIR exportsCg = exports.apply(question.getExportsVisitor(), question); if (exportsCg instanceof AModuleExportsIR) { moduleCg.setExports((AModuleExportsIR) exportsCg); } else { log.error("Expected export to be of type '" + AModuleExportsIR.class.getSimpleName() + "'. Got: " + exportsCg); } } moduleCg.setIsDLModule(isDlModule); moduleCg.setIsFlat(isFlat); for (PDefinition def : node.getDefs()) { SDeclIR declCg = def.apply(question.getDeclVisitor(), question); if (declCg == null) { // Unspported stuff returns null by default continue; } else if (declCg instanceof AMethodDeclIR || declCg instanceof AFuncDeclIR || declCg instanceof ATypeDeclIR || declCg instanceof AStateDeclIR || declCg instanceof ANamedTraceDeclIR || declCg instanceof AFieldDeclIR) { moduleCg.getDecls().add(declCg); } else { log.error("Unexpected definition in module: " + def); } } question.addModule(moduleCg); return moduleCg; } }