package fr.adrienbrault.idea.symfony2plugin.form.intention;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
import fr.adrienbrault.idea.symfony2plugin.Symfony2InterfacesUtil;
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
import fr.adrienbrault.idea.symfony2plugin.form.util.FormUtil;
import fr.adrienbrault.idea.symfony2plugin.util.MethodMatcher;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class FormStringToClassConstantIntention extends PsiElementBaseIntentionAction {
@Override
public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement psiElement) throws IncorrectOperationException {
PsiElement parent = psiElement.getParent();
if(!(parent instanceof StringLiteralExpression)) {
return;
}
try {
FormUtil.replaceFormStringAliasWithClassConstant((StringLiteralExpression) parent);
} catch (Exception e) {
HintManager.getInstance().showErrorHint(editor, e.getMessage());
}
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement psiElement) {
if(!Symfony2ProjectComponent.isEnabled(psiElement.getProject())) {
return false;
}
PsiElement parent = psiElement.getParent();
if(!(parent instanceof StringLiteralExpression)) {
return false;
}
String contents = ((StringLiteralExpression) parent).getContents();
if(StringUtils.isBlank(contents)) {
return false;
}
return null != new MethodMatcher.StringParameterMatcher(parent, 1)
.withSignature(Symfony2InterfacesUtil.getFormBuilderInterface())
.match();
}
@NotNull
@Override
public String getFamilyName() {
return "Symfony";
}
@NotNull
@Override
public String getText() {
return "Symfony: use FormType class constant";
}
}