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

Reply via email to