package com.cedricziel.idea.typo3.codeInsight;
import com.cedricziel.idea.typo3.TYPO3CMSIcons;
import com.cedricziel.idea.typo3.container.RouteProvider;
import com.cedricziel.idea.typo3.psi.PhpElementsUtil;
import com.intellij.codeInsight.completion.*;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ProcessingContext;
import com.jetbrains.php.lang.psi.elements.MethodReference;
import com.jetbrains.php.lang.psi.elements.ParameterList;
import org.jetbrains.annotations.NotNull;
public class RoutesCompletionContributor extends CompletionContributor {
public RoutesCompletionContributor() {
extend(CompletionType.BASIC,
PlatformPatterns.psiElement(),
new CompletionProvider<CompletionParameters>() {
public void addCompletions(@NotNull CompletionParameters parameters,
ProcessingContext context,
@NotNull CompletionResultSet resultSet) {
PsiElement element = parameters.getPosition().getParent();
ParameterList parameterList = PsiTreeUtil.getParentOfType(element, ParameterList.class);
if (parameterList == null) {
return;
}
PsiElement methodReference = PsiTreeUtil.getParentOfType(element, MethodReference.class);
if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "getAjaxUrl")) {
completeAjaxRoutes(element, resultSet);
}
if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "buildUriFromRoute")) {
completeRoutes(element, resultSet);
}
}
}
);
}
private void completeAjaxRoutes(PsiElement element, CompletionResultSet resultSet) {
RouteProvider routeProvider = getRouteProvider(element);
routeProvider.ajax().forEach(route -> {
LookupElementBuilder lookupElement = LookupElementBuilder
.create(route.getName())
.appendTailText(route.getPath(), true)
.withIcon(TYPO3CMSIcons.ROUTE_ICON);
resultSet.addElement(lookupElement);
});
}
private void completeRoutes(PsiElement element, CompletionResultSet resultSet) {
RouteProvider routeProvider = getRouteProvider(element);
routeProvider.all().forEach(route -> {
LookupElementBuilder lookupElement = LookupElementBuilder
.create(route.getName())
.appendTailText(route.getPath(), true)
.withIcon(TYPO3CMSIcons.ROUTE_ICON);
resultSet.addElement(lookupElement);
});
}
@NotNull
private RouteProvider getRouteProvider(PsiElement element) {
RouteProvider routeProvider = new RouteProvider();
routeProvider.collect(element.getProject());
return routeProvider;
}
}