From 7aa9a956e6008d134d0b30007c6e1efb11608ebf Mon Sep 17 00:00:00 2001 From: Alexey Borokhvostov Date: Mon, 11 Aug 2025 19:12:56 +0700 Subject: [PATCH] Added autocompletion for the use keyword in the body of a class, trait, and enum Added new tests and fix broken tests --- .../editor/completion/PHPCodeCompletion.java | 26 +++++++++++++++++++ ...ion02.php.testClsDeclaration_10.completion | 1 + ...ion02.php.testClsDeclaration_13.completion | 1 + ...tion02.php.testClsDeclaration_9.completion | 1 + ...ue153707.php.testIssue153707_01.completion | 2 ++ ...issue153867.php.testIssue153867.completion | 2 ++ ...issue200795.php.testIssue200795.completion | 1 + .../lib/_base/useKeywordInClass.php | 9 +++++++ ...Class.php.testUseKeywordInClass.completion | 5 ++++ .../completion/lib/_base/useKeywordInEnum.php | 8 ++++++ ...InEnum.php.testUseKeywordInEnum.completion | 5 ++++ .../lib/_base/useKeywordInInterface.php | 8 ++++++ ...e.php.testUseKeywordInInterface.completion | 3 +++ .../lib/_base/useKeywordInTrait.php | 8 ++++++ ...Trait.php.testUseKeywordInTrait.completion | 5 ++++ ...ass01.php.testAnonymousClass01h.completion | 1 + ....testReadonlyPropertiesTyping01.completion | 1 + ...AsymmetricVisibilityClass01_01a.completion | 1 + ...ymmetricVisibilityClassTyping01.completion | 1 + .../issue209117.php.testUseCase1.completion | 1 + .../issue233756.php.testUseCase1.completion | 1 + .../completion/PHPCodeCompletionTest.java | 15 +++++++++++ 22 files changed, 106 insertions(+) create mode 100644 php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInClass.php create mode 100644 php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInClass.php.testUseKeywordInClass.completion create mode 100644 php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInEnum.php create mode 100644 php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInEnum.php.testUseKeywordInEnum.completion create mode 100644 php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInInterface.php create mode 100644 php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInInterface.php.testUseKeywordInInterface.completion create mode 100644 php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInTrait.php create mode 100644 php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInTrait.php.testUseKeywordInTrait.completion diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletion.java b/php/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletion.java index 91c8d70eda8e..6bbff061c9f6 100644 --- a/php/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletion.java +++ b/php/php.editor/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletion.java @@ -1344,6 +1344,9 @@ private void autoCompleteInClassContext( if (!foundConst && !foundFunction) { autoCompleteKeywords(completionResult, request, PHP_SET_VISIBILITY_KEYWORDS); autoCompleteKeywords(completionResult, request, PHP_ASYMMETRIC_VISIBILITY_KEYWORDS); + if (!completeAfterModificatorsKeywords(tokenSequence, caretOffset, th, info.getSnapshot().getSource().getFileObject())){ + autoCompleteKeywords(completionResult, request, Arrays.asList("use")); + } } if (offerMagicAndInherited(tokenSequence, caretOffset, th)) { EnclosingClass enclosingClass = findEnclosingClass(info, lexerToASTOffset(info, caretOffset)); @@ -1551,6 +1554,29 @@ private boolean completeFieldTypes(TokenSequence tokenSequence, int return completeTypes; } + private boolean completeAfterModificatorsKeywords(TokenSequence tokenSequence, int caretOffset, TokenHierarchy th, FileObject fileObject) { + boolean completeAfterModificatorsKeywords = false; + tokenSequence.move(caretOffset); + if (!(!tokenSequence.moveNext() && !tokenSequence.movePrevious())) { + Token token = tokenSequence.token(); + int tokenIdOffset = tokenSequence.token().offset(th); + completeAfterModificatorsKeywords = CompletionContextFinder.lineContainsAny(token, caretOffset - tokenIdOffset, tokenSequence, Arrays.asList( + PHPTokenId.PHP_PUBLIC, + PHPTokenId.PHP_PUBLIC_SET, + PHPTokenId.PHP_PRIVATE, + PHPTokenId.PHP_PRIVATE_SET, + PHPTokenId.PHP_PROTECTED, + PHPTokenId.PHP_PROTECTED_SET, + PHPTokenId.PHP_ABSTRACT, + PHPTokenId.PHP_STATIC, + PHPTokenId.PHP_VAR, + PHPTokenId.PHP_READONLY, + PHPTokenId.PHP_FINAL + )); + } + return completeAfterModificatorsKeywords; + } + private static Set toNames(Set elements) { Set names = new HashSet<>(); for (PhpElement elem : elements) { diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_10.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_10.completion index 6e1c41e7a386..de052c805d31 100644 --- a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_10.completion +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_10.completion @@ -69,6 +69,7 @@ CLASS TestIssue145206 [PUBLIC] issue145206.php CLASS TestIssue146176 [PUBLIC] issue146176.php CLASS TestOptionalArgsClass [PUBLIC] optional_args.php CLASS TypesinPHPDoc [PUBLIC] types_in_phpdoc.php +CLASS UseKeywordClass [PUBLIC] useKeywordInClass.php CLASS User [PUBLIC] issue142051.php CLASS User147427 [PUBLIC] issue147427.php CLASS VarAdvancedTest [PUBLIC] varAssignment2.php diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_13.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_13.completion index f3e48c1b3fb1..b255164d0c2f 100644 --- a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_13.completion +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_13.completion @@ -69,6 +69,7 @@ CLASS TestIssue145206 [PUBLIC] issue145206.php CLASS TestIssue146176 [PUBLIC] issue146176.php CLASS TestOptionalArgsClass [PUBLIC] optional_args.php CLASS TypesinPHPDoc [PUBLIC] types_in_phpdoc.php +CLASS UseKeywordClass [PUBLIC] useKeywordInClass.php CLASS User [PUBLIC] issue142051.php CLASS User147427 [PUBLIC] issue147427.php CLASS VarAdvancedTest [PUBLIC] varAssignment2.php diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_9.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_9.completion index e0654eb0c48d..942c95067156 100644 --- a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_9.completion +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/clsDeclaration02.php.testClsDeclaration_9.completion @@ -69,6 +69,7 @@ CLASS TestIssue145206 [PUBLIC] issue145206.php CLASS TestIssue146176 [PUBLIC] issue146176.php CLASS TestOptionalArgsClass [PUBLIC] optional_args.php CLASS TypesinPHPDoc [PUBLIC] types_in_phpdoc.php +CLASS UseKeywordClass [PUBLIC] useKeywordInClass.php CLASS User [PUBLIC] issue142051.php CLASS User147427 [PUBLIC] issue147427.php CLASS VarAdvancedTest [PUBLIC] varAssignment2.php diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue153707.php.testIssue153707_01.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue153707.php.testIssue153707_01.completion index fa46a6f40513..dc224b2bc98f 100644 --- a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue153707.php.testIssue153707_01.completion +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue153707.php.testIssue153707_01.completion @@ -82,6 +82,8 @@ CLASS TestIssue145206 [PUBLIC] issue145206.php CLASS TestIssue146176 [PUBLIC] issue146176.php CLASS TestOptionalArgsClass [PUBLIC] optional_args.php CLASS TypesinPHPDoc [PUBLIC] types_in_phpdoc.php +CLASS UseKeywordClass [PUBLIC] useKeywordInClass.php +CLASS UseKeywordEnum [PUBLIC] useKeywordInEnum.php CLASS User [PUBLIC] issue142051.php CLASS User147427 [PUBLIC] issue147427.php CLASS VarAdvancedTest [PUBLIC] varAssignment2.php diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue153867.php.testIssue153867.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue153867.php.testIssue153867.completion index 76f96ccc405f..49b4ffc84dd0 100644 --- a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue153867.php.testIssue153867.completion +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue153867.php.testIssue153867.completion @@ -73,6 +73,8 @@ CLASS TestIssue145206 [PUBLIC] issue145206.php CLASS TestIssue146176 [PUBLIC] issue146176.php CLASS TestOptionalArgsClass [PUBLIC] optional_args.php CLASS TypesinPHPDoc [PUBLIC] types_in_phpdoc.php +CLASS UseKeywordClass [PUBLIC] useKeywordInClass.php +CLASS UseKeywordEnum [PUBLIC] useKeywordInEnum.php CLASS User [PUBLIC] issue142051.php CLASS User147427 [PUBLIC] issue147427.php CLASS VarAdvancedTest [PUBLIC] varAssignment2.php diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue200795.php.testIssue200795.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue200795.php.testIssue200795.completion index 5038ddcc2961..8920f4588e75 100644 --- a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue200795.php.testIssue200795.completion +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/issue200795.php.testIssue200795.completion @@ -68,6 +68,7 @@ CLASS TestIssue145206 [PUBLIC] issue145206.php CLASS TestIssue146176 [PUBLIC] issue146176.php CLASS TestOptionalArgsClass [PUBLIC] optional_args.php CLASS TypesinPHPDoc [PUBLIC] types_in_phpdoc.php +CLASS UseKeywordClass [PUBLIC] useKeywordInClass.php CLASS User [PUBLIC] issue142051.php CLASS User147427 [PUBLIC] issue147427.php CLASS VarAdvancedTest [PUBLIC] varAssignment2.php diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInClass.php b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInClass.php new file mode 100644 index 000000000000..83f02c0cabf7 --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/_base/useKeywordInClass.php @@ -0,0 +1,9 @@ + createClassPathsForTest() { //just test them as standalone files (just PHP Platform in index)