Skip to content

Commit 6ec4b13

Browse files
authored
Merge pull request #1683 from adamwojs/issue_1667
Fixed #1667: Rename refactoring ignores constants inside yaml files
2 parents 8a6621c + a6fb4b4 commit 6ec4b13

File tree

5 files changed

+145
-0
lines changed

5 files changed

+145
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package fr.adrienbrault.idea.symfony2plugin.config.yaml;
2+
3+
import com.intellij.psi.PsiElement;
4+
import com.intellij.psi.PsiElementResolveResult;
5+
import com.intellij.psi.PsiPolyVariantReferenceBase;
6+
import com.intellij.psi.ResolveResult;
7+
import com.intellij.util.IncorrectOperationException;
8+
import fr.adrienbrault.idea.symfony2plugin.dic.container.util.ServiceContainerUtil;
9+
import org.apache.commons.lang.StringUtils;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.yaml.psi.YAMLScalar;
12+
13+
public class ConstantYamlReference extends PsiPolyVariantReferenceBase<YAMLScalar> {
14+
15+
public ConstantYamlReference(@NotNull YAMLScalar element) {
16+
super(element);
17+
}
18+
19+
@NotNull
20+
@Override
21+
public ResolveResult[] multiResolve(boolean incompleteCode) {
22+
var constantName = getElement().getTextValue();
23+
if (StringUtils.isBlank(constantName)) {
24+
return ResolveResult.EMPTY_ARRAY;
25+
}
26+
27+
return PsiElementResolveResult.createResults(
28+
ServiceContainerUtil.getTargetsForConstant(getElement().getProject(), constantName)
29+
);
30+
}
31+
32+
@Override
33+
public PsiElement handleElementRename(@NotNull String newElementName) throws IncorrectOperationException {
34+
var constantName = getValue();
35+
if (isClassConst(constantName)) {
36+
newElementName = getClassName(constantName) + "::" + newElementName;
37+
}
38+
39+
return super.handleElementRename(newElementName);
40+
}
41+
42+
private boolean isClassConst(@NotNull String value) {
43+
return value.contains("::");
44+
}
45+
46+
@NotNull
47+
private String getClassName(@NotNull String value) {
48+
return value.substring(0, value.indexOf("::"));
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package fr.adrienbrault.idea.symfony2plugin.config.yaml;
2+
3+
import com.intellij.patterns.PlatformPatterns;
4+
import com.intellij.patterns.StandardPatterns;
5+
import com.intellij.psi.*;
6+
import com.intellij.util.ProcessingContext;
7+
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.jetbrains.yaml.psi.YAMLScalar;
10+
11+
public class YamlReferenceContributor extends PsiReferenceContributor {
12+
private static final String TAG_PHP_CONST = "!php/const";
13+
14+
@Override
15+
public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
16+
registrar.registerReferenceProvider(
17+
PlatformPatterns.psiElement(YAMLScalar.class)
18+
.withText(StandardPatterns.string()
19+
.contains(TAG_PHP_CONST)
20+
),
21+
new PsiReferenceProvider() {
22+
@NotNull
23+
@Override
24+
public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
25+
if (!Symfony2ProjectComponent.isEnabled(element)) {
26+
return PsiReference.EMPTY_ARRAY;
27+
}
28+
29+
var scalar = (YAMLScalar)element;
30+
if (scalar.getTextValue().isEmpty()) {
31+
return PsiReference.EMPTY_ARRAY;
32+
}
33+
34+
return new PsiReference[]{
35+
new ConstantYamlReference(scalar)
36+
};
37+
}
38+
}
39+
);
40+
}
41+
}

src/main/resources/META-INF/plugin.xml

+1
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@
170170
<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.routing.PhpRouteReferenceContributor"/>
171171
<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.config.xml.XmlReferenceContributor"/>
172172
<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.config.php.PhpConfigReferenceContributor"/>
173+
<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.config.yaml.YamlReferenceContributor"/>
173174
<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.form.FormTypeReferenceContributor"/>
174175
<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.util.DocHashTagReferenceContributor"/>
175176
<psi.referenceContributor implementation="fr.adrienbrault.idea.symfony2plugin.util.MethodParameterReferenceContributor"/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package fr.adrienbrault.idea.symfony2plugin.tests.config.yaml;
2+
3+
import com.intellij.patterns.PlatformPatterns;
4+
import com.jetbrains.php.lang.psi.elements.Field;
5+
import com.jetbrains.php.lang.psi.elements.PhpDefine;
6+
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
7+
import org.jetbrains.yaml.YAMLFileType;
8+
9+
public class YamlReferenceContributorTest extends SymfonyLightCodeInsightFixtureTestCase {
10+
11+
public void setUp() throws Exception {
12+
super.setUp();
13+
myFixture.copyFileToProject("YamlReferenceContributor.php");
14+
}
15+
16+
public String getTestDataPath() {
17+
return "src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/fixtures";
18+
}
19+
20+
public void testConstantProvidesReferences() {
21+
assertReferenceMatchOnParent(
22+
YAMLFileType.YML,
23+
"services:\n" +
24+
" app.service.example:\n" +
25+
" arguments:\n" +
26+
" - !php/const CONST_<caret>FOO\n",
27+
PlatformPatterns.psiElement(PhpDefine.class).withName("CONST_FOO")
28+
);
29+
30+
assertReferenceMatchOnParent(
31+
YAMLFileType.YML,
32+
"services:\n" +
33+
" app.service.example:\n" +
34+
" arguments:\n" +
35+
" - !php/const Foo\\Bar::F<caret>OO\n",
36+
PlatformPatterns.psiElement(Field.class).withName("FOO")
37+
);
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace
4+
{
5+
define('CONST_FOO', 'CONST_FOO');
6+
}
7+
8+
namespace Foo
9+
{
10+
class Bar
11+
{
12+
const FOO = 'foo';
13+
}
14+
}

0 commit comments

Comments
 (0)