package org.angularjs.codeInsight.refs; import com.intellij.javascript.JSFileReference; import com.intellij.lang.javascript.psi.JSLiteralExpression; import com.intellij.lang.typescript.compiler.TypeScriptCompilerConfigUtil; import com.intellij.lang.typescript.tsconfig.TypeScriptConfig; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference; import com.intellij.psi.impl.source.resolve.reference.impl.providers.SoftFileReferenceSet; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; import com.intellij.util.containers.ContainerUtil; import org.angularjs.index.AngularIndexUtil; import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.Collection; /** * @author Dennis.Ushakov */ public class AngularJSTemplateReferencesProvider extends PsiReferenceProvider { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { return ArrayUtil.mergeArrays(new Angular2SoftFileReferenceSet(element).getAllReferences(), new PsiReference[] {new AngularJSTemplateCacheReference((JSLiteralExpression)element)}); } static class Angular2SoftFileReferenceSet extends SoftFileReferenceSet { public Angular2SoftFileReferenceSet(PsiElement element) { super(element); } @NotNull @Override public Collection<PsiFileSystemItem> computeDefaultContexts() { final PsiElement element = getElement(); final Project project = element.getProject(); if (AngularIndexUtil.hasAngularJS2(project)) { final PsiFile file = element.getContainingFile().getOriginalFile(); final TypeScriptConfig config = TypeScriptCompilerConfigUtil.getConfigForFile(project, file.getVirtualFile()); final PsiDirectory directory = config != null ? PsiManager.getInstance(project).findDirectory(config.getConfigFile().getParent()) : null; return ContainerUtil.skipNulls(Arrays.asList(file.getContainingDirectory(), directory)); } return super.computeDefaultContexts(); } @Override public FileReference createFileReference(TextRange range, int index, String text) { return new JSFileReference(text, index, range, this, ArrayUtil.EMPTY_STRING_ARRAY); } } }