package org.rascalmpl.library.lang.java.m3.internal;
import java.util.Stack;
import org.rascalmpl.ast.Comprehension.Map;
import org.rascalmpl.value.IConstructor;
import org.rascalmpl.value.IList;
import org.rascalmpl.value.ISetWriter;
import org.rascalmpl.value.ISourceLocation;
import org.rascalmpl.value.IString;
import org.rascalmpl.value.IValue;
import org.rascalmpl.value.type.TypeFactory;
import org.rascalmpl.value.type.TypeStore;
public abstract class M3Converter extends JavaToRascalConverter {
private static final String DATATYPE_M3_NODE = "M3";
private final org.rascalmpl.value.type.Type DATATYPE_M3_NODE_TYPE;
private final org.rascalmpl.value.type.Type DATATYPE_TYPESYMBOL;
private static final org.rascalmpl.value.type.Type locType = TF.sourceLocationType();
private static final org.rascalmpl.value.type.Type m3TupleType = TF.tupleType(locType, locType);
private final org.rascalmpl.value.type.Type m3LOCModifierType;
private final org.rascalmpl.value.type.Type m3LOCTypeType;
protected final Stack<ISourceLocation> scopeManager = new Stack<ISourceLocation>();
protected ISetWriter uses;
protected ISetWriter declarations;
protected ISetWriter containment;
protected ISetWriter extendsRelations;
protected ISetWriter implementsRelations;
protected ISetWriter fieldAccess;
protected ISetWriter methodInvocation;
protected ISetWriter typeDependency;
protected ISetWriter documentation;
protected ISetWriter modifiers;
protected ISetWriter names;
protected ISetWriter methodOverrides;
protected ISetWriter types;
protected ISetWriter annotations;
protected final org.rascalmpl.value.type.Type CONSTRUCTOR_M3;
@SuppressWarnings("deprecation")
M3Converter(final TypeStore typeStore, java.util.Map<String, ISourceLocation> cache) {
super(typeStore, cache, true);
this.DATATYPE_M3_NODE_TYPE = this.typeStore.lookupAbstractDataType(DATATYPE_M3_NODE);
TypeFactory tf = TypeFactory.getInstance();
this.CONSTRUCTOR_M3= this.typeStore.lookupConstructor(DATATYPE_M3_NODE_TYPE, "m3", tf.tupleType(tf.sourceLocationType()));
this.DATATYPE_TYPESYMBOL = this.typeStore.lookupAbstractDataType("TypeSymbol");
uses = values.relationWriter(m3TupleType);
declarations = values.relationWriter(m3TupleType);
containment = values.relationWriter(m3TupleType);
extendsRelations = values.relationWriter(m3TupleType);
implementsRelations = values.relationWriter(m3TupleType);
fieldAccess = values.relationWriter(m3TupleType);
methodInvocation = values.relationWriter(m3TupleType);
m3LOCModifierType = TF.tupleType(locType, DATATYPE_RASCAL_AST_MODIFIER_NODE_TYPE);
modifiers = values.relationWriter(m3LOCModifierType);
m3LOCTypeType = TF.tupleType(locType, locType);
typeDependency = values.relationWriter(m3LOCTypeType);
documentation = values.relationWriter(m3TupleType);
names = values.relationWriter(TF.tupleType(TF.stringType(), locType));
methodOverrides = values.relationWriter(TF.tupleType(locType, locType));
annotations = values.relationWriter(TF.tupleType(locType, locType));
types = values.relationWriter(TF.tupleType(locType, DATATYPE_TYPESYMBOL));
}
public IValue getModel(boolean insertErrors) {
ownValue = values.constructor(CONSTRUCTOR_M3, loc);
setAnnotation("declarations", declarations.done());
setAnnotation("uses", uses.done());
setAnnotation("containment", containment.done());
setAnnotation("extends", extendsRelations.done());
setAnnotation("implements", implementsRelations.done());
setAnnotation("methodInvocation", methodInvocation.done());
setAnnotation("modifiers", modifiers.done());
setAnnotation("typeDependency", typeDependency.done());
setAnnotation("documentation", documentation.done());
setAnnotation("fieldAccess", fieldAccess.done());
setAnnotation("names", names.done());
setAnnotation("methodOverrides", methodOverrides.done());
setAnnotation("types", types.done());
setAnnotation("annotations", annotations.done());
insertCompilationUnitMessages(insertErrors, messages.done());
return ownValue;
}
public ISourceLocation getParent() {
return scopeManager.peek();
}
public void insert(ISetWriter relW, IValue lhs, IValue rhs) {
if ((isValid((ISourceLocation) lhs) && isValid((ISourceLocation) rhs))) {
relW.insert(values.tuple(lhs, rhs));
}
}
public void insert(ISetWriter relW, IValue lhs, IValueList rhs) {
for (IValue oneRHS: (IList)rhs.asList())
if (lhs.getType().isString() || (isValid((ISourceLocation) lhs) && isValid((ISourceLocation) oneRHS)))
insert(relW, lhs, oneRHS);
}
public void insert(ISetWriter relW, IString lhs, IValue rhs) {
if (isValid((ISourceLocation) rhs)) {
relW.insert(values.tuple(lhs, rhs));
}
}
public void insert(ISetWriter relW, IValue lhs, IConstructor rhs) {
if (isValid((ISourceLocation) lhs) && rhs != null) {
relW.insert(values.tuple(lhs, rhs));
}
}
protected boolean isValid(ISourceLocation binding) {
return binding != null && !(binding.getScheme().equals("unknown") || binding.getScheme().equals("unresolved"));
}
}