This is an automated email from the ASF dual-hosted git repository. tmysik pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push: new f432db94ac Fix the code completion for instance context of Enum #5100 new 296dc8c4d4 Merge pull request #5686 from junichi11/php-gh-5100-cc-enum-this f432db94ac is described below commit f432db94ac3556780d0f256078286dd6d2e74938 Author: Junichi Yamamoto <junich...@apache.org> AuthorDate: Mon Mar 20 14:52:54 2023 +0900 Fix the code completion for instance context of Enum #5100 - https://github.com/apache/netbeans/issues/5100 - Add cc items to `$this->` - Add special keywords(`$this->`, `static::` etc.) inside Enum --- .../php/editor/completion/PHPCodeCompletion.java | 17 +++- .../php/editor/model/impl/IndexScopeImpl.java | 5 ++ .../php/editor/model/impl/VariousUtils.java | 3 + ...SpecialVariablesWithinInstanceContextGH5100.php | 95 ++++++++++++++++++++++ ...iablesWithinInstanceContextGH5100_01.completion | 20 +++++ ...iablesWithinInstanceContextGH5100_02.completion | 19 +++++ ...iablesWithinInstanceContextGH5100_03.completion | 4 + ...iablesWithinInstanceContextGH5100_04.completion | 6 ++ .../editor/completion/PHP81CodeCompletionTest.java | 17 ++++ 9 files changed, 184 insertions(+), 2 deletions(-) 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 471285e46a..d01a10709c 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 @@ -119,6 +119,7 @@ import org.netbeans.modules.php.editor.parser.astnodes.ASTNode; import org.netbeans.modules.php.editor.parser.astnodes.Block; import org.netbeans.modules.php.editor.parser.astnodes.ClassDeclaration; import org.netbeans.modules.php.editor.parser.astnodes.ClassInstanceCreation; +import org.netbeans.modules.php.editor.parser.astnodes.EnumDeclaration; import org.netbeans.modules.php.editor.parser.astnodes.Expression; import org.netbeans.modules.php.editor.parser.astnodes.TraitDeclaration; import org.netbeans.modules.php.editor.parser.astnodes.TypeDeclaration; @@ -1999,10 +2000,10 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { final ElementFilter forCurrentFile = ElementFilter.forFiles(fileObject); completionResult.addAll(getVariableProposals(request, forCurrentFile.reverseFilter(globalVariables))); - // Special keywords applicable only inside a class or trait + // Special keywords applicable only inside a class, enum, or trait final EnclosingType enclosingType = findEnclosingType(request.info, lexerToASTOffset(request.result, request.anchor)); if (enclosingType != null - && (enclosingType.isClassDeclaration() || enclosingType.isTraitDeclaration())) { + && (enclosingType.isClassDeclaration() || enclosingType.isTraitDeclaration() || enclosingType.isEnumDeclaration())) { final String typeName = enclosingType.extractTypeName(); if (typeName != null) { for (final String keyword : PHP_CLASS_KEYWORDS) { @@ -2530,6 +2531,8 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { boolean isTraitDeclaration(); + boolean isEnumDeclaration(); + String extractTypeName(); //~ Factories @@ -2546,6 +2549,11 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { return typeDeclaration instanceof TraitDeclaration; } + @Override + public boolean isEnumDeclaration() { + return typeDeclaration instanceof EnumDeclaration; + } + @Override public String extractTypeName() { return CodeUtils.extractTypeName(typeDeclaration); @@ -2566,6 +2574,11 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { return false; } + @Override + public boolean isEnumDeclaration() { + return false; + } + @Override public String extractTypeName() { return CodeUtils.extractClassName(classInstanceCreation); diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/IndexScopeImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/IndexScopeImpl.java index 5432f4cd16..7309acd48d 100644 --- a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/IndexScopeImpl.java +++ b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/IndexScopeImpl.java @@ -128,6 +128,11 @@ class IndexScopeImpl extends ScopeImpl implements IndexScope { return indexScope.findClasses(className); } + static List<? extends EnumScope> getEnums(final QualifiedName enumName, ModelElement elem) { + final IndexScope indexScope = ModelUtils.getIndexScope(elem); + return indexScope.findEnums(enumName); + } + static List<? extends InterfaceScope> getInterfaces(final QualifiedName ifaceName, ModelElement elem) { final IndexScope indexScope = ModelUtils.getIndexScope(elem); return indexScope.findInterfaces(ifaceName); diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/VariousUtils.java b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/VariousUtils.java index 5fbd05820d..36953f8fc3 100644 --- a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/VariousUtils.java +++ b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/VariousUtils.java @@ -746,6 +746,9 @@ public final class VariousUtils { if (inScope instanceof ClassScope) { String clsName = ((ClassScope) inScope).getName(); newRecentTypes.addAll(IndexScopeImpl.getClasses(QualifiedName.create(clsName), varScope)); + } else if (inScope instanceof EnumScope) { + String enumName = ((EnumScope) inScope).getName(); + newRecentTypes.addAll(IndexScopeImpl.getEnums(QualifiedName.create(enumName), varScope)); } else if (inScope instanceof TraitScope) { String traitName = ((TraitScope) inScope).getName(); newRecentTypes.addAll(IndexScopeImpl.getTraits(QualifiedName.create(traitName), varScope)); diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php new file mode 100644 index 0000000000..c1b67515df --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php @@ -0,0 +1,95 @@ +<?php +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +namespace Enum1; + +interface TestInterface { + + public function publicInterfaceMethod(): string; + + public static function publicStaticInterfaceMethod(): string; +} + +enum Simple implements TestInterface { + + use TestTrait; + + case CASE1; + case CASE2; + public const PUBLIC_CONST = "public"; + private const PRIVATE_CONST = "private"; + protected const PROTECTED_CONST = "protected"; + const CONSTANT1 = "CONSTANT1"; + const CONSTANT2 = self::CASE2; + + public function publicEnumMethod(): void { + echo "publicEnumMethod()" . PHP_EOL; + } + + private function privateEnumMethod(): void { + echo "privateEnumMethod()" . PHP_EOL; + } + + protected function protectedEnumMethod(): void { + echo "protectedEnumMethod()" . PHP_EOL; + } + + public function publicInterfaceMethod(): string { + echo "publicInterfaceMethod()" . PHP_EOL; + } + + public static function publicStaticEnumMethod(): void { + echo "publicStaticEnumMethod()" . PHP_EOL; + } + + private static function privateStaticEnumMethod(): void { + echo "privateStaticEnumMethod()" . PHP_EOL; + } + + protected static function protectedStaticEnumMethod(): void { + echo "protectedStaticEnumMethod()" . PHP_EOL; + } + + public static function publicStaticInterfaceMethod(): string { + echo "publicStaticInterfaceMethod()" . PHP_EOL; + } + + public function testEnum(): string { + $this->publicEnumMethod(); + self::class; + static::class; + $ // test keywords + } + +} + +trait TestTrait { + public function publicTraitMethod(): void { + } + private function privateTraitMethod(): void { + } + protected function protectedTraitMethod(): void { + } + public static function publicStaticTraitMethod(): void { + } + private static function privateStaticTraitMethod(): void { + } + protected static function protectedStaticTraitMethod(): void { + } +} diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_01.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_01.completion new file mode 100644 index 0000000000..f7e3bacfb0 --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_01.completion @@ -0,0 +1,20 @@ +Code completion result for source line: +$this->|publicEnumMethod(); +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +METHOD privateEnumMethod() [PRIVATE] \Enum1\Simple +METHOD privateStaticEnumMethod() [PRIVATE, \Enum1\Simple +METHOD privateStaticTraitMethod() [PRIVATE, \Enum1\TestTrait +METHOD privateTraitMethod() [PRIVATE] \Enum1\TestTrait +METHOD protectedEnumMethod() [PROTECTE \Enum1\Simple +METHOD protectedStaticEnumMethod() [PROTECTE \Enum1\Simple +METHOD protectedStaticTraitMethod() [PROTECTE \Enum1\TestTrait +METHOD protectedTraitMethod() [PROTECTE \Enum1\TestTrait +METHOD publicEnumMethod() [PUBLIC] \Enum1\Simple +METHOD publicInterfaceMethod() [PUBLIC] \Enum1\Simple +METHOD publicStaticEnumMethod() [STATIC] \Enum1\Simple +METHOD publicStaticInterfaceMethod() [STATIC] \Enum1\Simple +METHOD publicStaticTraitMethod() [STATIC] \Enum1\TestTrait +METHOD publicTraitMethod() [PUBLIC] \Enum1\TestTrait +METHOD testEnum() [PUBLIC] \Enum1\Simple +------------------------------------ +VARIABLE string name \Enum1\Simple diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_02.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_02.completion new file mode 100644 index 0000000000..fb913cceb5 --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_02.completion @@ -0,0 +1,19 @@ +Code completion result for source line: +$| // test keywords +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +KEYWORD Simple $this-> null +------------------------------------ +VARIABLE $GLOBALS PHP Platform +VARIABLE $HTTP_RAW_POST_DATA PHP Platform +VARIABLE $_COOKIE PHP Platform +VARIABLE $_ENV PHP Platform +VARIABLE $_FILES PHP Platform +VARIABLE $_GET PHP Platform +VARIABLE $_POST PHP Platform +VARIABLE $_REQUEST PHP Platform +VARIABLE $_SERVER PHP Platform +VARIABLE $_SESSION PHP Platform +VARIABLE $argc PHP Platform +VARIABLE $argv PHP Platform +VARIABLE $http_response_header PHP Platform +VARIABLE $php_errormsg PHP Platform diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_03.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_03.completion new file mode 100644 index 0000000000..39c2978348 --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_03.completion @@ -0,0 +1,4 @@ +Code completion result for source line: +sel|f::class; +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +KEYWORD self:: null diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_04.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_04.completion new file mode 100644 index 0000000000..d68a960d09 --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/php81/testEnumsSpecialVariablesWithinInstanceContextGH5100/enumsSpecialVariablesWithinInstanceContextGH5100.php.testEnumsSpecialVariablesWithinInstanceContextGH5100_04.completion @@ -0,0 +1,6 @@ +Code completion result for source line: +stat|ic::class; +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +KEYWORD static:: null +------------------------------------ +KEYWORD static null diff --git a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP81CodeCompletionTest.java b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP81CodeCompletionTest.java index 030a8607db..683c497357 100644 --- a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP81CodeCompletionTest.java +++ b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHP81CodeCompletionTest.java @@ -1117,6 +1117,23 @@ public class PHP81CodeCompletionTest extends PHPCodeCompletionTestBase { checkCompletion("enumsUnionAndBackedMembers", "Union::^cases();"); } + // GH-5100 + public void testEnumsSpecialVariablesWithinInstanceContextGH5100_01() throws Exception { + checkCompletion("enumsSpecialVariablesWithinInstanceContextGH5100", " $this->^publicEnumMethod();"); + } + + public void testEnumsSpecialVariablesWithinInstanceContextGH5100_02() throws Exception { + checkCompletion("enumsSpecialVariablesWithinInstanceContextGH5100", " $^ // test keywords"); + } + + public void testEnumsSpecialVariablesWithinInstanceContextGH5100_03() throws Exception { + checkCompletion("enumsSpecialVariablesWithinInstanceContextGH5100", " sel^f::class;"); + } + + public void testEnumsSpecialVariablesWithinInstanceContextGH5100_04() throws Exception { + checkCompletion("enumsSpecialVariablesWithinInstanceContextGH5100", " stat^ic::class;"); + } + public void testFirstClassCallableSyntax_01() throws Exception { checkCompletionForFirstClassCallable("firstClassCallableSyntax", "tes^t(...);"); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists