in sources/java-incremental-compilation/jvm-inc-builder/src/com/intellij/tools/build/bazel/jvmIncBuilder/impl/OutputSinkImpl.java [101:178]
public Iterable<NodeWithSources> getNodes() {
Map<NodeSource, Set<Usage>> fileLocalUsages = new HashMap<>();
Set<NodeSource> registeredSources = new HashSet<>();
for (BuilderWithSources bs : myBuilders) {
JvmClassNodeBuilder builder = bs.builder();
Iterable<NodeSource> sources = bs.sources();
Iterators.collect(sources, registeredSources);
JvmNodeReferenceID nodeID = builder.getReferenceID();
String nodeName = nodeID.getNodeName();
addConstantUsages(builder, nodeName, myConstantRefs.remove(nodeName));
Collection<String> classImports = myClassImportRefs.remove(nodeName);
Collection<String> staticImports = myStaticImportRefs.remove(nodeName);
if (classImports != null || staticImports != null) {
addImportUsages(builder, classImports != null? classImports : Set.of(), staticImports != null? staticImports : Set.of());
}
Set<Usage> additionalUsages = myAdditionalUsages.remove(nodeName);
if (additionalUsages != null) {
for (Usage usage : additionalUsages) {
builder.addUsage(usage);
}
}
var node = builder.getResult();
Iterable<LookupNameUsage> lookups = Iterators.flat(Iterators.map(node.getMetadata(KotlinMeta.class), meta -> {
KmDeclarationContainer container = meta.getDeclarationContainer();
final JvmNodeReferenceID owner;
LookupNameUsage clsUsage = null;
if (container instanceof KmPackage) {
owner = new JvmNodeReferenceID(JvmClass.getPackageName(node.getName()));
}
else if (container instanceof KmClass) {
owner = new JvmNodeReferenceID(((KmClass)container).getName());
String ownerName = owner.getNodeName();
String scopeName = JvmClass.getPackageName(ownerName);
String symbolName = scopeName.isEmpty()? ownerName : ownerName.substring(scopeName.length() + 1);
clsUsage = new LookupNameUsage(scopeName, symbolName);
}
else {
owner = null;
}
if (owner == null) {
return Collections.emptyList();
}
Iterable<LookupNameUsage> memberLookups =
Iterators.map(Iterators.unique(Iterators.flat(Iterators.map(container.getFunctions(), KmFunction::getName), Iterators.map(container.getProperties(), KmProperty::getName))), name -> new LookupNameUsage(owner, name));
return clsUsage == null? memberLookups : Iterators.flat(Iterators.asIterable(clsUsage), memberLookups);
}));
for (LookupNameUsage lookup : lookups) {
for (NodeSource src : sources) {
fileLocalUsages.computeIfAbsent(src, s -> new HashSet<>()).add(lookup);
}
}
myNodes.add(new NodeWithSources(node, sources));
}
myBuilders.clear();
for (Map.Entry<NodeSource, Set<Usage>> entry : myPerSourceAdditionalUsages.entrySet()) {
NodeSource src = entry.getKey();
if (!registeredSources.contains(src)) {
// create synthetic FileNode instances for those sources only, that have at least one compiled ClassNode associated
continue;
}
Set<Usage> usages = entry.getValue();
Set<Usage> selfUsages = fileLocalUsages.get(src);
if (selfUsages != null) {
usages.removeAll(selfUsages);
}
myNodes.add(new NodeWithSources(new FileNode(src.toString(), usages), List.of(src)));
}
myPerSourceAdditionalUsages.clear();
return myNodes;
}