package org.overture.codegen.visitor; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.intf.lex.ILexNameToken; import org.overture.ast.modules.AAllImport; import org.overture.ast.modules.AFunctionValueImport; import org.overture.ast.modules.AOperationValueImport; import org.overture.ast.modules.ATypeImport; import org.overture.ast.modules.AValueValueImport; import org.overture.ast.modules.PImport; import org.overture.ast.modules.SValueImport; import org.overture.codegen.ir.IRInfo; import org.overture.codegen.ir.SDeclIR; import org.overture.codegen.ir.SImportIR; import org.overture.codegen.ir.STypeIR; import org.overture.codegen.ir.declarations.AAllImportIR; import org.overture.codegen.ir.declarations.AFunctionValueImportIR; import org.overture.codegen.ir.declarations.AOperationValueImportIR; import org.overture.codegen.ir.declarations.ATypeDeclIR; import org.overture.codegen.ir.declarations.ATypeImportIR; import org.overture.codegen.ir.declarations.AValueValueImportIR; import org.overture.codegen.ir.declarations.SValueImportIR; import org.overture.codegen.ir.name.ATokenNameIR; public class ImportVisitorIR extends AbstractVisitorIR<IRInfo, SImportIR> { @Override public SImportIR caseAAllImport(AAllImport node, IRInfo question) throws AnalysisException { return initImport(node, new AAllImportIR()); } @Override public SImportIR caseATypeImport(ATypeImport node, IRInfo question) throws AnalysisException { ATypeImportIR typeImportCg = new ATypeImportIR(); initImport(node, typeImportCg); SDeclIR typeDeclCg = node.getDef() != null ? node.getDef().apply(question.getDeclVisitor(), question) : null; if (typeDeclCg instanceof ATypeDeclIR) { typeImportCg.setDecl((ATypeDeclIR) typeDeclCg); } return typeImportCg; } @Override public SImportIR caseAValueValueImport(AValueValueImport node, IRInfo question) throws AnalysisException { return initValueImport(node, new AValueValueImportIR(), question); } @Override public SImportIR caseAFunctionValueImport(AFunctionValueImport node, IRInfo question) throws AnalysisException { AFunctionValueImportIR funcImportCg = new AFunctionValueImportIR(); initValueImport(node, funcImportCg, question); for (ILexNameToken typeParam : node.getTypeParams()) { ATokenNameIR nameCg = new ATokenNameIR(); nameCg.setName(typeParam.getName()); funcImportCg.getTypeParams().add(nameCg); } return funcImportCg; } @Override public SImportIR caseAOperationValueImport(AOperationValueImport node, IRInfo question) throws AnalysisException { return initValueImport(node, new AOperationValueImportIR(), question); } private SImportIR initValueImport(SValueImport vdmImport, SValueImportIR irImport, IRInfo question) throws AnalysisException { initImport(vdmImport, irImport); STypeIR importTypeCg = vdmImport.getImportType() != null ? vdmImport.getImportType().apply(question.getTypeVisitor(), question) : null; irImport.setImportType(importTypeCg); return irImport; } private SImportIR initImport(PImport vdmImport, SImportIR irImport) { String name = vdmImport.getName() != null ? vdmImport.getName().getName() : null; String renamed = vdmImport.getRenamed() != null ? vdmImport.getRenamed().getName() : null; String fromModuleName = vdmImport.getFrom() != null ? vdmImport.getFrom().getName().getName() : null; irImport.setName(name); irImport.setRenamed(renamed); irImport.setFromModuleName(fromModuleName); return irImport; } }