use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class InterpreterTerms method refEntries.
private static ITerm refEntries(IScopeGraph<Scope, Label, Occurrence> scopeGraph) {
Map<ITerm, ITerm> entries = Maps.newHashMap();
for (Occurrence ref : scopeGraph.getAllRefs()) {
ITerm scope = scopeGraph.getRefs().get(ref).map(s -> B.newList(s)).orElse(B.newNil());
ITerm entry = B.newAppl("RE", scope);
entries.put(ref, entry);
}
return map(entries.entrySet());
}
use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class InterpreterTerms method nameresolution.
private static ITerm nameresolution(IEsopNameResolution<Scope, Label, Occurrence> nameResolution) {
nameResolution.resolveAll();
final Map<ITerm, ITerm> entries = Maps.newHashMap();
for (Map.Entry<Occurrence, Set<IResolutionPath<Scope, Label, Occurrence>>> entry : nameResolution.resolutionEntries()) {
final Occurrence ref = entry.getKey();
final Set<IResolutionPath<Scope, Label, Occurrence>> paths = entry.getValue();
if (paths.size() == 1) {
IResolutionPath<Scope, Label, Occurrence> path = Iterables.getOnlyElement(paths);
ITerm value = B.newTuple(path.getDeclaration(), Paths.toTerm(path));
entries.put(ref, value);
} else {
logger.warn("Can only convert a single path, but {} has {}.", ref, paths.size());
}
}
return map(entries.entrySet());
}
use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class InterpreterTerms method declEntries.
private static ITerm declEntries(IScopeGraph<Scope, Label, Occurrence> scopeGraph) {
Map<ITerm, ITerm> entries = Maps.newHashMap();
for (Occurrence decl : scopeGraph.getAllDecls()) {
ITerm scope = scopeGraph.getDecls().get(decl).map(s -> B.newList(s)).orElse(B.newNil());
ITerm assocs = multimap(scopeGraph.getExportEdges().get(decl));
ITerm entry = B.newAppl("DE", scope, assocs);
entries.put(decl, entry);
}
return map(entries.entrySet());
}
use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class InterpreterTerms method multimap.
private static IListTerm multimap(Iterable<? extends Map.Entry<? extends ITerm, ? extends ITerm>> entries) {
Multimap<ITerm, ITerm> grouped = HashMultimap.create();
for (Map.Entry<? extends ITerm, ? extends ITerm> entry : entries) {
grouped.put(entry.getKey(), entry.getValue());
}
List<ITerm> entryterms = Lists.newArrayList();
for (ITerm key : grouped.keySet()) {
entryterms.add(B.newTuple(key, B.newList(grouped.get(key))));
}
return B.newList(entryterms);
}
use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class Solution method findAndLock.
@Override
public ISolution findAndLock() {
final IProperties.Transient<TermIndex, ITerm, ITerm> astProperties = astProperties().melt();
astProperties.mapValues(unifier()::findRecursive);
final IProperties.Transient<Occurrence, ITerm, ITerm> declProperties = declProperties().melt();
declProperties.mapValues(unifier()::findRecursive);
final ISymbolicConstraints symbolic = symbolic().map(unifier()::findRecursive);
return ImmutableSolution.builder().from(this).astProperties(astProperties.freeze()).declProperties(declProperties.freeze()).symbolic(symbolic).build();
}
Aggregations