package org.overture.codegen.visitor;
import java.util.LinkedList;
import java.util.List;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.definitions.PDefinition;
import org.overture.ast.intf.lex.ILexNameToken;
import org.overture.ast.modules.AAllExport;
import org.overture.ast.modules.AFunctionExport;
import org.overture.ast.modules.AOperationExport;
import org.overture.ast.modules.ATypeExport;
import org.overture.ast.modules.AValueExport;
import org.overture.ast.modules.PExport;
import org.overture.ast.types.PType;
import org.overture.codegen.ir.IRInfo;
import org.overture.codegen.ir.SDeclIR;
import org.overture.codegen.ir.SExportIR;
import org.overture.codegen.ir.STypeIR;
import org.overture.codegen.ir.declarations.AAllExportIR;
import org.overture.codegen.ir.declarations.AFunctionExportIR;
import org.overture.codegen.ir.declarations.AOperationExportIR;
import org.overture.codegen.ir.declarations.ATypeExportIR;
import org.overture.codegen.ir.declarations.AValueExportIR;
import org.overture.codegen.ir.name.ATokenNameIR;
public class ExportVisitorIR extends AbstractVisitorIR<IRInfo, SExportIR>
{
@Override
public SExportIR caseAAllExport(AAllExport node, IRInfo question)
throws AnalysisException
{
return addDecl(node, new AAllExportIR(), question);
}
@Override
public SExportIR caseAFunctionExport(AFunctionExport node, IRInfo question)
throws AnalysisException
{
AFunctionExportIR funcExportCg = new AFunctionExportIR();
funcExportCg.setNameList(consNames(node.getNameList()));
funcExportCg.setExportType(consExportType(node.getExportType(), question));
return addDecl(node, funcExportCg, question);
}
@Override
public SExportIR caseAOperationExport(AOperationExport node,
IRInfo question) throws AnalysisException
{
AOperationExportIR opExportCg = new AOperationExportIR();
opExportCg.setNameList(consNames(node.getNameList()));
opExportCg.setExportType(consExportType(node.getExportType(), question));
return addDecl(node, opExportCg, question);
}
@Override
public SExportIR caseATypeExport(ATypeExport node, IRInfo question)
throws AnalysisException
{
ATypeExportIR typeExportCg = new ATypeExportIR();
typeExportCg.setName(node.getName() != null ? node.getName().getName()
: null);
typeExportCg.setStruct(node.getStruct());
return addDecl(node, typeExportCg, question);
}
@Override
public SExportIR caseAValueExport(AValueExport node, IRInfo question)
throws AnalysisException
{
AValueExportIR valueExportCg = new AValueExportIR();
valueExportCg.setNameList(consNames(node.getNameList()));
valueExportCg.setExportType(consExportType(node.getExportType(), question));
return addDecl(node, valueExportCg, question);
}
private STypeIR consExportType(PType type, IRInfo question)
throws AnalysisException
{
if (type != null)
{
return type.apply(question.getTypeVisitor(), question);
} else
{
return null;
}
}
private List<ATokenNameIR> consNames(List<ILexNameToken> vdmNames)
{
List<ATokenNameIR> namesCg = new LinkedList<ATokenNameIR>();
for (ILexNameToken vdmName : vdmNames)
{
ATokenNameIR nextNameCg = new ATokenNameIR();
nextNameCg.setName(vdmName.getName());
namesCg.add(nextNameCg);
}
return namesCg;
}
private SExportIR addDecl(PExport vdmImport, SExportIR irImport,
IRInfo question) throws AnalysisException
{
for (PDefinition defItem : vdmImport.getDefinition())
{
SDeclIR declItemCg = defItem.apply(question.getDeclVisitor(), question);
if (declItemCg != null)
{
irImport.getDecl().add(declItemCg);
} else
{
return null;
}
}
return irImport;
}
}