use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class TermIndexTest method testEqualAfterSerialization2.
@Test
public void testEqualAfterSerialization2() throws Exception {
ITerm t1 = ImmutableTermIndex.of("Hello, world!", 42);
ITerm t2 = deserialize(serialize(ImmutableTermIndex.of("Hello, world!", 42)));
assertEquals(t1.hashCode(), t2.hashCode());
assertTrue(t1.equals(t2));
}
use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class RelationComponent method solve.
// ------------------------------------------------------------------------------------------------------//
public Optional<SolveResult> solve(CBuildRelation c) {
final ITerm left = unifier().findRecursive(c.getLeft());
final ITerm right = unifier().findRecursive(c.getRight());
if (!(left.isGround() && right.isGround())) {
return Optional.empty();
}
return c.getRelation().match(IRelationName.Cases.of(// @formatter:off
name -> {
try {
relation(name).add(left, right);
} catch (RelationException e) {
final IMessageInfo message = c.getMessageInfo().withDefaultContent(MessageContent.of(e.getMessage()));
return Optional.of(SolveResult.messages(message));
}
return Optional.of(SolveResult.empty());
}, extName -> {
throw new IllegalArgumentException("Cannot add entries to external relations.");
}));
}
use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class RelationComponent method solve.
public Optional<SolveResult> solve(CCheckRelation c) {
final ITerm left = unifier().findRecursive(c.getLeft());
final ITerm right = unifier().findRecursive(c.getRight());
if (!(left.isGround() && right.isGround())) {
return Optional.empty();
}
return c.getRelation().match(IRelationName.Cases.of(// @formatter:off
name -> {
if (!isComplete.test(name)) {
return Optional.empty();
}
if (relation(name).contains(left, right)) {
return Optional.of(SolveResult.empty());
} else {
return Optional.empty();
}
}, extName -> {
final ITerm msginfo = MessageInfo.build(c.getMessageInfo());
return callExternal(extName, left, right, msginfo).map(csTerm -> {
return Constraints.matchConstraintOrList().match(csTerm, unifier()).map(SolveResult::constraints).orElseThrow(() -> new IllegalArgumentException("Expected list of constraints, got " + csTerm));
});
}));
}
use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class SetComponent method solve.
private Optional<SolveResult> solve(CEvalSet constraint) {
ITerm setTerm = unifier().findRecursive(constraint.getSet());
if (!setTerm.isGround()) {
return Optional.empty();
}
Optional<Set<IElement<ITerm>>> maybeSet = evaluator.match(setTerm, unifier());
if (!(maybeSet.isPresent())) {
return Optional.empty();
}
List<ITerm> set = maybeSet.get().stream().map(i -> unifier().findRecursive(i.getValue())).collect(Collectors.toList());
return Optional.of(SolveResult.constraints(ImmutableCEqual.of(constraint.getResult(), B.newList(set), constraint.getMessageInfo())));
}
use of mb.nabl2.terms.ITerm in project nabl by metaborg.
the class SetComponent method makeMessages.
private Iterable<IMessageInfo> makeMessages(IMessageInfo template, Collection<IElement<ITerm>> elements) {
boolean nameOrigin = M.appl0(NAME_OP).match(template.getOriginTerm(), unifier()).isPresent();
if (nameOrigin && !elements.isEmpty()) {
return elements.stream().<IMessageInfo>map(e -> {
Function1<ITerm, ITerm> f = T.sometd(t -> M.appl0(NAME_OP, a -> e.getValue()).match(t, unifier()));
return ImmutableMessageInfo.of(template.getKind(), template.getContent().apply(f), e.getPosition());
}).collect(Collectors.toList());
} else {
ITerm es = B.newList(elements.stream().map(e -> e.getValue()).collect(Collectors.toList()));
Function1<ITerm, ITerm> f = T.sometd(t -> M.appl0(NAME_OP, a -> es).match(t, unifier()));
return Iterables2.singleton(ImmutableMessageInfo.of(template.getKind(), template.getContent().apply(f), template.getOriginTerm()));
}
}
Aggregations