package fr.adrienbrault.idea.symfony2plugin.codeInsight.utils;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.psi.PsiElement;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlText;
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
import com.jetbrains.twig.TwigTokenTypes;
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionContributor;
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar;
import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrarParameter;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.yaml.psi.YAMLScalar;
import java.util.ArrayList;
import java.util.Collection;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class GotoCompletionUtil {
private static final ExtensionPointName<GotoCompletionRegistrar> EXTENSIONS = new ExtensionPointName<>("fr.adrienbrault.idea.symfony2plugin.extension.GotoCompletionRegistrar");
public static Collection<GotoCompletionContributor> getContributors(final PsiElement psiElement) {
final Collection<GotoCompletionContributor> contributors = new ArrayList<>();
GotoCompletionRegistrarParameter registrar = (pattern, contributor) -> {
if(pattern.accepts(psiElement)) {
contributors.add(contributor);
}
};
for(GotoCompletionRegistrar register: EXTENSIONS.getExtensions()) {
register.register(registrar);
}
return contributors;
}
@Nullable
public static String getTextValueForElement(@NotNull PsiElement psiElement) {
PsiElement parent = psiElement.getParent();
String value = null;
if(parent instanceof StringLiteralExpression) {
value = ((StringLiteralExpression) parent).getContents();
} else if(parent instanceof XmlAttributeValue) {
// <foo attr="FOO"/>
value = ((XmlAttributeValue) parent).getValue();
} else if(parent instanceof XmlText) {
// <foo>FOO</foo>
value = ((XmlText) parent).getValue();
} else if(parent instanceof YAMLScalar) {
// foo: foo, foo: 'foo', foo: "foo"
value = ((YAMLScalar) parent).getTextValue();
} else if(psiElement.getNode().getElementType() == TwigTokenTypes.STRING_TEXT) {
// twig: 'foobar'
value = psiElement.getText();
}
if(StringUtils.isBlank(value)) {
return null;
}
return value;
}
/**
* <foo attr="FOO"/>
*/
@Nullable
public static String getXmlAttributeValue(@NotNull PsiElement psiElement) {
PsiElement parent = psiElement.getParent();
if(!(parent instanceof XmlAttributeValue)) {
return null;
}
final String value = ((XmlAttributeValue) parent).getValue();
if(StringUtils.isBlank(value)) {
return null;
}
return value;
}
@Nullable
public static String getStringLiteralValue(@NotNull PsiElement psiElement) {
PsiElement parent = psiElement.getParent();
if(!(parent instanceof StringLiteralExpression)) {
return null;
}
String contents = ((StringLiteralExpression) parent).getContents();
if(StringUtils.isBlank(contents)) {
return null;
}
return contents;
}
}