Search in sources :

Example 1 with TypeScope

use of meghanada.analyze.TypeScope in project meghanada-server by mopemope.

the class LocationSearcher method searchLocalVariable.

private Optional<Location> searchLocalVariable(final Source source, final int line, final int col, final String symbol) {
    final EntryMessage entryMessage = log.traceEntry("line={} col={} symbol={}", line, col, symbol);
    final Map<String, Variable> variableMap = source.getVariableMap(line);
    log.trace("variables={}", variableMap);
    final Optional<Variable> variable = Optional.ofNullable(variableMap.get(symbol));
    final Optional<Location> location = variable.map(var -> {
        if (var.isDecl()) {
            final Location loc = new Location(source.getFile().getPath(), var.range.begin.line, var.range.begin.column);
            return Optional.of(loc);
        } else {
            final String fqcn = var.fqcn;
            final Location loc = getFQCNLocation(fqcn);
            return Optional.ofNullable(loc);
        }
    }).orElseGet(() -> {
        // isField
        final Optional<TypeScope> ts = source.getTypeScope(line);
        if (!ts.isPresent()) {
            return Optional.empty();
        }
        return ts.get().getField(symbol).map(fieldSymbol -> new Location(source.getFile().getPath(), fieldSymbol.range.begin.line, fieldSymbol.range.begin.column));
    });
    log.traceExit(entryMessage);
    return location;
}
Also used : DecompilationListener(org.jboss.windup.decompiler.api.DecompilationListener) FunctionUtils.wrapIOConsumer(meghanada.utils.FunctionUtils.wrapIOConsumer) ConstructorDeclaration(com.github.javaparser.ast.body.ConstructorDeclaration) Map(java.util.Map) ZipFile(java.util.zip.ZipFile) MethodCall(meghanada.analyze.MethodCall) CompilationUnit(com.github.javaparser.ast.CompilationUnit) Path(java.nio.file.Path) ZipEntry(java.util.zip.ZipEntry) FunctionUtils.wrapIO(meghanada.utils.FunctionUtils.wrapIO) GlobalCache(meghanada.cache.GlobalCache) SimpleName(com.github.javaparser.ast.expr.SimpleName) TypeDeclaration(com.github.javaparser.ast.body.TypeDeclaration) StandardOpenOption(java.nio.file.StandardOpenOption) StandardCharsets(java.nio.charset.StandardCharsets) UncheckedIOException(java.io.UncheckedIOException) Objects(java.util.Objects) List(java.util.List) Stream(java.util.stream.Stream) Logger(org.apache.logging.log4j.Logger) MethodScope(meghanada.analyze.MethodScope) ClassNameUtils(meghanada.utils.ClassNameUtils) Optional(java.util.Optional) Project(meghanada.project.Project) Pattern(java.util.regex.Pattern) ProjectDependency(meghanada.project.ProjectDependency) Config(meghanada.config.Config) Parameter(com.github.javaparser.ast.body.Parameter) Position(com.github.javaparser.Position) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Level(java.util.logging.Level) VariableDeclarator(com.github.javaparser.ast.body.VariableDeclarator) Variable(meghanada.analyze.Variable) UncheckedExecutionException(com.google.common.util.concurrent.UncheckedExecutionException) ClassScope(meghanada.analyze.ClassScope) OutputStream(java.io.OutputStream) Filter(org.jboss.windup.decompiler.util.Filter) DecompilationResult(org.jboss.windup.decompiler.api.DecompilationResult) Files(java.nio.file.Files) BufferedWriter(java.io.BufferedWriter) BodyDeclaration(com.github.javaparser.ast.body.BodyDeclaration) FileOutputStream(java.io.FileOutputStream) FileUtils.existsFQCN(meghanada.utils.FileUtils.existsFQCN) IOException(java.io.IOException) CachedASMReflector(meghanada.reflect.asm.CachedASMReflector) FileUtils(meghanada.utils.FileUtils) EntryMessage(org.apache.logging.log4j.message.EntryMessage) File(java.io.File) ExecutionException(java.util.concurrent.ExecutionException) FieldDeclaration(com.github.javaparser.ast.body.FieldDeclaration) MethodDeclaration(com.github.javaparser.ast.body.MethodDeclaration) Paths(java.nio.file.Paths) Source(meghanada.analyze.Source) FernflowerDecompiler(org.jboss.windup.decompiler.fernflower.FernflowerDecompiler) TypeScope(meghanada.analyze.TypeScope) LogManager(org.apache.logging.log4j.LogManager) JavaParser(com.github.javaparser.JavaParser) InputStream(java.io.InputStream) Variable(meghanada.analyze.Variable) TypeScope(meghanada.analyze.TypeScope) EntryMessage(org.apache.logging.log4j.message.EntryMessage)

Example 2 with TypeScope

use of meghanada.analyze.TypeScope in project meghanada-server by mopemope.

the class JavaCompletion method completionSymbols.

private static Collection<? extends CandidateUnit> completionSymbols(Source source, int line, String prefix) {
    Set<CandidateUnit> result = new HashSet<>(32);
    // prefix search
    log.debug("Search variables prefix:{} line:{}", prefix, line);
    Optional<TypeScope> typeScope = source.getTypeScope(line);
    if (!typeScope.isPresent()) {
        return result;
    }
    String fqcn = typeScope.get().getFQCN();
    // add this member
    for (MemberDescriptor c : JavaCompletion.reflectSelf(fqcn, true, prefix)) {
        if (c.getName().startsWith(prefix)) {
            result.add(c);
        }
    }
    if (fqcn.contains(ClassNameUtils.INNER_MARK)) {
        // add parent
        String parentClass = fqcn;
        while (true) {
            int i = parentClass.lastIndexOf('$');
            if (i < 0) {
                break;
            }
            parentClass = parentClass.substring(0, i);
            for (MemberDescriptor c : JavaCompletion.reflectSelf(parentClass, true, prefix)) {
                if (c.getName().startsWith(prefix)) {
                    result.add(c);
                }
            }
        }
    }
    log.debug("self fqcn:{}", fqcn);
    Map<String, Variable> symbols = source.getDeclaratorMap(line);
    log.debug("search variables size:{} result:{}", symbols.size(), symbols);
    for (Map.Entry<String, Variable> e : symbols.entrySet()) {
        String k = e.getKey();
        Variable v = e.getValue();
        log.debug("check variable name:{}", k);
        if (k.startsWith(prefix)) {
            log.debug("match variable name:{}", k);
            if (!v.isField) {
                result.add(v.toCandidateUnit());
            }
        }
    }
    // import
    for (Map.Entry<String, String> e : source.getImportedClassMap().entrySet()) {
        String k = e.getKey();
        String v = e.getValue();
        if (k.startsWith(prefix)) {
            result.add(ClassIndex.createClass(v));
        }
    }
    // static import
    for (Map.Entry<String, String> e : source.staticImportClass.entrySet()) {
        String methodName = e.getKey();
        String clazz = e.getValue();
        for (MemberDescriptor md : JavaCompletion.reflectWithFQCN(clazz, methodName)) {
            if (md.getName().equals(methodName)) {
                result.add(md);
            }
        }
    }
    // Add class
    if (Character.isUpperCase(prefix.charAt(0))) {
        // completion
        CachedASMReflector reflector = CachedASMReflector.getInstance();
        boolean fuzzySearch = Config.load().useClassFuzzySearch();
        if (fuzzySearch) {
            result.addAll(reflector.fuzzySearchClasses(prefix.toLowerCase()));
        } else {
            result.addAll(reflector.searchClasses(prefix.toLowerCase()));
        }
    }
    List<CandidateUnit> list = new ArrayList<>(result);
    list.sort(comparing(source, prefix));
    return list;
}
Also used : CachedASMReflector(meghanada.reflect.asm.CachedASMReflector) Variable(meghanada.analyze.Variable) MemberDescriptor(meghanada.reflect.MemberDescriptor) ArrayList(java.util.ArrayList) TypeScope(meghanada.analyze.TypeScope) CandidateUnit(meghanada.reflect.CandidateUnit) Map(java.util.Map) HashSet(java.util.HashSet)

Aggregations

ArrayList (java.util.ArrayList)2 Map (java.util.Map)2 TypeScope (meghanada.analyze.TypeScope)2 Variable (meghanada.analyze.Variable)2 CachedASMReflector (meghanada.reflect.asm.CachedASMReflector)2 JavaParser (com.github.javaparser.JavaParser)1 Position (com.github.javaparser.Position)1 CompilationUnit (com.github.javaparser.ast.CompilationUnit)1 BodyDeclaration (com.github.javaparser.ast.body.BodyDeclaration)1 ConstructorDeclaration (com.github.javaparser.ast.body.ConstructorDeclaration)1 FieldDeclaration (com.github.javaparser.ast.body.FieldDeclaration)1 MethodDeclaration (com.github.javaparser.ast.body.MethodDeclaration)1 Parameter (com.github.javaparser.ast.body.Parameter)1 TypeDeclaration (com.github.javaparser.ast.body.TypeDeclaration)1 VariableDeclarator (com.github.javaparser.ast.body.VariableDeclarator)1 SimpleName (com.github.javaparser.ast.expr.SimpleName)1 UncheckedExecutionException (com.google.common.util.concurrent.UncheckedExecutionException)1 BufferedWriter (java.io.BufferedWriter)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1