package fr.adrienbrault.idea.symfony2plugin.asset;
import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
import org.apache.commons.lang.ArrayUtils;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class AssetGoToDeclarationHandler implements GotoDeclarationHandler {
@Nullable
@Override
public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int i, Editor editor) {
if(!Symfony2ProjectComponent.isEnabled(psiElement)) {
return null;
}
String[] fileExtensionFilterIfValidTag = findValidAssetFilter(psiElement);
if (fileExtensionFilterIfValidTag == null) {
return null;
}
List<PsiElement> psiElements = new ArrayList<>();
for (VirtualFile virtualFile : TwigHelper.resolveAssetsFiles(psiElement.getProject(), psiElement.getText(), fileExtensionFilterIfValidTag)) {
psiElements.add(PsiManager.getInstance(psiElement.getProject()).findFile(virtualFile));
}
return psiElements.toArray(new PsiElement[psiElements.size()]);
}
private String[] findValidAssetFilter(PsiElement psiElement) {
// tag filter
String[] fileExtensionFilterIfValidTag = getFileExtensionFilterIfValidTag(psiElement);
if (fileExtensionFilterIfValidTag != null) {
return fileExtensionFilterIfValidTag;
}
// asset / absolute_url dont have pre filter
if(TwigHelper.getPrintBlockOrTagFunctionPattern("asset", "absolute_url").accepts(psiElement)) {
return (String[]) ArrayUtils.addAll(TwigHelper.CSS_FILES_EXTENSIONS, TwigHelper.JS_FILES_EXTENSIONS);
}
return null;
}
@Nullable
private String[] getFileExtensionFilterIfValidTag(PsiElement psiElement) {
for (String tag: new String[] {"stylesheets", "javascripts"}) {
if (!TwigHelper.getAutocompletableAssetTag(tag).accepts(psiElement)) {
continue;
}
switch (tag) {
case "stylesheets":
return TwigHelper.CSS_FILES_EXTENSIONS;
case "javascripts":
return TwigHelper.JS_FILES_EXTENSIONS;
default:
return null;
}
}
return null;
}
@Nullable
@Override
public String getActionText(DataContext dataContext) {
return null;
}
}