Search in sources :

Example 6 with Scope

use of mb.nabl2.scopegraph.terms.Scope in project nabl by metaborg.

the class NameResolutionComponent method solve.

// ------------------------------------------------------------------------------------------------------//
private Optional<SolveResult> solve(CResolve r) {
    final ITerm refTerm = unifier().findRecursive(r.getReference());
    if (!refTerm.isGround()) {
        return Optional.empty();
    }
    final Occurrence ref = Occurrence.matcher().match(refTerm, unifier()).orElseThrow(() -> new TypeException("Expected an occurrence as first argument to " + r));
    final Optional<java.util.Set<IResolutionPath<Scope, Label, Occurrence>>> maybePathsAndDeps = nameResolution.resolve(ref);
    if (!maybePathsAndDeps.isPresent()) {
        return Optional.empty();
    }
    final java.util.Set<IResolutionPath<Scope, Label, Occurrence>> paths = maybePathsAndDeps.get();
    final List<Occurrence> declarations = Paths.resolutionPathsToDecls(paths);
    final Multimap<String, String> deps = HashMultimap.create();
    deps.putAll(ref.getIndex().getResource(), declarations.stream().map(d -> d.getIndex().getResource()).collect(Collectors.toSet()));
    final SolveResult result;
    switch(declarations.size()) {
        case 0:
            {
                IMessageInfo message = r.getMessageInfo().withDefaultContent(MessageContent.builder().append(ref).append(" does not resolve.").build());
                result = SolveResult.messages(message);
                break;
            }
        case 1:
            {
                final Occurrence decl = declarations.get(0);
                result = SolveResult.constraints(ImmutableCEqual.of(r.getDeclaration(), decl, r.getMessageInfo()));
                break;
            }
        default:
            {
                IMessageInfo message = r.getMessageInfo().withDefaultContent(MessageContent.builder().append("Resolution of ").append(ref).append(" is ambiguous.").build());
                result = SolveResult.messages(message);
                break;
            }
    }
    return Optional.of(ImmutableSolveResult.copyOf(result).withDependencies(deps));
}
Also used : IResolutionPath(mb.nabl2.scopegraph.path.IResolutionPath) Label(mb.nabl2.scopegraph.terms.Label) TypeException(mb.nabl2.solver.TypeException) IMessageInfo(mb.nabl2.constraints.messages.IMessageInfo) SolveResult(mb.nabl2.solver.ISolver.SolveResult) ImmutableSolveResult(mb.nabl2.solver.ImmutableSolveResult) Scope(mb.nabl2.scopegraph.terms.Scope) ITerm(mb.nabl2.terms.ITerm) Occurrence(mb.nabl2.scopegraph.terms.Occurrence)

Example 7 with Scope

use of mb.nabl2.scopegraph.terms.Scope 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);
}
Also used : SolveResult(mb.nabl2.solver.ISolver.SolveResult) ImmutableSolveResult(mb.nabl2.solver.ImmutableSolveResult) Scope(mb.nabl2.scopegraph.terms.Scope) Label(mb.nabl2.scopegraph.terms.Label) ITerm(mb.nabl2.terms.ITerm) TypeException(mb.nabl2.solver.TypeException) Occurrence(mb.nabl2.scopegraph.terms.Occurrence) IMessageInfo(mb.nabl2.constraints.messages.IMessageInfo)

Example 8 with Scope

use of mb.nabl2.scopegraph.terms.Scope in project nabl by metaborg.

the class ScopeGraphComponent method solve.

private boolean solve(CGImportEdge c) {
    ITerm scopeRep = unifier().findRecursive(c.getScope());
    if (!scopeRep.isGround()) {
        return false;
    }
    Scope scope = Scope.matcher().match(scopeRep, unifier()).orElseThrow(() -> new TypeException("Expected a scope but got " + scopeRep));
    return findOccurrence(c.getReference()).map(ref -> {
        scopeGraph.addImportEdge(scope, c.getLabel(), ref);
        return true;
    }).orElseGet(() -> {
        scopeGraph.addIncompleteImportEdge(scope, c.getLabel(), c.getReference());
        return true;
    });
}
Also used : TypeException(mb.nabl2.solver.TypeException) ASolver(mb.nabl2.solver.ASolver) ITerm(mb.nabl2.terms.ITerm) CGDirectEdge(mb.nabl2.constraints.scopegraph.CGDirectEdge) IScopeGraphConstraint(mb.nabl2.constraints.scopegraph.IScopeGraphConstraint) IEsopScopeGraph(mb.nabl2.scopegraph.esop.IEsopScopeGraph) Scope(mb.nabl2.scopegraph.terms.Scope) CGExportEdge(mb.nabl2.constraints.scopegraph.CGExportEdge) Occurrence(mb.nabl2.scopegraph.terms.Occurrence) IMessageInfo(mb.nabl2.constraints.messages.IMessageInfo) CGRef(mb.nabl2.constraints.scopegraph.CGRef) SolveResult(mb.nabl2.solver.ISolver.SolveResult) SolverCore(mb.nabl2.solver.SolverCore) CGDecl(mb.nabl2.constraints.scopegraph.CGDecl) ISolver(mb.nabl2.solver.ISolver) Label(mb.nabl2.scopegraph.terms.Label) SeedResult(mb.nabl2.solver.ISolver.SeedResult) CGImportEdge(mb.nabl2.constraints.scopegraph.CGImportEdge) Optional(java.util.Optional) Scope(mb.nabl2.scopegraph.terms.Scope) ITerm(mb.nabl2.terms.ITerm) TypeException(mb.nabl2.solver.TypeException)

Example 9 with Scope

use of mb.nabl2.scopegraph.terms.Scope in project nabl by metaborg.

the class ScopeGraphComponent method solve.

// ------------------------------------------------------------------------------------------------------//
private boolean solve(CGDecl c) {
    final ITerm scopeTerm = unifier().findRecursive(c.getScope());
    final ITerm declTerm = unifier().findRecursive(c.getDeclaration());
    if (!(scopeTerm.isGround() && declTerm.isGround())) {
        return false;
    }
    Scope scope = Scope.matcher().match(scopeTerm, unifier()).orElseThrow(() -> new TypeException("Expected a scope as first agument to " + c));
    Occurrence decl = Occurrence.matcher().match(declTerm, unifier()).orElseThrow(() -> new TypeException("Expected an occurrence as second argument to " + c));
    scopeGraph.addDecl(scope, decl);
    return true;
}
Also used : Scope(mb.nabl2.scopegraph.terms.Scope) ITerm(mb.nabl2.terms.ITerm) TypeException(mb.nabl2.solver.TypeException) Occurrence(mb.nabl2.scopegraph.terms.Occurrence)

Example 10 with Scope

use of mb.nabl2.scopegraph.terms.Scope in project nabl by metaborg.

the class ScopeGraphComponent method solve.

private boolean solve(CGExportEdge c) {
    ITerm scopeTerm = unifier().findRecursive(c.getScope());
    ITerm declTerm = unifier().findRecursive(c.getDeclaration());
    if (!(scopeTerm.isGround() && declTerm.isGround())) {
        return false;
    }
    Scope scope = Scope.matcher().match(scopeTerm, unifier()).orElseThrow(() -> new TypeException("Expected a scope as third argument to " + c));
    Occurrence decl = Occurrence.matcher().match(declTerm, unifier()).orElseThrow(() -> new TypeException("Expected an occurrence as first argument to " + c));
    scopeGraph.addExportEdge(decl, c.getLabel(), scope);
    return true;
}
Also used : Scope(mb.nabl2.scopegraph.terms.Scope) ITerm(mb.nabl2.terms.ITerm) TypeException(mb.nabl2.solver.TypeException) Occurrence(mb.nabl2.scopegraph.terms.Occurrence)

Aggregations

Scope (mb.nabl2.scopegraph.terms.Scope)17 ITerm (mb.nabl2.terms.ITerm)17 Occurrence (mb.nabl2.scopegraph.terms.Occurrence)15 Label (mb.nabl2.scopegraph.terms.Label)12 SolveResult (mb.nabl2.solver.ISolver.SolveResult)8 Map (java.util.Map)7 Optional (java.util.Optional)7 ISolution (mb.nabl2.solver.ISolution)7 IEsopScopeGraph (mb.nabl2.scopegraph.esop.IEsopScopeGraph)6 ISolver (mb.nabl2.solver.ISolver)6 SolverCore (mb.nabl2.solver.SolverCore)6 TypeException (mb.nabl2.solver.TypeException)6 IUnifier (mb.nabl2.terms.unification.IUnifier)6 IMessageInfo (mb.nabl2.constraints.messages.IMessageInfo)5 IEsopNameResolution (mb.nabl2.scopegraph.esop.IEsopNameResolution)5 NaBL2DebugConfig (mb.nabl2.config.NaBL2DebugConfig)4 IConstraint (mb.nabl2.constraints.IConstraint)4 IResolutionPath (mb.nabl2.scopegraph.path.IResolutionPath)4 ImmutableSolution (mb.nabl2.solver.ImmutableSolution)4 SolverConfig (mb.nabl2.solver.SolverConfig)4