package org.overture.pog.visitors;
import java.util.LinkedList;
import java.util.List;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.analysis.AnswerAdaptor;
import org.overture.ast.node.INode;
import org.overture.ast.patterns.AIdentifierPattern;
import org.overture.ast.patterns.AIgnorePattern;
import org.overture.ast.patterns.ANamePatternPair;
import org.overture.ast.patterns.AObjectPattern;
import org.overture.ast.patterns.ARecordPattern;
import org.overture.ast.patterns.ATuplePattern;
import org.overture.ast.patterns.PPattern;
public class PatternAlwaysMatchesVisitor extends AnswerAdaptor<Boolean>
{
public PatternAlwaysMatchesVisitor()
{
}
private Boolean alwaysMatches(List<PPattern> plist)
throws AnalysisException
{
for (PPattern p : plist)
{
if (!p.apply(this))
{
return Boolean.FALSE;
}
}
return Boolean.TRUE;
}
@Override
public Boolean defaultPPattern(PPattern node) throws AnalysisException
{
return Boolean.FALSE; // Most patterns do not always match
}
/**
* First, literal patterns always match:
*
* @param node
* @return
* @throws AnalysisException
*/
@Override
public Boolean caseAIdentifierPattern(AIdentifierPattern node)
throws AnalysisException
{
return Boolean.TRUE;
}
@Override
public Boolean caseAIgnorePattern(AIgnorePattern node)
throws AnalysisException
{
return Boolean.TRUE;
}
/**
* Now, a couple of patterns involve recursive calls to AND their components.
*
* @param node
* @return
* @throws AnalysisException
*/
@Override
public Boolean caseARecordPattern(ARecordPattern node)
throws AnalysisException
{
return alwaysMatches(node.getPlist());
}
@Override
public Boolean caseATuplePattern(ATuplePattern node)
throws AnalysisException
{
return alwaysMatches(node.getPlist());
}
@Override
public Boolean caseAObjectPattern(AObjectPattern node)
throws AnalysisException
{
LinkedList<PPattern> list = new LinkedList<PPattern>();
for (ANamePatternPair npp: node.getFields())
{
list.add(npp.getPattern());
}
return alwaysMatches(list);
}
@Override
public Boolean createNewReturnValue(INode node)
{
assert false : "Should not happen";
return null;
}
@Override
public Boolean createNewReturnValue(Object node)
{
assert false : "Should not happen";
return null;
}
}