package org.angularjs.codeInsight.refs; import com.intellij.lang.javascript.psi.JSLiteralExpression; import com.intellij.lang.javascript.psi.JSObjectLiteralExpression; import com.intellij.lang.javascript.psi.JSProperty; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; import org.angularjs.index.AngularIndexUtil; import org.angularjs.index.AngularUiRouterViewsIndex; import org.jetbrains.annotations.NotNull; /** * @author Irina.Chernushina on 2/11/2016. */ public class AngularJSUiRouterViewReferencesProvider extends PsiReferenceProvider { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { final PsiElement identifier = element instanceof JSProperty ? ((JSProperty)element).getNameIdentifier() : element; return new PsiReference[] {new AngularJSUiRouterViewReference(identifier)}; } private static class AngularJSUiRouterViewReference extends AngularPolyReferenceBase<PsiElement> { public AngularJSUiRouterViewReference(PsiElement element) { super(element, ElementManipulators.getValueTextRange(element)); } private String getViewName() { final String text = StringUtil.unquoteString(getCanonicalText()); final int idx = text.indexOf('@'); if (idx >= 0) return text.substring(0, idx); return text; } @NotNull public ResolveResult[] resolveInner() { final String id = getViewName(); final Condition<VirtualFile> filter = StringUtil.isEmptyOrSpaces(id) ? filterByTemplateUrl() : Condition.TRUE; return AngularIndexUtil.multiResolveAngularNamedDefinitionIndex(getElement().getProject(), AngularUiRouterViewsIndex.UI_ROUTER_VIEWS_CACHE_INDEX, id, filter, false); } private Condition<VirtualFile> filterByTemplateUrl() { final PsiElement object = myElement.getParent() instanceof JSProperty ? ((JSProperty)myElement.getParent()).getValue() : null; if (object instanceof JSObjectLiteralExpression) { final JSProperty templateUrl = ((JSObjectLiteralExpression)object).findProperty("templateUrl"); if (templateUrl != null && templateUrl.getValue() != null && templateUrl.getValue() instanceof JSLiteralExpression && ((JSLiteralExpression)templateUrl.getValue()).isQuotedLiteral()) { String templateUrlText = StringUtil.unquoteString(templateUrl.getValue().getText()); if (!StringUtil.isEmptyOrSpaces(templateUrlText)) { templateUrlText = templateUrlText.trim().replace('\\', '/'); final String finalTemplateUrlText = templateUrlText; return file -> { final String path = file.getPath(); return path.endsWith(finalTemplateUrlText); }; } } } return Condition.TRUE; } @Override public boolean isSoft() { return true; } @NotNull @Override public Object[] getVariants() { return ArrayUtil.EMPTY_OBJECT_ARRAY; } } }