package org.angularjs.codeInsight; import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.lang.javascript.psi.*; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.css.StylesheetFile; import com.intellij.psi.css.resolve.CssInclusionContext; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import java.util.List; /** * @author Dennis.Ushakov */ public class AngularJSCssInclusionContext extends CssInclusionContext { @NotNull @Override public PsiFile[] getContextFiles(@NotNull PsiFile current) { final PsiElement context = current.getContext(); final JSProperty property = PsiTreeUtil.getParentOfType(context, JSProperty.class); if (property != null && "template".equals(property.getName())) { final JSObjectLiteralExpression object = (JSObjectLiteralExpression)property.getParent(); final JSProperty styles = object.findProperty("styles"); if (styles != null && styles.getValue() instanceof JSArrayLiteralExpression) { final List<PsiFile> result = new SmartList<>(); for (JSExpression expression : ((JSArrayLiteralExpression)styles.getValue()).getExpressions()) { if (expression instanceof JSLiteralExpression && ((JSLiteralExpression)expression).isQuotedLiteral()) { final List<Pair<PsiElement, TextRange>> injected = InjectedLanguageManager.getInstance(context.getProject()).getInjectedPsiFiles(expression); if (injected != null) { for (Pair<PsiElement, TextRange> pair : injected) { if (pair.first instanceof StylesheetFile) { result.add((PsiFile)pair.first); } } } } } return result.toArray(PsiFile.EMPTY_ARRAY); } } return PsiFile.EMPTY_ARRAY; } }