All Downloads are FREE. Search and download functionalities are using the official Maven repository.

javarepl.completion.ConsoleCompleter Maven / Gradle / Ivy

package javarepl.completion;

import com.googlecode.totallylazy.Sequence;
import com.googlecode.totallylazy.functions.Function1;
import javarepl.Evaluator;
import javarepl.Result;
import javarepl.expressions.Import;
import javarepl.expressions.Method;
import javarepl.expressions.Type;

import static com.googlecode.totallylazy.Strings.*;
import static com.googlecode.totallylazy.predicates.Predicates.in;
import static com.googlecode.totallylazy.predicates.Predicates.where;
import static javarepl.completion.CompletionCandidate.asCompletionCandidate;
import static javarepl.expressions.Expression.functions.key;

public class ConsoleCompleter extends Completer {
    private final Evaluator evaluator;
    private final TypeResolver typeResolver;

    public ConsoleCompleter(Evaluator evaluator, TypeResolver typeResolver) {
        this.evaluator = evaluator;
        this.typeResolver = typeResolver;
    }

    public CompletionResult call(String expression) throws Exception {
        int lastSpace = expression.lastIndexOf(" ") + 1;
        Sequence candidates = results()
                .join(methods())
                .join(types())
                .join(imports())
                .filter(startsWith(expression.substring(lastSpace)))
                .map(asCompletionCandidate());

        return new CompletionResult(expression, lastSpace, candidates);
    }

    private Sequence results() {
        return evaluator.results().map(Result::key);
    }

    private Sequence methods() {
        return evaluator.expressionsOfType(Method.class).map(Method::name).unique().map(format("%s("));
    }

    private Sequence types() {
        return evaluator.expressionsOfType(Type.class).map(key());
    }

    private Sequence imports() {
        Sequence importedPackages = evaluator
                .expressionsOfType(Import.class)
                .map(((Function1) Import::typePackage).then(replace(".*", "")).then(replace(" ", "")));

        return typeResolver.packages()
                .filter(where(ResolvedPackage::packageName, in(importedPackages)))
                .flatMap(ResolvedPackage::classes)
                .map(ResolvedClass::className)
                .unique();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy