@Override
      public CompletionResult compute() throws RuntimeException {
        List<FileLookup.LookupFile> siblings = new ArrayList<>();
        List<FileLookup.LookupFile> kidsAfterSeparator = new ArrayList<>();

        if (current != null) {
          variants.addAll(getMatchingChildren(effectivePrefix, current));

          if (currentParentMatch && !closedPath && !typed.isEmpty()) {
            kidsAfterSeparator.addAll(variants);
          }

          if (grandparentPrefix != null) {
            List<FileLookup.LookupFile> children = getMatchingChildren(grandparentPrefix, currentGrandparent);
            variants.addAll(0, children);
            siblings.addAll(children);
          }
        }

        FileLookup.LookupFile toPreselect = preselected;

        if (toPreselect == null || !variants.contains(toPreselect)) {
          boolean toPreselectFixed = false;
          if (!effectivePrefix.isEmpty()) {
            for (FileLookup.LookupFile each : variants) {
              String eachName = StringUtil.toUpperCase(each.getName());
              if (!eachName.startsWith(effectivePrefix)) continue;
              toPreselect = each;
              toPreselectFixed = true;
              break;
            }

            if (!toPreselectFixed) {
              toPreselect = null;
            }
          }
          else {
            toPreselect = null;
          }

          if (toPreselect == null) {
            if (variants.size() == 1) {
              toPreselect = variants.get(0);
            }
            else if (effectivePrefix.isEmpty()) {
              if (!siblings.isEmpty()) {
                toPreselect = siblings.get(0);
              }
            }

            if (toPreselect == null && !variants.contains(null) && !variants.isEmpty()) {
              toPreselect = variants.get(0);
            }
          }
        }

        if (currentParentMatch && !siblings.isEmpty()) {
          toPreselect = null;
        }

        return new CompletionResult(variants, macros, siblings, kidsAfterSeparator, toPreselect);
      }
@Override
      public CompletionResult compute()