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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists