private CompletableFuture getLocationsAsync()

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;
                });
    }