From d9ad1e4cdf8dad5bff281dbbf4105ff49b7221f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20W=C3=B3js?= Date: Sun, 1 Aug 2021 11:39:44 +0200 Subject: [PATCH 1/2] Fixed #1667: Rename refactoring ignores constants inside yaml files (tests) --- .../yaml/YamlReferenceContributorTest.java | 39 +++++++++++++++++++ .../fixtures/YamlReferenceContributor.php | 14 +++++++ 2 files changed, 53 insertions(+) create mode 100644 src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/YamlReferenceContributorTest.java create mode 100644 src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/fixtures/YamlReferenceContributor.php diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/YamlReferenceContributorTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/YamlReferenceContributorTest.java new file mode 100644 index 000000000..6d25947e6 --- /dev/null +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/YamlReferenceContributorTest.java @@ -0,0 +1,39 @@ +package fr.adrienbrault.idea.symfony2plugin.tests.config.yaml; + +import com.intellij.patterns.PlatformPatterns; +import com.jetbrains.php.lang.psi.elements.Field; +import com.jetbrains.php.lang.psi.elements.PhpDefine; +import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; +import org.jetbrains.yaml.YAMLFileType; + +public class YamlReferenceContributorTest extends SymfonyLightCodeInsightFixtureTestCase { + + public void setUp() throws Exception { + super.setUp(); + myFixture.copyFileToProject("YamlReferenceContributor.php"); + } + + public String getTestDataPath() { + return "src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/fixtures"; + } + + public void testConstantProvidesReferences() { + assertReferenceMatchOnParent( + YAMLFileType.YML, + "services:\n" + + " app.service.example:\n" + + " arguments:\n" + + " - !php/const CONST_FOO\n", + PlatformPatterns.psiElement(PhpDefine.class).withName("CONST_FOO") + ); + + assertReferenceMatchOnParent( + YAMLFileType.YML, + "services:\n" + + " app.service.example:\n" + + " arguments:\n" + + " - !php/const Foo\\Bar::FOO\n", + PlatformPatterns.psiElement(Field.class).withName("FOO") + ); + } +} diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/fixtures/YamlReferenceContributor.php b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/fixtures/YamlReferenceContributor.php new file mode 100644 index 000000000..435a4d6f6 --- /dev/null +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/fixtures/YamlReferenceContributor.php @@ -0,0 +1,14 @@ + Date: Sun, 1 Aug 2021 12:26:46 +0200 Subject: [PATCH 2/2] Fixed #1667: Rename refactoring ignores constants inside yaml files --- .../config/yaml/ConstantYamlReference.java | 50 +++++++++++++++++++ .../config/yaml/YamlReferenceContributor.java | 41 +++++++++++++++ src/main/resources/META-INF/plugin.xml | 1 + 3 files changed, 92 insertions(+) create mode 100644 src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/ConstantYamlReference.java create mode 100644 src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlReferenceContributor.java diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/ConstantYamlReference.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/ConstantYamlReference.java new file mode 100644 index 000000000..dc3478414 --- /dev/null +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/ConstantYamlReference.java @@ -0,0 +1,50 @@ +package fr.adrienbrault.idea.symfony2plugin.config.yaml; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementResolveResult; +import com.intellij.psi.PsiPolyVariantReferenceBase; +import com.intellij.psi.ResolveResult; +import com.intellij.util.IncorrectOperationException; +import fr.adrienbrault.idea.symfony2plugin.dic.container.util.ServiceContainerUtil; +import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.yaml.psi.YAMLScalar; + +public class ConstantYamlReference extends PsiPolyVariantReferenceBase { + + public ConstantYamlReference(@NotNull YAMLScalar element) { + super(element); + } + + @NotNull + @Override + public ResolveResult[] multiResolve(boolean incompleteCode) { + var constantName = getElement().getTextValue(); + if (StringUtils.isBlank(constantName)) { + return ResolveResult.EMPTY_ARRAY; + } + + return PsiElementResolveResult.createResults( + ServiceContainerUtil.getTargetsForConstant(getElement().getProject(), constantName) + ); + } + + @Override + public PsiElement handleElementRename(@NotNull String newElementName) throws IncorrectOperationException { + var constantName = getValue(); + if (isClassConst(constantName)) { + newElementName = getClassName(constantName) + "::" + newElementName; + } + + return super.handleElementRename(newElementName); + } + + private boolean isClassConst(@NotNull String value) { + return value.contains("::"); + } + + @NotNull + private String getClassName(@NotNull String value) { + return value.substring(0, value.indexOf("::")); + } +} diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlReferenceContributor.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlReferenceContributor.java new file mode 100644 index 000000000..eca5e5d44 --- /dev/null +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlReferenceContributor.java @@ -0,0 +1,41 @@ +package fr.adrienbrault.idea.symfony2plugin.config.yaml; + +import com.intellij.patterns.PlatformPatterns; +import com.intellij.patterns.StandardPatterns; +import com.intellij.psi.*; +import com.intellij.util.ProcessingContext; +import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.yaml.psi.YAMLScalar; + +public class YamlReferenceContributor extends PsiReferenceContributor { + private static final String TAG_PHP_CONST = "!php/const"; + + @Override + public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) { + registrar.registerReferenceProvider( + PlatformPatterns.psiElement(YAMLScalar.class) + .withText(StandardPatterns.string() + .contains(TAG_PHP_CONST) + ), + new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + if (!Symfony2ProjectComponent.isEnabled(element)) { + return PsiReference.EMPTY_ARRAY; + } + + var scalar = (YAMLScalar)element; + if (scalar.getTextValue().isEmpty()) { + return PsiReference.EMPTY_ARRAY; + } + + return new PsiReference[]{ + new ConstantYamlReference(scalar) + }; + } + } + ); + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 7d215b858..ceae451e0 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -170,6 +170,7 @@ +