package org.angularjs.codeInsight.refs;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.lang.javascript.completion.JSLookupPriority;
import com.intellij.lang.javascript.completion.JSLookupUtilImpl;
import com.intellij.lang.javascript.psi.JSLiteralExpression;
import com.intellij.psi.ElementManipulators;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceProvider;
import com.intellij.util.ProcessingContext;
import org.angularjs.index.AngularControllerIndex;
import org.angularjs.index.AngularIndexUtil;
import org.angularjs.index.AngularJSIndexingHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
/**
* @author Dennis.Ushakov
*/
public class AngularJSControllerReferencesProvider extends PsiReferenceProvider {
@NotNull
@Override
public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
return new PsiReference[] { new AngularJSControllerReference((JSLiteralExpression)element) };
}
public static class AngularJSControllerReference extends AngularJSReferenceBase<JSLiteralExpression> {
public AngularJSControllerReference(@NotNull JSLiteralExpression element) {
super(element, ElementManipulators.getValueTextRange(element));
}
@NotNull
@Override
public String getCanonicalText() {
final String text = super.getCanonicalText();
final int idx = text.indexOf(AngularJSIndexingHandler.AS_CONNECTOR_WITH_SPACES);
if (idx > 0) {
return text.substring(0, idx);
}
return text;
}
@Nullable
@Override
public PsiElement resolveInner() {
return AngularIndexUtil.resolve(getElement().getProject(), AngularControllerIndex.KEY, getCanonicalText());
}
@NotNull
@Override
public Object[] getVariants() {
final Collection<String> controllers = AngularIndexUtil.getAllKeys(AngularControllerIndex.KEY, getElement().getProject());
final LookupElement[] result = new LookupElement[controllers.size()];
int i = 0;
for (String controller : controllers) {
final LookupElement item = JSLookupUtilImpl.createPrioritizedLookupItem(null, controller,
JSLookupPriority.LOCAL_SCOPE_MAX_PRIORITY,
false, false);
result[i] = item;
i++;
}
return result;
}
}
}