package com.cedricziel.idea.typo3.annotation;
import com.cedricziel.idea.typo3.container.RouteProvider;
import com.cedricziel.idea.typo3.psi.PhpElementsUtil;
import com.intellij.lang.annotation.Annotation;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.annotation.Annotator;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.php.lang.psi.elements.MethodReference;
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
import org.jetbrains.annotations.NotNull;
public class RouteAnnotator implements Annotator {
@Override
public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder annotationHolder) {
if (!(psiElement instanceof StringLiteralExpression)) {
return;
}
StringLiteralExpression literalExpression = (StringLiteralExpression) psiElement;
String value = literalExpression.getContents();
if (value.isEmpty()) {
return;
}
PsiElement methodReference = PsiTreeUtil.getParentOfType(psiElement, MethodReference.class);
if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "getAjaxUrl")) {
annotateAjaxRoutes(psiElement, annotationHolder, value);
}
if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "buildUriFromRoute")) {
annotateRoutes(psiElement, annotationHolder, value);
}
}
private void annotateAjaxRoutes(PsiElement psiElement, AnnotationHolder annotationHolder, String value) {
RouteProvider routeProvider = new RouteProvider();
routeProvider.collect(psiElement.getProject());
annotateRoute(psiElement, annotationHolder, value, routeProvider, RouteProvider.ROUTE_TYPE_AJAX);
}
private void annotateRoutes(PsiElement psiElement, AnnotationHolder annotationHolder, String value) {
RouteProvider routeProvider = new RouteProvider();
routeProvider.collect(psiElement.getProject());
annotateRoute(psiElement, annotationHolder, value, routeProvider, RouteProvider.ROUTE_TYPE_BACKEND);
}
private void annotateRoute(PsiElement psiElement, AnnotationHolder annotationHolder, String value, RouteProvider routeProvider, String routeType) {
if (routeProvider.has(value, routeType)) {
TextRange range = new TextRange(psiElement.getTextRange().getStartOffset(), psiElement.getTextRange().getEndOffset());
Annotation annotation = annotationHolder.createInfoAnnotation(range, null);
annotation.setTextAttributes(DefaultLanguageHighlighterColors.LINE_COMMENT);
} else {
TextRange range = new TextRange(psiElement.getTextRange().getStartOffset(), psiElement.getTextRange().getEndOffset());
annotationHolder.createErrorAnnotation(range, "Unresolved route");
}
}
}