use of mb.nabl2.constraints.nameresolution.CAssoc in project nabl by metaborg.
the class NameResolutionComponent method solve.
private Optional<SolveResult> solve(CAssoc a) {
final ITerm declTerm = unifier().findRecursive(a.getDeclaration());
if (!declTerm.isGround()) {
return Optional.empty();
}
final Occurrence decl = Occurrence.matcher().match(declTerm, unifier()).orElseThrow(() -> new TypeException("Expected an occurrence as first argument to " + a));
final Label label = a.getLabel();
final List<Scope> scopes = Lists.newArrayList(scopeGraph.getExportEdges().get(decl, label));
final SolveResult result;
switch(scopes.size()) {
case 0:
{
IMessageInfo message = a.getMessageInfo().withDefaultContent(MessageContent.builder().append(decl).append(" has no ").append(label).append(" associated scope.").build());
result = SolveResult.messages(message);
break;
}
case 1:
{
result = SolveResult.constraints(ImmutableCEqual.of(a.getScope(), scopes.get(0), a.getMessageInfo()));
break;
}
default:
{
IMessageInfo message = a.getMessageInfo().withDefaultContent(MessageContent.builder().append(decl).append(" has multiple ").append(label).append(" associated scope.").build());
result = SolveResult.messages(message);
break;
}
}
return Optional.of(result);
}
Aggregations