package org.overture.codegen.assistant;
import java.util.LinkedList;
import java.util.List;
import org.overture.codegen.ir.STypeIR;
import org.overture.codegen.ir.patterns.AIdentifierPatternIR;
import org.overture.codegen.ir.patterns.ATuplePatternIR;
import org.overture.codegen.ir.types.ATupleTypeIR;
import org.overture.codegen.ir.types.AUnionTypeIR;
public class PatternAssistantIR extends AssistantBase
{
public PatternAssistantIR(AssistantManager assistantManager)
{
super(assistantManager);
}
public AIdentifierPatternIR consIdPattern(String name)
{
AIdentifierPatternIR idPattern = new AIdentifierPatternIR();
idPattern.setName(name);
return idPattern;
}
public ATupleTypeIR getTupleType(AUnionTypeIR unionType,
ATuplePatternIR tuplePattern)
{
List<ATupleTypeIR> tupleTypes = new LinkedList<ATupleTypeIR>();
for (STypeIR nextType : unionType.getTypes())
{
if (nextType instanceof ATupleTypeIR)
{
ATupleTypeIR nextTupleType = (ATupleTypeIR) nextType;
if (nextTupleType.getTypes().size() == tuplePattern.getPatterns().size())
{
tupleTypes.add(nextTupleType);
}
}
}
ATupleTypeIR resTupleType = new ATupleTypeIR();
if (tupleTypes.size() == 1)
{
resTupleType = tupleTypes.get(0);
} else
{
for (int i = 0; i < tuplePattern.getPatterns().size(); i++)
{
AUnionTypeIR fieldType = new AUnionTypeIR();
for (ATupleTypeIR t : tupleTypes)
{
fieldType.getTypes().add(t.getTypes().get(i).clone());
}
resTupleType.getTypes().add(fieldType);
}
}
return resTupleType;
}
}