diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/completion/PhpConstGotoCompletionProvider.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/completion/PhpConstGotoCompletionProvider.java index 02b9f5329..b629e7479 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/completion/PhpConstGotoCompletionProvider.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/completion/PhpConstGotoCompletionProvider.java @@ -42,12 +42,16 @@ public void getLookupElements(@NotNull GotoCompletionProviderLookupArguments arg PhpIndex phpIndex = PhpIndex.getInstance(this.getProject()); CompletionResultSet resultSet = arguments.getResultSet(); - final String prefix = getElement().getText().replace(CompletionUtil.DUMMY_IDENTIFIER_TRIMMED, ""); + var elementText = getElement().getText(); + var scopeOperatorPos = elementText.indexOf(SCOPE_OPERATOR); + var cursorPos = elementText.indexOf(CompletionUtil.DUMMY_IDENTIFIER_TRIMMED); // Class constants: !php/const Foo:: - if (prefix.contains(SCOPE_OPERATOR)) { - String classFQN = prefix.substring(0, getElement().getText().indexOf(SCOPE_OPERATOR)); - PhpClass phpClass = PhpElementsUtil.getClassInterface(this.getProject(), classFQN); + if (scopeOperatorPos > -1 && scopeOperatorPos < cursorPos) { + var prefix = elementText.replace(CompletionUtil.DUMMY_IDENTIFIER_TRIMMED, ""); + var classFQN = prefix.substring(0, scopeOperatorPos); + var phpClass = PhpElementsUtil.getClassInterface(this.getProject(), classFQN); + if (phpClass != null) { // reset the prefix matcher, starting after :: resultSet = resultSet.withPrefixMatcher(prefix.substring(prefix.indexOf(SCOPE_OPERATOR) + 2)); diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/completion/yaml/YamlGotoCompletionRegistrarTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/completion/yaml/YamlGotoCompletionRegistrarTest.java index 4af936c33..9c6978b67 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/completion/yaml/YamlGotoCompletionRegistrarTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/completion/yaml/YamlGotoCompletionRegistrarTest.java @@ -101,4 +101,35 @@ public void testThatDecoratesPrioritizeLookupElementOnInstance() { lookupElement -> "foo".equals(lookupElement.getItemText()) && lookupElement.isItemTextBold() && lookupElement.isItemTextBold() ); } + + public void testThatPhpConstAreCompletedAndNavigable() { + assertCompletionContains( + YAMLFileType.YML, + "services:\n" + + " foo:\n" + + " class: Foo\\Foobar\n" + + " arguments: \n" + + " - !php/const \n", + "Bar", "Foobar" + ); + + assertCompletionContains( + YAMLFileType.YML, + "services:\n" + + " foo:\n" + + " class: Foo\\Foobar\n" + + " arguments: \n" + + " - !php/const Foo\\Bar::\n", + "BAZ" + ); + + assertCompletionIsEmpty( + YAMLFileType.YML, + "services:\n" + + " foo:\n" + + " class: Foo\\Foobar\n" + + " arguments: \n" + + " - !php/const Foo\\Bar::BAZ\n" + ); + } } diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/completion/yaml/fixtures/YamlGotoCompletionRegistrar.php b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/completion/yaml/fixtures/YamlGotoCompletionRegistrar.php index edd47912e..75dc037a6 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/completion/yaml/fixtures/YamlGotoCompletionRegistrar.php +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/completion/yaml/fixtures/YamlGotoCompletionRegistrar.php @@ -4,10 +4,13 @@ { class Bar { + public const BAZ = 'baz'; + public function create() {} } class Foobar extends Bar { + public function __construct($arg = null) {} } } \ No newline at end of file