From fba67cfd43bd76e237b83468ac06eb238513dccc Mon Sep 17 00:00:00 2001 From: Daniel Espendiller Date: Fri, 6 May 2022 16:37:11 +0200 Subject: [PATCH] #1285 migrate template file annotator to inspection and support php attributes --- ...AnnotationPhpAttributeLocalInspection.java | 147 ++++++++++++++++++ .../templating/util/TwigUtil.java | 2 + .../TemplateAnnotationAnnotator.java | 104 ------------- .../util/PhpPsiAttributesUtil.java | 1 + src/main/resources/META-INF/annotation.xml | 1 - src/main/resources/META-INF/plugin.xml | 7 + ...AnnotationPhpAttributeLocalInspection.html | 5 + ...tationPhpAttributeLocalInspectionTest.java | 142 +++++++++++++++++ .../inspection/fixtures/classes.php | 7 + .../fixtures/controller_method.php | 0 .../tests/templating/util/TwigUtilTest.java | 12 ++ .../TemplateAnnotationAnnotatorTest.java | 119 -------------- .../twig/annotation/fixtures/classes.php | 8 - 13 files changed, 323 insertions(+), 232 deletions(-) create mode 100644 src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/inspection/TemplateExistsAnnotationPhpAttributeLocalInspection.java delete mode 100644 src/main/java/fr/adrienbrault/idea/symfony2plugin/twig/annotation/TemplateAnnotationAnnotator.java create mode 100644 src/main/resources/inspectionDescriptions/TemplateExistsAnnotationPhpAttributeLocalInspection.html create mode 100644 src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/TemplateExistsAnnotationPhpAttributeLocalInspectionTest.java rename src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/{twig/annotation => templating/inspection}/fixtures/controller_method.php (100%) delete mode 100644 src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/TemplateAnnotationAnnotatorTest.java delete mode 100644 src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/fixtures/classes.php diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/inspection/TemplateExistsAnnotationPhpAttributeLocalInspection.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/inspection/TemplateExistsAnnotationPhpAttributeLocalInspection.java new file mode 100644 index 000000000..1d23798bf --- /dev/null +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/inspection/TemplateExistsAnnotationPhpAttributeLocalInspection.java @@ -0,0 +1,147 @@ +package fr.adrienbrault.idea.symfony2plugin.templating.inspection; + +import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.containers.ContainerUtil; +import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment; +import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag; +import com.jetbrains.php.lang.psi.elements.Method; +import com.jetbrains.php.lang.psi.elements.PhpAttribute; +import com.jetbrains.php.lang.psi.elements.PhpAttributesList; +import com.jetbrains.php.lang.psi.elements.PhpPsiElement; +import de.espend.idea.php.annotation.dict.PhpDocTagAnnotation; +import de.espend.idea.php.annotation.util.AnnotationUtil; +import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; +import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil; +import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil; +import fr.adrienbrault.idea.symfony2plugin.util.PhpPsiAttributesUtil; +import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; + +/** + * @author Daniel Espendiller + */ +public class TemplateExistsAnnotationPhpAttributeLocalInspection extends LocalInspectionTool { + @NotNull + public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, boolean isOnTheFly) { + return new PsiElementVisitor() { + @Override + public void visitElement(@NotNull PsiElement element) { + if (element instanceof PhpDocTag) { + annotate((PhpDocTag) element, holder); + } + + if (element instanceof PhpAttribute) { + String fqn = ((PhpAttribute) element).getFQN(); + if (fqn != null && PhpElementsUtil.isInstanceOf(element.getProject(), fqn, TwigUtil.TEMPLATE_ANNOTATION_CLASS)) { + annotate((PhpAttribute) element, holder); + } + } + + super.visitElement(element); + } + }; + } + + private void annotate(@NotNull PhpAttribute phpAttribute, @NotNull ProblemsHolder holder) { + Collection templateNames = new HashSet<>(); + + if (phpAttribute.getArguments().isEmpty()) { + PsiElement phpAttributesList = phpAttribute.getParent(); + if (phpAttributesList instanceof PhpAttributesList) { + PsiElement method = phpAttributesList.getParent(); + if (method instanceof Method) { + templateNames.addAll(Arrays.asList(TwigUtil.getControllerMethodShortcut((Method) method))); + } + } + } else { + String attributeDefaultValue = PhpPsiAttributesUtil.getAttributeValueByNameAsStringWithDefaultParameterFallback(phpAttribute, "template"); + if (attributeDefaultValue != null) { + templateNames.add(attributeDefaultValue); + } + } + + if(!templateNames.isEmpty()) { + extracted(phpAttribute, holder, templateNames); + } + } + + private void annotate(@NotNull PhpDocTag phpDocTag, @NotNull ProblemsHolder holder) { + if(!Symfony2ProjectComponent.isEnabled(phpDocTag.getProject())) { + return; + } + + PhpDocTagAnnotation phpDocAnnotationContainer = AnnotationUtil.getPhpDocAnnotationContainer(phpDocTag); + if (phpDocAnnotationContainer == null || !PhpElementsUtil.isEqualClassName(phpDocAnnotationContainer.getPhpClass(), TwigUtil.TEMPLATE_ANNOTATION_CLASS)) { + return; + } + + PhpPsiElement phpDocAttrList = phpDocTag.getFirstPsiChild(); + if(phpDocAttrList == null) { + return; + } + + Collection templateNames = new HashSet<>(); + + @Nullable String matcher = AnnotationUtil.getPropertyValueOrDefault(phpDocTag, "template"); + if (matcher != null) { + templateNames.add(matcher); + } else { + + // find template name on last method + PhpDocComment docComment = PsiTreeUtil.getParentOfType(phpDocTag, PhpDocComment.class); + if(null == docComment) { + return; + } + Method method = PsiTreeUtil.getNextSiblingOfType(docComment, Method.class); + if(null == method) { + return; + } + + templateNames.addAll(Arrays.asList(TwigUtil.getControllerMethodShortcut(method))); + } + + if(!templateNames.isEmpty()) { + extracted(phpDocTag, holder, templateNames); + } + } + + private void extracted(@NotNull PsiElement target, @NotNull ProblemsHolder holder, @NotNull Collection templateNames) { + if(templateNames.size() == 0) { + return; + } + + for (String templateName : templateNames) { + if (TwigUtil.getTemplateFiles(holder.getProject(), templateName).size() > 0) { + return; + } + } + + // find html target, as this this our first priority for end users condition + String templateName = ContainerUtil.find(templateNames, s -> s.toLowerCase().endsWith(".html.twig")); + + // fallback on first item + if(templateName == null) { + templateName = templateNames.iterator().next(); + } + + Collection quickFixes = new ArrayList<>(); + quickFixes.add(new TemplateCreateByNameLocalQuickFix(templateName)); + + if (StringUtils.isNotBlank(templateName)) { + quickFixes.add(new TemplateGuessTypoQuickFix(templateName)); + } + + holder.registerProblem(target, "Twig: Missing Template", quickFixes.toArray(new LocalQuickFix[0])); + } +} diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigUtil.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigUtil.java index 759683bbd..c8f9c6be9 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigUtil.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigUtil.java @@ -211,9 +211,11 @@ public static String[] getControllerMethodShortcut(@NotNull Method method) { shortcutName + ".html.twig", shortcutName + ".json.twig", shortcutName + ".xml.twig", + shortcutName + ".text.twig", // emails shortcutNameForOldNotation + ".html.twig", shortcutNameForOldNotation + ".json.twig", shortcutNameForOldNotation + ".xml.twig", + shortcutNameForOldNotation + ".text.twig", // emails }; } diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/twig/annotation/TemplateAnnotationAnnotator.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/twig/annotation/TemplateAnnotationAnnotator.java deleted file mode 100644 index 368ddacaf..000000000 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/twig/annotation/TemplateAnnotationAnnotator.java +++ /dev/null @@ -1,104 +0,0 @@ -package fr.adrienbrault.idea.symfony2plugin.twig.annotation; - -import com.intellij.lang.annotation.AnnotationBuilder; -import com.intellij.lang.annotation.HighlightSeverity; -import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.containers.ContainerUtil; -import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment; -import com.jetbrains.php.lang.psi.elements.Method; -import com.jetbrains.php.lang.psi.elements.PhpPsiElement; -import de.espend.idea.php.annotation.extension.PhpAnnotationDocTagAnnotator; -import de.espend.idea.php.annotation.extension.parameter.PhpAnnotationDocTagAnnotatorParameter; -import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; -import fr.adrienbrault.idea.symfony2plugin.templating.inspection.TemplateCreateByNameLocalQuickFix; -import fr.adrienbrault.idea.symfony2plugin.templating.inspection.TemplateGuessTypoQuickFix; -import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil; -import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil; -import org.apache.commons.lang.StringUtils; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author Daniel Espendiller - */ -public class TemplateAnnotationAnnotator implements PhpAnnotationDocTagAnnotator { - - @Override - public void annotate(PhpAnnotationDocTagAnnotatorParameter parameter) { - - if(!Symfony2ProjectComponent.isEnabled(parameter.getProject()) || - !PhpElementsUtil.isEqualClassName(parameter.getAnnotationClass(), TwigUtil.TEMPLATE_ANNOTATION_CLASS)) - { - return; - } - - PhpPsiElement phpDocAttrList = parameter.getPhpDocTag().getFirstPsiChild(); - if(phpDocAttrList == null) { - return; - } - - String tagValue = phpDocAttrList.getText(); - Collection templateNames = new HashSet<>(); - - // @Template("FooBundle:Folder:foo.html.twig") - // @Template("FooBundle:Folder:foo.html.twig", "asdas") - // @Template(tag="name") - Matcher matcher = Pattern.compile("\\(\"(.*)\"").matcher(tagValue); - if (matcher.find()) { - templateNames.add(matcher.group(1)); - } else { - - // find template name on last method - PhpDocComment docComment = PsiTreeUtil.getParentOfType(parameter.getPhpDocTag(), PhpDocComment.class); - if(null == docComment) { - return; - } - - Method method = PsiTreeUtil.getNextSiblingOfType(docComment, Method.class); - if(null == method || (!method.getName().endsWith("Action") && !method.getName().equalsIgnoreCase("__invoke"))) { - return; - } - - templateNames.addAll(Arrays.asList(TwigUtil.getControllerMethodShortcut(method))); - } - - if(templateNames.size() == 0) { - return; - } - - for (String templateName : templateNames) { - if (TwigUtil.getTemplateFiles(parameter.getProject(), templateName).size() > 0) { - return; - } - } - - // find html target, as this this our first priority for end users condition - String templateName = ContainerUtil.find(templateNames, s -> s.toLowerCase().endsWith(".html.twig")); - - // fallback on first item - if(templateName == null) { - templateName = templateNames.iterator().next(); - } - - // add fix to doc tag - PsiElement firstChild = parameter.getPhpDocTag().getFirstChild(); - if(null == firstChild) { - return; - } - - @NotNull AnnotationBuilder warningAnnotation = parameter.getHolder().newAnnotation(HighlightSeverity.WARNING, "Twig: Missing Template") - .withFix(new TemplateCreateByNameLocalQuickFix(templateName)); - - if (StringUtils.isNotBlank(templateName)) { - warningAnnotation = warningAnnotation.withFix(new TemplateGuessTypoQuickFix(templateName)); - } - - warningAnnotation.create(); - } -} diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpPsiAttributesUtil.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpPsiAttributesUtil.java index ee39cb5e8..8fe5f467d 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpPsiAttributesUtil.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpPsiAttributesUtil.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.Collections; +import java.util.List; /** * Helpers for PHP 8 Attributes psi access diff --git a/src/main/resources/META-INF/annotation.xml b/src/main/resources/META-INF/annotation.xml index 45e412378..bab82455f 100644 --- a/src/main/resources/META-INF/annotation.xml +++ b/src/main/resources/META-INF/annotation.xml @@ -4,7 +4,6 @@ - diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 3af9b4ddb..65bb7ea49 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -483,6 +483,13 @@ language="Twig" implementationClass="fr.adrienbrault.idea.symfony2plugin.templating.inspection.TwigAssetsTagMissingInspection"/> + + fr.adrienbrault.idea.symfony2plugin.intentions.php.PhpServiceIntention PHP diff --git a/src/main/resources/inspectionDescriptions/TemplateExistsAnnotationPhpAttributeLocalInspection.html b/src/main/resources/inspectionDescriptions/TemplateExistsAnnotationPhpAttributeLocalInspection.html new file mode 100644 index 000000000..c09576e0f --- /dev/null +++ b/src/main/resources/inspectionDescriptions/TemplateExistsAnnotationPhpAttributeLocalInspection.html @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/TemplateExistsAnnotationPhpAttributeLocalInspectionTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/TemplateExistsAnnotationPhpAttributeLocalInspectionTest.java new file mode 100644 index 000000000..73e22cfff --- /dev/null +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/TemplateExistsAnnotationPhpAttributeLocalInspectionTest.java @@ -0,0 +1,142 @@ +package fr.adrienbrault.idea.symfony2plugin.tests.templating.inspection; + +import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; +import fr.adrienbrault.idea.symfony2plugin.templating.inspection.TemplateExistsAnnotationPhpAttributeLocalInspection; + +/** + * @author Daniel Espendiller + * @see TemplateExistsAnnotationPhpAttributeLocalInspection + */ +public class TemplateExistsAnnotationPhpAttributeLocalInspectionTest extends SymfonyLightCodeInsightFixtureTestCase { + public void setUp() throws Exception { + super.setUp(); + myFixture.copyFileToProject("classes.php"); + } + + public String getTestDataPath() { + return "src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/fixtures"; + } + + public void testThatTemplateCreationAnnotationProvidesQuickfix() { + assertLocalInspectionContains("foobar.php", "late(\"foobar.html.twig\")\n" + + " */\n" + + " public function fooAction()\n" + + " {\n" + + " }\n" + + "}\n" + + "", + "Twig: Missing Template" + ); + + assertLocalInspectionContains("foobar.php", "late(template=\"foobar.html.twig\")\n" + + " */\n" + + " public function fooAction()\n" + + " {\n" + + " }\n" + + "}\n" + + "", + "Twig: Missing Template" + ); + + assertLocalInspectionContains("foobar.php", "late(\"foobar.html.twig\")\n" + + " */\n" + + " #[Route]\n" + + " public function fooAction()\n" + + " {\n" + + " }\n" + + "}\n" + + "", + "Twig: Missing Template" + ); + } + + public void testThatTemplateCreationAnnotationProvidesQuickfixForPhpAttribute() { + assertLocalInspectionContains("foobar.php", "late(\"foobar.html.twig\")]\n" + + " public function fooAction()\n" + + " {\n" + + " }\n" + + "}\n" + + "", + "Twig: Missing Template" + ); + + assertLocalInspectionContains("foobar.php", "late(template: \"foobar.html.twig\")]\n" + + " public function fooAction()\n" + + " {\n" + + " }\n" + + "}\n" + + "", + "Twig: Missing Template" + ); + } + + public void testThatTemplateCreationForInvokeMethodProvidesQuickfixForPhpAttribute() { + myFixture.copyFileToProject("controller_method.php"); + + assertLocalInspectionContains("foobar.php", "late(\"foobar.html.twig\")]\n" + + " public function __invoke()\n" + + " {\n" + + " }\n" + + "}\n" + + "", + "Twig: Missing Template" + ); + } + + public void testThatTemplateCreationForInvokeMethodProvidesQuickfix() { + myFixture.copyFileToProject("controller_method.php"); + + assertLocalInspectionContains("foobar.php", "late()\n" + + " */\n" + + " public function __invoke()\n" + + " {\n" + + " }\n" + + "}\n" + + "", + "Twig: Missing Template" + ); + } +} diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/fixtures/classes.php b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/fixtures/classes.php index 6c078c9fd..cc98a3bf2 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/fixtures/classes.php +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/fixtures/classes.php @@ -44,4 +44,11 @@ abstract class BarIterator implements \Iterator abstract class BarArrayIterator extends \ArrayIterator { } +} + +namespace Sensio\Bundle\FrameworkExtraBundle\Configuration +{ + class Template + { + } } \ No newline at end of file diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/fixtures/controller_method.php b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/fixtures/controller_method.php similarity index 100% rename from src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/fixtures/controller_method.php rename to src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/inspection/fixtures/controller_method.php diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/util/TwigUtilTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/util/TwigUtilTest.java index 33b77a558..5e23fe568 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/util/TwigUtilTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/util/TwigUtilTest.java @@ -436,6 +436,12 @@ public void testGetControllerMethodShortcutForInvoke() { assertContainsElements(strings, "FooBundle::foobar.html.twig"); assertContainsElements(strings, "FooBundle::foobar.json.twig"); assertContainsElements(strings, "FooBundle::foobar.xml.twig"); + assertContainsElements(strings, "FooBundle::foobar.text.twig"); + + assertContainsElements(strings, "FooBundle::Foobar.html.twig"); + assertContainsElements(strings, "FooBundle::Foobar.json.twig"); + assertContainsElements(strings, "FooBundle::Foobar.xml.twig"); + assertContainsElements(strings, "FooBundle::Foobar.text.twig"); } public void testGetControllerMethodShortcutForInvokeWithSnakeCase() { @@ -457,6 +463,12 @@ public void testGetControllerMethodShortcutForInvokeWithSnakeCase() { assertContainsElements(strings, "FooBundle::foo_bar.html.twig"); assertContainsElements(strings, "FooBundle::foo_bar.json.twig"); assertContainsElements(strings, "FooBundle::foo_bar.xml.twig"); + assertContainsElements(strings, "FooBundle::foo_bar.text.twig"); + + assertContainsElements(strings, "FooBundle::FooBar.html.twig"); + assertContainsElements(strings, "FooBundle::FooBar.json.twig"); + assertContainsElements(strings, "FooBundle::FooBar.xml.twig"); + assertContainsElements(strings, "FooBundle::FooBar.text.twig"); } public void testFindTwigFileController() { diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/TemplateAnnotationAnnotatorTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/TemplateAnnotationAnnotatorTest.java deleted file mode 100644 index c62bed97f..000000000 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/TemplateAnnotationAnnotatorTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package fr.adrienbrault.idea.symfony2plugin.tests.twig.annotation; - -import com.intellij.codeInsight.daemon.impl.AnnotationHolderImpl; -import com.intellij.lang.annotation.AnnotationSession; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.jetbrains.php.PhpIndex; -import com.jetbrains.php.lang.PhpFileType; -import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag; -import de.espend.idea.php.annotation.extension.parameter.PhpAnnotationDocTagAnnotatorParameter; -import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil; -import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; -import fr.adrienbrault.idea.symfony2plugin.twig.annotation.TemplateAnnotationAnnotator; - -/** - * @author Daniel Espendiller - * @see TemplateAnnotationAnnotator - */ -public class TemplateAnnotationAnnotatorTest extends SymfonyLightCodeInsightFixtureTestCase { - public void setUp() throws Exception { - super.setUp(); - myFixture.copyFileToProject("classes.php"); - } - - public String getTestDataPath() { - return "src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/fixtures"; - } - - /** - * @see TemplateAnnotationAnnotator#annotate - */ - public void testThatTemplateCreationAnnotationProvidesQuickfix() { - // AnnotationHolder.createWarningAnnotation() is replaced / deprecated; fix on annotation plugin needed - if (true) { - return; - } - - PsiFile psiFile = myFixture.configureByText("foobar.php", "late(\"foobar.html.twig\")\n" + - " */\n" + - " public function fooAction()\n" + - " {\n" + - " }\n" + - "}\n" + - "" - ); - - PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); - PsiElement phpDocTag = psiElement.getParent(); - - AnnotationHolderImpl annotations = new AnnotationHolderImpl(new AnnotationSession(psiFile)); - - new TemplateAnnotationAnnotator().annotate(new PhpAnnotationDocTagAnnotatorParameter( - PhpIndex.getInstance(getProject()).getAnyByFQN(TwigUtil.TEMPLATE_ANNOTATION_CLASS).iterator().next(), - (PhpDocTag) phpDocTag, - annotations - )); - - assertNotNull( - annotations.stream().findFirst().filter(annotation -> annotation.getMessage().contains("Create Template")) - ); - } - - /** - * @see TemplateAnnotationAnnotator#annotate - */ - public void testThatTemplateCreationForInvokeMethodProvidesQuickfix() { - // AnnotationHolder.createWarningAnnotation() is replaced / deprecated; fix on annotation plugin needed - if (true) { - return; - } - - myFixture.copyFileToProject("controller_method.php"); - - myFixture.configureByText(PhpFileType.INSTANCE, "voke() {}\n" + - "" + - "}\n" - ); - - PsiFile psiFile = myFixture.configureByText("foobar.php", "late()\n" + - " */\n" + - " public function __invoke()\n" + - " {\n" + - " }\n" + - "}\n" + - "" - ); - - PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); - PsiElement phpDocTag = psiElement.getParent(); - - AnnotationHolderImpl annotations = new AnnotationHolderImpl(new AnnotationSession(psiFile)); - - new TemplateAnnotationAnnotator().annotate(new PhpAnnotationDocTagAnnotatorParameter( - PhpIndex.getInstance(getProject()).getAnyByFQN(TwigUtil.TEMPLATE_ANNOTATION_CLASS).iterator().next(), - (PhpDocTag) phpDocTag, - annotations - )); - - assertNotNull( - annotations.stream().findFirst().filter(annotation -> annotation.getMessage().contains("Create Template")) - ); - } -} diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/fixtures/classes.php b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/fixtures/classes.php deleted file mode 100644 index 98ee4b16e..000000000 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/twig/annotation/fixtures/classes.php +++ /dev/null @@ -1,8 +0,0 @@ -