/*
* #%~
* VDM Code Generator
* %%
* Copyright (C) 2008 - 2014 Overture
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #~%
*/
package org.overture.codegen.ir;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.overture.ast.definitions.PDefinition;
import org.overture.ast.node.INode;
import org.overture.ast.statements.AIdentifierStateDesignator;
import org.overture.codegen.assistant.AssistantManager;
import org.overture.codegen.assistant.BindAssistantIR;
import org.overture.codegen.assistant.DeclAssistantIR;
import org.overture.codegen.assistant.ExpAssistantIR;
import org.overture.codegen.assistant.LocationAssistantIR;
import org.overture.codegen.assistant.NodeAssistantIR;
import org.overture.codegen.assistant.PatternAssistantIR;
import org.overture.codegen.assistant.StmAssistantIR;
import org.overture.codegen.assistant.TypeAssistantIR;
import org.overture.codegen.ir.declarations.AModuleDeclIR;
import org.overture.codegen.ir.declarations.SClassDeclIR;
import org.overture.codegen.ir.expressions.SVarExpIR;
import org.overture.codegen.visitor.IRVisitor;
import org.overture.codegen.visitor.VisitorManager;
import org.overture.typechecker.assistant.TypeCheckerAssistantFactory;
public class IRInfo
{
// Visitors
private VisitorManager visitorManager;
// Assistants
private AssistantManager assistantManager;
// VDM assistant factory
private TypeCheckerAssistantFactory tcFactory;
// Quotes:
private List<String> quoteVaues;
// Unsupported VDM nodes
private Set<VdmNodeInfo> unsupportedNodes;
// Transformation warnings
private Set<IrNodeInfo> transformationWarnings;
// For generating variable names
private ITempVarGen tempVarNameGen;
// For configuring code generation
private IRSettings settings;
// Definitions for identifier state designators
private Map<AIdentifierStateDesignator, PDefinition> idStateDesignatorDefs;
// IR classes
private List<SClassDeclIR> classes;
// IR modules
private List<AModuleDeclIR> modules;
// SL state reads
private List<SVarExpIR> slStateReads;
// Names of classes that are instantiated
private Set<String> instantiatedClasses;
private Logger log = Logger.getLogger(this.getClass().getName());
public IRInfo()
{
super();
this.visitorManager = new VisitorManager();
this.assistantManager = new AssistantManager();
this.tcFactory = new TypeCheckerAssistantFactory();
this.quoteVaues = new LinkedList<String>();
this.unsupportedNodes = new HashSet<VdmNodeInfo>();
this.transformationWarnings = new HashSet<IrNodeInfo>();
this.tempVarNameGen = new TempVarNameGen();
this.settings = new IRSettings();
this.idStateDesignatorDefs = new HashMap<AIdentifierStateDesignator, PDefinition>();
this.classes = new LinkedList<SClassDeclIR>();
this.modules = new LinkedList<AModuleDeclIR>();
this.slStateReads = new LinkedList<>();
this.instantiatedClasses = new HashSet<>();
}
public AssistantManager getAssistantManager()
{
return assistantManager;
}
public IRVisitor<SClassDeclIR> getClassVisitor()
{
return visitorManager.getClassVisitor();
}
public IRVisitor<AModuleDeclIR> getModuleVisitor()
{
return visitorManager.getModuleVisitor();
}
public IRVisitor<SImportsIR> getImportsVisitor()
{
return visitorManager.getImportsVisitor();
}
public IRVisitor<SImportIR> getImportVisitor()
{
return visitorManager.getImportVisitor();
}
public IRVisitor<SExportsIR> getExportsVisitor()
{
return visitorManager.getExportsVisitor();
}
public IRVisitor<SExportIR> getExportVisitor()
{
return visitorManager.getExportVisitor();
}
public IRVisitor<SDeclIR> getDeclVisitor()
{
return visitorManager.getDeclVisitor();
}
public IRVisitor<SExpIR> getExpVisitor()
{
return visitorManager.getExpVisitor();
}
public IRVisitor<STypeIR> getTypeVisitor()
{
return visitorManager.getTypeVisitor();
}
public IRVisitor<SStmIR> getStmVisitor()
{
return visitorManager.getStmVisitor();
}
public IRVisitor<SStateDesignatorIR> getStateDesignatorVisitor()
{
return visitorManager.getStateDesignatorVisitor();
}
public IRVisitor<SObjectDesignatorIR> getObjectDesignatorVisitor()
{
return visitorManager.getObjectDesignatorVisitor();
}
public IRVisitor<SMultipleBindIR> getMultipleBindVisitor()
{
return visitorManager.getMultipleBindVisitor();
}
public IRVisitor<SBindIR> getBindVisitor()
{
return visitorManager.getBindVisitor();
}
public IRVisitor<SPatternIR> getPatternVisitor()
{
return visitorManager.getPatternVisitor();
}
public IRVisitor<SModifierIR> getModifierVisitor()
{
return visitorManager.getModifierVisitor();
}
public IRVisitor<STermIR> getTermVisitor()
{
return visitorManager.getTermVisitor();
}
public IRVisitor<STraceDeclIR> getTraceDeclVisitor()
{
return visitorManager.getTraceDeclVisitor();
}
public IRVisitor<STraceCoreDeclIR> getTraceCoreDeclVisitor()
{
return visitorManager.getTraceCoreDeclVisitor();
}
public NodeAssistantIR getNodeAssistant()
{
return assistantManager.getNodeAssistant();
}
public ExpAssistantIR getExpAssistant()
{
return assistantManager.getExpAssistant();
}
public DeclAssistantIR getDeclAssistant()
{
return assistantManager.getDeclAssistant();
}
public StmAssistantIR getStmAssistant()
{
return assistantManager.getStmAssistant();
}
public TypeAssistantIR getTypeAssistant()
{
return assistantManager.getTypeAssistant();
}
public LocationAssistantIR getLocationAssistant()
{
return assistantManager.getLocationAssistant();
}
public BindAssistantIR getBindAssistant()
{
return assistantManager.getBindAssistant();
}
public PatternAssistantIR getPatternAssistant()
{
return assistantManager.getPatternAssistant();
}
public void registerQuoteValue(String value)
{
// Illegal quote types are used internally so ignore it.
if ("?".equals(value))
{
return;
}
if (value == null || value.isEmpty())
{
log.error("Tried to register invalid qoute value");
} else
{
if (!quoteVaues.contains(value))
{
quoteVaues.add(value);
}
}
}
public TypeCheckerAssistantFactory getTcFactory()
{
return tcFactory;
}
public List<String> getQuoteValues()
{
return quoteVaues;
}
public void clearNodes()
{
unsupportedNodes.clear();
}
public void addUnsupportedNode(INode node, String reason)
{
for (VdmNodeInfo info : unsupportedNodes)
{
if (VdmNodeInfo.matches(info, node, reason))
{
return;
}
}
VdmNodeInfo info = new VdmNodeInfo(node, reason);
unsupportedNodes.add(info);
}
public Set<VdmNodeInfo> getUnsupportedNodes()
{
return unsupportedNodes;
}
public void clearTransformationWarnings()
{
transformationWarnings.clear();
}
public void addTransformationWarning(org.overture.codegen.ir.INode node,
String warning)
{
IrNodeInfo info = new IrNodeInfo(node, warning);
transformationWarnings.add(info);
}
public Set<IrNodeInfo> getTransformationWarnings()
{
return transformationWarnings;
}
public ITempVarGen getTempVarNameGen()
{
return tempVarNameGen;
}
public void clear()
{
quoteVaues.clear();
unsupportedNodes.clear();
transformationWarnings.clear();
tempVarNameGen.clear();
idStateDesignatorDefs.clear();
classes.clear();
modules.clear();
}
public IRSettings getSettings()
{
return settings;
}
public void setSettings(IRSettings settings)
{
this.settings = settings;
}
public Map<AIdentifierStateDesignator, PDefinition> getIdStateDesignatorDefs()
{
return idStateDesignatorDefs;
}
public void setIdStateDesignatorDefs(
Map<AIdentifierStateDesignator, PDefinition> idDefs)
{
this.idStateDesignatorDefs = idDefs;
}
public List<SClassDeclIR> getClasses()
{
return classes;
}
public void addClass(SClassDeclIR irClass)
{
if (this.classes != null)
{
this.classes.add(irClass);
}
}
public void removeClass(String name)
{
SClassDeclIR classToRemove = null;
for (SClassDeclIR clazz : classes)
{
if (clazz.getName().equals(name))
{
classToRemove = clazz;
break;
}
}
if (classToRemove != null)
{
classes.remove(classToRemove);
}
}
public void clearClasses()
{
if (this.classes != null)
{
this.classes.clear();
}
}
public List<AModuleDeclIR> getModules()
{
return modules;
}
public void addModule(AModuleDeclIR irModule)
{
if (this.modules != null)
{
this.modules.add(irModule);
}
}
public void removeModule(String name)
{
AModuleDeclIR moduleToRemove = null;
for (AModuleDeclIR module : modules)
{
if (module.getName().equals(name))
{
moduleToRemove = module;
break;
}
}
if (moduleToRemove != null)
{
modules.remove(moduleToRemove);
}
}
public void clearModules()
{
if (this.modules != null)
{
this.modules.clear();
}
}
public void registerSlStateRead(SVarExpIR var)
{
this.slStateReads.add(var);
}
public boolean isSlStateRead(SVarExpIR var)
{
for (SVarExpIR v : slStateReads)
{
if (v == var)
{
return true;
}
}
return false;
}
public Set<String> getInstantiatedClasses()
{
return instantiatedClasses;
}
}