summaryrefslogtreecommitdiff
path: root/src/main/java/org/javacs/Index.java
blob: 6ab404d8cd57fd26356c874ef94d490fb3107b48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package org.javacs;

import com.sun.source.tree.*;
import com.sun.source.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.lang.model.element.Element;
import javax.tools.*;

class Index {
    /** map[ptr] is the number of references to ptr */
    private final Map<Ptr, Integer> referenceCounts = new HashMap<>();
    /** hasErrors is true if there were compilation errors when we created this index */
    private boolean hasErrors;

    Index(
            JavacTask task,
            CompilationUnitTree from,
            Collection<Diagnostic<? extends JavaFileObject>> errors,
            Collection<Element> to) {
        // Scan from for references
        var finder = new FindReferences(task);
        var refs = new HashMap<Element, List<TreePath>>();
        for (var el : to) {
            refs.put(el, new ArrayList<>());
        }
        finder.scan(from, refs);

        // Convert Map<Element, List<_>> to Map<Ptr, Integer>
        for (var el : to) {
            var ptr = new Ptr(el);
            var count = refs.get(el).size();
            referenceCounts.put(ptr, count);
        }

        // Check if there are any errors in from
        var fromUri = from.getSourceFile().toUri();
        for (var err : errors) {
            if (err.getSource().toUri().equals(fromUri)) hasErrors = true;
        }
    }

    boolean needsUpdate(Set<Ptr> signature) {
        if (hasErrors) return true;
        for (var expected : referenceCounts.keySet()) {
            if (!signature.contains(expected)) return true;
        }
        return false;
    }

    int count(Ptr to) {
        return referenceCounts.getOrDefault(to, 0);
    }
}