From eab20ad864b38b9d9eb9675f553d00335069e012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20W=C3=B3js?= Date: Sun, 16 May 2021 09:24:28 +0200 Subject: [PATCH 1/3] Added unit test for #1631 --- .../yaml/YamlGotoCompletionRegistrarTest.java | 10 ++++++++++ .../yaml/fixtures/YamlGotoCompletionRegistrar.php | 3 +++ 2 files changed, 13 insertions(+) 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..0be16ff01 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,14 @@ public void testThatDecoratesPrioritizeLookupElementOnInstance() { lookupElement -> "foo".equals(lookupElement.getItemText()) && lookupElement.isItemTextBold() && lookupElement.isItemTextBold() ); } + + public void testThatPhpConstAreCompletedAndNavigable() { + 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 From 6e02aa169f82e91a2896f2387746a3729219d395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20W=C3=B3js?= Date: Sun, 16 May 2021 10:06:34 +0200 Subject: [PATCH 2/3] Fixed #1631: PhpConstGotoCompletionProvider throws IndexOutOfBoundsException when cursor is before scope operator --- .../completion/PhpConstGotoCompletionProvider.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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)); From 52ee25fdc32bbcdb388823c80e2ba1d258730cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20W=C3=B3js?= Date: Sun, 16 May 2021 10:48:51 +0200 Subject: [PATCH 3/3] Added missing unit tests for !php/const autocompletion --- .../yaml/YamlGotoCompletionRegistrarTest.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) 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 0be16ff01..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 @@ -103,12 +103,33 @@ public void testThatDecoratesPrioritizeLookupElementOnInstance() { } public void testThatPhpConstAreCompletedAndNavigable() { - assertCompletionIsEmpty(YAMLFileType.YML, "" + - "services:\n" + - " foo:\n" + - " class: Foo\\Foobar\n" + - " arguments: \n" + - " - !php/const Foo\\Bar::BAZ\n" + 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" ); } }