package org.angularjs.codeInsight.refs; import com.intellij.lang.javascript.psi.JSParameter; import com.intellij.lang.javascript.psi.resolve.JSReferenceExpressionResolver; import com.intellij.lang.javascript.psi.resolve.WalkUpResolveProcessor; import com.intellij.lang.javascript.psi.stubs.JSImplicitElement; import com.intellij.psi.*; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.ProcessingContext; import org.angularjs.index.AngularIndexUtil; import org.angularjs.index.AngularSymbolIndex; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author Dennis.Ushakov */ public class AngularJSDIReferencesProvider extends PsiReferenceProvider { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { return new PsiReference[] { new AngularJSDIReference((JSParameter)element) }; } public static class AngularJSDIReference extends AngularJSReferenceBase<JSParameter> { public AngularJSDIReference(JSParameter element) { super(element, ElementManipulators.getValueTextRange(element)); } @Nullable @Override public PsiElement resolveInner() { final JSImplicitElement resolve = AngularIndexUtil.resolve(getElement().getProject(), AngularSymbolIndex.KEY, getCanonicalText()); if (resolve != null) return resolve; final String name = getCanonicalText(); final PsiFile psiFile = getElement().getContainingFile(); final WalkUpResolveProcessor processor = new WalkUpResolveProcessor( name, psiFile, getElement() ); processor.allowPartialResults(); JSReferenceExpressionResolver.processAllSymbols(processor); final ResolveResult[] results = processor.getResults(); return results.length == 1 ? results[0].getElement() : null; } @NotNull @Override public Object[] getVariants() { return ArrayUtil.EMPTY_OBJECT_ARRAY; } @Override public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { return getElement().setName(newElementName); } } }