use file's directory as context root when resolving references in FileIncludeProvider (fixes WEB-20021 for IntelliJ IDEA)

This commit is contained in:
Sergey Simonchik
2016-03-24 21:57:02 +03:00
parent fe8c47989c
commit 95f7b0d3f1
@@ -30,6 +30,7 @@ import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.source.PsiFileImpl;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceHelper;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.CachedValueProvider;
@@ -181,9 +182,35 @@ public class FileIncludeManagerImpl extends FileIncludeManager {
protected boolean useIncludingFileAsContext() {
return false;
}
@NotNull
@Override
public Collection<PsiFileSystemItem> computeDefaultContexts() {
Collection<PsiFileSystemItem> contexts = super.computeDefaultContexts();
if (!isAbsolutePathReference()) {
return addFileDirectoryToContexts(contexts, context);
}
return contexts;
}
}.resolve();
}
@NotNull
private static Collection<PsiFileSystemItem> addFileDirectoryToContexts(@NotNull Collection<PsiFileSystemItem> contexts,
@NotNull PsiFile context) {
VirtualFile file = context.getOriginalFile().getVirtualFile();
VirtualFile dir = file == null ? null : file.getParent();
if (dir != null) {
PsiFileSystemItem item = FileReferenceHelper.getPsiFileSystemItem(context.getManager(), dir);
if (item != null && !contexts.contains(item)) {
List<PsiFileSystemItem> result = ContainerUtil.newArrayList(contexts);
result.add(item);
return result;
}
}
return contexts;
}
private abstract class IncludeCacheHolder {
private final Key<ParameterizedCachedValue<VirtualFile[], PsiFile>> COMPILE_TIME_KEY;