void (final @NotNull String text, @NotNull PsiFileSystemItem context, final @NotNull Collection<? super ResolveResult> result, final boolean caseSensitive) { if (isAllowedEmptyPath(text) || ".".equals(text) || "/".equals(text)) { if (context instanceof FileReferenceResolver) { ResolveResult element = resolveFileReferenceResolver((FileReferenceResolver)context, text); if (element != null) { result.add(element); return; } } result.add(new PsiElementResolveResult(context)); } else if ("..".equals(text)) { if (context instanceof FileReferenceResolver) { ResolveResult element = resolveFileReferenceResolver((FileReferenceResolver)context, text); if (element != null) { result.add(element); return; } } final PsiFileSystemItem resolved = context.getParent(); if (resolved != null) { result.add(new PsiElementResolveResult(resolved)); } } else { final int separatorIndex = text.indexOf('/'); if (separatorIndex >= 0) { final List<ResolveResult> resolvedContexts = new ArrayList<>(); if (separatorIndex == 0 /*starts with slash*/ && "/".equals(context.getName())) { resolvedContexts.add(new PsiElementResolveResult(context)); } else { innerResolveInContext(text.substring(0, separatorIndex), context, resolvedContexts, caseSensitive); } final String restOfText = text.substring(separatorIndex + 1); for (ResolveResult contextVariant : resolvedContexts) { final PsiFileSystemItem item = (PsiFileSystemItem)contextVariant.getElement(); if (item != null) { innerResolveInContext(restOfText, item, result, caseSensitive); } } } else { final String decoded = decode(text); if (context instanceof PackagePrefixFileSystemItem) { context = ((PackagePrefixFileSystemItem)context).getDirectory(); } else if (context instanceof FileReferenceResolver) { ResolveResult child = resolveFileReferenceResolver((FileReferenceResolver)context, decoded); if (child != null) { result.add(child); return; } } if (context.getParent() == null && FileUtil.namesEqual(decoded, context.getName())) { // match filesystem roots result.add(new PsiElementResolveResult(getOriginalFile(context))); } else if (context instanceof PsiDirectory directory && caseSensitivityApplies((PsiDirectory)context, caseSensitive)) { // optimization: do not load all children into VFS PsiFileSystemItem child = directory.findFile(decoded); if (child == null) child = directory.findSubdirectory(decoded); if (child != null) { result.add(new PsiElementResolveResult(getOriginalFile(child))); } } else { processVariants(context, new PsiFileSystemItemProcessor() { @Override public boolean acceptItem(@NotNull String name, boolean isDirectory) { return caseSensitive ? decoded.equals(name) : decoded.compareToIgnoreCase(name) == 0; } @Override public boolean execute(@NotNull PsiFileSystemItem element) { result.add(new PsiElementResolveResult(getOriginalFile(element))); return true; } }); } } } }