package fr.adrienbrault.idea.symfony2plugin.doctrine.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.PhpClass;
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
import fr.adrienbrault.idea.symfony2plugin.config.SymfonyPhpReferenceContributor;
import fr.adrienbrault.idea.symfony2plugin.doctrine.EntityHelper;
import fr.adrienbrault.idea.symfony2plugin.util.MethodMatcher;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class DoctrineRepositoryClassConstantIntention 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 {
PhpClass phpClass = EntityHelper.resolveShortcutName(project, ((StringLiteralExpression) parent).getContents());
if(phpClass == null) {
throw new Exception("Can not resolve model class");
}
PhpElementsUtil.replaceElementWithClassConstant(phpClass, 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, 0)
.withSignature(SymfonyPhpReferenceContributor.REPOSITORY_SIGNATURES)
.withSignature("Doctrine\\Common\\Persistence\\ObjectManager", "find") // @TODO: missing somewhere
.match();
}
@NotNull
@Override
public String getFamilyName() {
return "Symfony";
}
@NotNull
@Override
public String getText() {
return "Doctrine: use class constant";
}
}