JsonStringSet visited = JsonCollections.createStringSet();
while (!linkSourceCandidates.isEmpty()) {
JsonArray<CodeGraphProposalImpl> newCandidates = JsonCollections.createArray();
for (CodeGraphProposalImpl candidate : linkSourceCandidates.asIterable()) {
CodeBlock codeBlock = candidate.codeBlock;
JsonArray<CodeGraphProposalImpl> zeroBoundary = JsonCollections.createArray();
JsonArray<CodeGraphProposalImpl> epsilonBoundary = JsonCollections.createArray();
createBoundary(codeBlock, candidate.fileData, zeroBoundary, epsilonBoundary, visited);
String linkAccessPrefix = candidate.getName();
if (linkAccessPrefix == null) {
linkAccessPrefix = "";
}
if (!StringUtils.isNullOrEmpty(linkAccessPrefix)) {
linkAccessPrefix += ".";
}
for (CodeGraphProposalImpl zeroNeighbor : zeroBoundary.asIterable()) {
searchTree(query, linkAccessPrefix, zeroNeighbor.codeBlock, zeroNeighbor.fileData,
false, newCandidates, result);
}
for (CodeGraphProposalImpl epsilonNeighbor : epsilonBoundary.asIterable()) {
String epsilonAccessPrefix = linkAccessPrefix;
CodeBlock targetCodeBlock = epsilonNeighbor.codeBlock;
if (targetCodeBlock.getBlockType() == CodeBlock.Type.VALUE_FILE) {
epsilonAccessPrefix += truncateExtension(targetCodeBlock.getName());
} else {
epsilonAccessPrefix += targetCodeBlock.getName();
}
epsilonAccessPrefix += ".";
searchTree(query, epsilonAccessPrefix, targetCodeBlock, epsilonNeighbor.fileData,
false, newCandidates, result);
}