From fba2ded5243d3d8b20ee0730449b264b48b45d60 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Fri, 6 Jul 2018 13:05:36 +0200 Subject: [PATCH] Add YAML const GoTo Target for Symfony 3.2+ style constants Fixes: #1162 --- .../yaml/YamlGoToDeclarationHandler.java | 29 +++++++++++++++++++ .../yaml/YamlGoToDeclarationHandlerTest.java | 11 +++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlGoToDeclarationHandler.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlGoToDeclarationHandler.java index 6bba0f97a..03c266845 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlGoToDeclarationHandler.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlGoToDeclarationHandler.java @@ -69,6 +69,11 @@ public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int i, Edit targets.addAll(constantGoto(psiElement, psiText)); } + // mind the whitespace + if(hasNewConst(psiElement)) { + targets.addAll(newConstantGoto(psiElement, psiText)); + } + if(psiText.contains("\\")) { targets.addAll(classGoToDeclaration(psiElement, psiText)) ; } @@ -162,6 +167,22 @@ public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int i, Edit return targets.toArray(new PsiElement[targets.size()]); } + private boolean hasNewConst(@NotNull PsiElement psiElement) { + PsiElement prevSibling = psiElement.getPrevSibling(); + while (prevSibling != null) { + IElementType elementType = prevSibling.getNode().getElementType(); + if (elementType == YAMLTokenTypes.TEXT || elementType == YAMLTokenTypes.SCALAR_DSTRING || elementType == YAMLTokenTypes.SCALAR_STRING || elementType == YAMLTokenTypes.TAG) { + String psiText = PsiElementUtils.getText(prevSibling); + + return psiText.equals("!php/const"); + } + + prevSibling = prevSibling.getPrevSibling(); + } + + return false; + } + @NotNull private Collection classGoToDeclaration(@NotNull PsiElement psiElement, @NotNull String className) { @@ -234,6 +255,14 @@ private Collection constantGoto(@NotNull PsiElement psiElement, @Not return ServiceContainerUtil.getTargetsForConstant(psiElement.getProject(), constantName); } + @NotNull + private Collection newConstantGoto(@NotNull PsiElement psiElement, @NotNull String constantName) { + if(StringUtils.isBlank(constantName)) { + return Collections.emptyList(); + } + + return ServiceContainerUtil.getTargetsForConstant(psiElement.getProject(), constantName); + } @NotNull private Collection visitConfigKey(@NotNull PsiElement psiElement) { diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/YamlGoToDeclarationHandlerTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/YamlGoToDeclarationHandlerTest.java index 6afe2f320..d636979ba 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/YamlGoToDeclarationHandlerTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/yaml/YamlGoToDeclarationHandlerTest.java @@ -10,8 +10,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.YAMLFileType; -import java.io.File; - /** * @author Daniel Espendiller * @@ -94,6 +92,15 @@ public void testPhpConstantNavigation() { assertNavigationMatch(YAMLFileType.YML, "bar: '!php/const:\\YAML_FOO_BAR'"); } + public void testPhpConstantNavigation34() { + assertNavigationMatch(YAMLFileType.YML, "bar: !php/const \\YAML_FOO_BAR"); + assertNavigationMatch(YAMLFileType.YML, "bar: !php/const YAML_FOO_BAR"); + assertNavigationMatch(YAMLFileType.YML, "bar: !php/const Yaml\\Foo\\Bar::YAML_FOO_BAR_CLASS"); + assertNavigationMatch(YAMLFileType.YML, "bar: !php/const Yaml\\Foo\\Bar::::YAML_FOO_BAR_CLASS"); + assertNavigationMatch(YAMLFileType.YML, "bar: !php/const Yaml\\Foo\\Bar:YAML_FOO_BAR_CLASS"); + assertNavigationMatch(YAMLFileType.YML, "bar: !php/const \\Yaml\\Foo\\Bar:YAML_FOO_BAR_CLASS"); + } + public void testParameter() { assertNavigationMatch(YAMLFileType.YML, "bar: %foo_parameter%"); }