package org.angularjs.findUsages;
import com.intellij.find.findUsages.FindUsagesHandler;
import com.intellij.lang.javascript.findUsages.JavaScriptFindUsagesHandlerFactory;
import com.intellij.lang.javascript.psi.JSCallExpression;
import com.intellij.lang.javascript.psi.ecma6.ES6Decorator;
import com.intellij.lang.javascript.psi.ecmal4.JSAttributeList;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.lang.javascript.psi.stubs.JSElementIndexingData;
import com.intellij.psi.PsiElement;
import org.angularjs.codeInsight.DirectiveUtil;
import org.angularjs.index.AngularIndexUtil;
import org.jetbrains.annotations.NotNull;
/**
* @author Dennis.Ushakov
*/
public class AngularJSFindUsagesHandlerFactory extends JavaScriptFindUsagesHandlerFactory {
@Override
public boolean canFindUsages(@NotNull PsiElement element) {
return DirectiveUtil.getDirective(element) != null || element instanceof JSClass;
}
@Override
public FindUsagesHandler createFindUsagesHandler(@NotNull PsiElement element, boolean forHighlightUsages) {
if (!forHighlightUsages && element instanceof JSClass && AngularIndexUtil.hasAngularJS2(element.getProject())) {
return new JavaScriptFindUsagesHandlerFactory.JavaScriptFindUsagesHandler(element) {
@NotNull
@Override
public PsiElement[] getSecondaryElements() {
JSAttributeList list = ((JSClass)element).getAttributeList();
if (list != null && list.getFirstChild() instanceof ES6Decorator) {
PsiElement call = list.getFirstChild().getLastChild();
if (call instanceof JSCallExpression) {
JSElementIndexingData data = ((JSCallExpression)call).getIndexingData();
if (data != null && data.getImplicitElements() != null) {
return data.getImplicitElements().toArray(PsiElement.EMPTY_ARRAY);
}
}
}
return PsiElement.EMPTY_ARRAY;
}
};
}
return super.createFindUsagesHandler(element, forHighlightUsages);
}
}