package edu.ucsd.arcum.interpreter.satisfier;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
import org.eclipse.jdt.core.dom.ITypeBinding;
import edu.ucsd.arcum.interpreter.ast.FormalParameter;
import edu.ucsd.arcum.interpreter.fragments.Union;
import edu.ucsd.arcum.interpreter.parser.FragmentParser;
import edu.ucsd.arcum.interpreter.query.EntityTuple;
import edu.ucsd.arcum.interpreter.query.EntityType;
import edu.ucsd.arcum.interpreter.query.IEntityLookup;
public class CurrentBindingsLookup implements IEntityLookup
{
private final IEntityLookup base;
private final BindingMap bindingMap;
public CurrentBindingsLookup(IEntityLookup base, BindingMap bindingMap) {
this.base = base;
this.bindingMap = bindingMap;
}
public CurrentBindingsLookup(IEntityLookup base, EntityTuple entity) {
this.base = base;
this.bindingMap = new BindingMap(entity.getValues(), entity.getTypes());
}
@Override public Object lookupEntity(String reference) {
@Union("Entity") Object entity = bindingMap.lookupEntity(reference);
if (entity == null) {
entity = base.lookupEntity(reference);
}
return entity;
}
@Override public String lookupEntitiesID(Object entity) {
String id = bindingMap.lookupEntitiesID(entity);
if (id == null) {
id = base.lookupEntitiesID(entity);
}
return id;
}
@Override public BindingMap extractAsBindings() {
BindingMap theta = base.extractAsBindings();
// theta.addBindings(bindingMap); MACNEIL: replaced with consistentMerge
return theta.consistentMerge(bindingMap);
// return theta;
}
@Override public FormalParameter findResolvedSingleton(String variableName) {
return base.findResolvedSingleton(variableName);
}
@Override public FragmentParser newParser(boolean matchingMode) {
return base.newParser(matchingMode);
}
@Override public ITypeBinding lookupTypeBinding(ASTNode node) {
return base.lookupTypeBinding(node);
}
@Override public AbstractTypeDeclaration lookupTypeDeclaration(
ITypeBinding givenBinding)
{
return base.lookupTypeDeclaration(givenBinding);
}
@Override
public TypeLookupTable getTypeLookupTable() {
TypeLookupTable result = base.getTypeLookupTable();
Map<String, EntityType> types = bindingMap.getTypes();
for (Entry<String, EntityType> entry : types.entrySet()) {
result.addType(entry.getKey(), entry.getValue());
}
return result;
}
}