in src/main/java/com/jetbrains/jdi/ConcreteMethodImpl.java [398:461]
private CompletableFuture<SoftLocationXRefs> getLocationsAsync(SDE.Stratum stratum) {
if (stratum.isJava()) {
return getBaseLocationsAsync();
}
String stratumID = stratum.id();
SoftLocationXRefs info =
(softOtherLocationXRefsRef == null) ? null :
softOtherLocationXRefsRef.get();
if (info != null && info.stratumID.equals(stratumID)) {
return CompletableFuture.completedFuture(info);
}
return declaringType.stratumAsync(SDE.BASE_STRATUM_NAME)
.thenCombine(getBaseLocationsAsync(), (baseStratum, softLocationXRefs) -> {
List<Location> lineLocations = new ArrayList<>();
Map<Integer, List<Location>> lineMapper = new HashMap<>();
int lowestLine = -1;
int highestLine = -1;
SDE.LineStratum lastLineStratum = null;
for (Location lineLocation : softLocationXRefs.lineLocations) {
LocationImpl loc = (LocationImpl) lineLocation;
int baseLineNumber = loc.lineNumber(baseStratum);
SDE.LineStratum lineStratum =
stratum.lineStratum(declaringType, baseLineNumber);
if (lineStratum == null) {
// location not mapped in this stratum
continue;
}
int lineNumber = lineStratum.lineNumber();
// remove unmapped and dup lines
if ((lineNumber != -1) &&
(!lineStratum.equals(lastLineStratum))) {
lastLineStratum = lineStratum;
// Remember the largest/smallest line number
if (lineNumber > highestLine) {
highestLine = lineNumber;
}
if ((lineNumber < lowestLine) || (lowestLine == -1)) {
lowestLine = lineNumber;
}
loc.addStratumLineInfo(
new StratumLineInfo(stratumID,
lineNumber,
lineStratum.sourceName(),
lineStratum.sourcePath()));
// Add to the location list
lineLocations.add(loc);
// Add to the line -> locations map
lineMapper.computeIfAbsent(lineNumber, k -> new ArrayList<>(1)).add(loc);
}
}
SoftLocationXRefs res = new SoftLocationXRefs(stratumID, lineMapper, lineLocations,
lowestLine, highestLine);
softOtherLocationXRefsRef = vm.createSoftReference(res);
return res;
});
}