blob: 40c12a886140c326019bd83f9074fd104723b9a2 [file] [log] [blame]
package com.intellij.codeInsight.daemon.impl.analysis;
import com.intellij.ide.highlighter.HtmlFileType;
import com.intellij.ide.highlighter.XHtmlFileType;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceHelper;
import com.intellij.psi.xml.XmlFile;
import com.intellij.xml.util.HtmlUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
/**
* @author Dennis.Ushakov
*/
public class HtmlFileReferenceHelper extends FileReferenceHelper {
@NotNull
@Override
public Collection<PsiFileSystemItem> getContexts(Project project, @NotNull VirtualFile vFile) {
final PsiFile file = PsiManager.getInstance(project).findFile(vFile);
final Module module = file != null ? ModuleUtilCore.findModuleForPsiElement(file) : null;
if (module == null || !(file instanceof XmlFile)) return Collections.emptyList();
final String basePath = HtmlUtil.getHrefBase((XmlFile)file);
if (basePath != null && !HtmlUtil.hasHtmlPrefix(basePath)) {
for (VirtualFile virtualFile : getBaseRoots(module)) {
final VirtualFile base = virtualFile.findFileByRelativePath(basePath);
final PsiDirectory result = base != null ? PsiManager.getInstance(project).findDirectory(base) : null;
if (result != null) {
return Collections.<PsiFileSystemItem>singletonList(result);
}
}
}
return Collections.emptyList();
}
protected Collection<VirtualFile> getBaseRoots(final Module module) {
return Arrays.asList(ModuleRootManager.getInstance(module).getContentRoots());
}
@Override
public boolean isMine(Project project, @NotNull VirtualFile file) {
final FileType fileType = file.getFileType();
return ProjectRootManager.getInstance(project).getFileIndex().isInContent(file) &&
fileType == HtmlFileType.INSTANCE || fileType == XHtmlFileType.INSTANCE;
}
}