package com.cedricziel.idea.typo3.codeInsight;
import com.cedricziel.idea.typo3.TYPO3CMSIcons;
import com.cedricziel.idea.typo3.container.RouteProvider;
import com.cedricziel.idea.typo3.domain.TYPO3RouteDefinition;
import com.cedricziel.idea.typo3.psi.PhpElementsUtil;
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider;
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
import com.intellij.openapi.project.Project;
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;
import java.util.Collection;
import java.util.List;
public class RouteLineMarkerProvider extends RelatedItemLineMarkerProvider {
@Override
protected void collectNavigationMarkers(@NotNull PsiElement element, Collection<? super RelatedItemLineMarkerInfo> result) {
if (!(element instanceof StringLiteralExpression)) {
return;
}
StringLiteralExpression literalExpression = (StringLiteralExpression) element;
String value = literalExpression.getContents();
if (value.isEmpty()) {
return;
}
PsiElement methodReference = PsiTreeUtil.getParentOfType(element, MethodReference.class);
if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "getAjaxUrl") || PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "buildUriFromRoute")) {
Project project = element.getProject();
RouteProvider routeProvider = new RouteProvider();
routeProvider.collect(project);
if (routeProvider.has(value)) {
List<TYPO3RouteDefinition> definitions = routeProvider.resolve(value);
definitions.forEach(def -> {
NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
.create(TYPO3CMSIcons.ROUTE_ICON)
.setTarget(def.getElement())
.setTooltipText("Navigate to route definition");
result.add(builder.createLineMarkerInfo(element));
});
}
}
}
}