package org.angularjs.codeInsight;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.javascript.JSAnalysisHandlersFactory;
import com.intellij.lang.javascript.psi.JSCallExpression;
import com.intellij.lang.javascript.psi.JSExpression;
import com.intellij.lang.javascript.psi.JSReferenceExpression;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.lang.javascript.psi.util.JSClassUtils;
import com.intellij.lang.javascript.validation.JSAnnotatingVisitor;
import com.intellij.lang.javascript.validation.JavaScriptAnnotatingVisitor;
import com.intellij.lang.javascript.validation.fixes.CreateJSFunctionIntentionAction;
import com.intellij.lang.javascript.validation.fixes.CreateJSVariableIntentionAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.ResolveResult;
import org.angularjs.index.AngularJS2IndexingHandler;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class AngularJSAnalysisHandlersFactory extends JSAnalysisHandlersFactory {
@NotNull
@Override
public JSAnnotatingVisitor createAnnotatingVisitor(@NotNull PsiElement psiElement, @NotNull AnnotationHolder holder) {
return new JavaScriptAnnotatingVisitor(psiElement, holder) {
@Override
protected void addCreateFromUsageFixesForCall(JSCallExpression node,
JSReferenceExpression referenceExpression,
ResolveResult[] resolveResults,
List<LocalQuickFix> quickFixes) {
if (referenceExpression.getQualifier() != null) return;
JSClass directive = AngularJS2IndexingHandler.findDirectiveClass(node);
if (directive != null) {
quickFixes.add(new CreateJSFunctionIntentionAction(referenceExpression.getReferencedName(), true) {
@Override
protected void applyFix(Project project, PsiElement psiElement, PsiFile file, Editor editor) {
JSClass directive = AngularJS2IndexingHandler.findDirectiveClass(psiElement);
assert directive != null;
doApplyFix(project, directive, directive.getContainingFile(), null, null);
}
@NotNull
@Override
protected Pair<JSReferenceExpression, PsiElement> calculateAnchors(PsiElement psiElement) {
return Pair.create(referenceExpression, psiElement.getLastChild());
}
@Override
protected void writeFunctionAndName(Template template,
String createdMethodName,
PsiFile file,
JSClass clazz,
JSReferenceExpression referenceExpression) {
template.addTextSegment(JSClassUtils.createClassFunctionName(createdMethodName, file));
}
});
}
}
@Override
protected boolean addCreateFromUsageFixes(JSReferenceExpression referenceExpression,
ResolveResult[] resolveResults,
List<LocalQuickFix> quickFixes,
boolean inTypeContext,
boolean ecma) {
if (referenceExpression.getQualifier() != null) return inTypeContext;
JSClass directive = AngularJS2IndexingHandler.findDirectiveClass(referenceExpression);
if (directive != null) {
quickFixes.add(new CreateJSVariableIntentionAction(referenceExpression.getReferencedName(), true, false) {
@Override
protected void applyFix(Project project, PsiElement psiElement, PsiFile file, Editor editor) {
JSClass directive = AngularJS2IndexingHandler.findDirectiveClass(psiElement);
assert directive != null;
doApplyFix(project, directive, directive.getContainingFile(), null, null);
}
@NotNull
@Override
protected Pair<JSReferenceExpression, PsiElement> calculateAnchors(PsiElement psiElement) {
return Pair.create(referenceExpression, psiElement.getLastChild());
}
@Override
protected JSExpression addAccessModifier(Template template,
JSReferenceExpression referenceExpression,
PsiFile file,
boolean staticContext,
JSClass contextClass) {
return referenceExpression.getQualifier();
}
});
}
return inTypeContext;
}
};
}
}