This is an automated email from the ASF dual-hosted git repository. tmysik pushed a commit to branch delivery in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/delivery by this push: new 01639b6 Fix code completion for parent's trait #3486 new b645e98 Merge pull request #3521 from junichi11/gh-3486 01639b6 is described below commit 01639b6f44cb160cb899de31f7b99ed60b30104b Author: Junichi Yamamoto <junich...@apache.org> AuthorDate: Thu Jan 27 15:53:44 2022 +0900 Fix code completion for parent's trait #3486 --- .../php/editor/completion/PHPCodeCompletion.java | 19 +++- .../php/editor/elements/IndexQueryImpl.java | 4 + .../testfiles/completion/lib/gh3486/gh3486.php | 103 +++++++++++++++++++++ .../lib/gh3486/gh3486.php.testGH3486_01.completion | 16 ++++ .../lib/test207345/bar.php.testUseCase1.completion | 1 - .../completion/PHPCodeCompletionGH3486Test.java | 49 ++++++++++ 6 files changed, 188 insertions(+), 4 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 309a774..3fb9e88 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 @@ -1347,6 +1347,7 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { List<String> invalidProposalsForClsMembers = INVALID_PROPOSALS_FOR_CLS_MEMBERS; Model model = request.result.getModel(); + boolean parentContext = false; boolean selfContext = false; boolean staticLateBindingContext = false; boolean specialVariable = false; @@ -1361,6 +1362,7 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { staticContext = true; instanceContext = true; specialVariable = true; + parentContext = true; } else if (TokenUtilities.textEquals(varName, "static")) { // NOI18N staticContext = true; instanceContext = false; @@ -1381,7 +1383,7 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { return; } final ElementFilter staticFlagFilter = !completeAccessPrefix - ? new StaticOrInstanceMembersFilter(staticContext, instanceContext, selfContext, staticLateBindingContext) + ? new StaticOrInstanceMembersFilter(staticContext, instanceContext, selfContext, staticLateBindingContext, parentContext) : new ElementFilter() { // NETBEANS-1855 @Override public boolean isAccepted(PhpElement element) { @@ -1495,6 +1497,7 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { List<String> invalidProposalsForClsMembers = INVALID_PROPOSALS_FOR_CLS_MEMBERS; Model model = request.result.getModel(); + boolean parentContext = false; boolean selfContext = false; boolean staticLateBindingContext = false; boolean specialVariable = false; @@ -1509,6 +1512,7 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { isStaticContext = true; isInstanceContext = true; specialVariable = true; + parentContext = true; } else if (TokenUtilities.textEquals(varName, "static")) { // NOI18N isStaticContext = true; isInstanceContext = false; @@ -1523,7 +1527,7 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { if (CancelSupport.getDefault().isCancelled()) { return; } - final ElementFilter staticFlagFilter = new StaticOrInstanceMembersFilter(isStaticContext, isInstanceContext, selfContext, staticLateBindingContext); + final ElementFilter staticFlagFilter = new StaticOrInstanceMembersFilter(isStaticContext, isInstanceContext, selfContext, staticLateBindingContext, true); final ElementFilter methodsFilter = ElementFilter.allOf( ElementFilter.forKind(PhpElementKind.METHOD), ElementFilter.forName(NameKind.exact(functionName.text().toString())), @@ -2321,15 +2325,17 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { private final boolean staticAllowed; private final boolean nonstaticAllowed; private final boolean forStaticLateBinding; + private final boolean forParentContext; public StaticOrInstanceMembersFilter(final boolean forStaticContext, final boolean forInstanceContext, - final boolean forSelfContext, final boolean forStaticLateBinding) { + final boolean forSelfContext, final boolean forStaticLateBinding, final boolean forParentContext) { this.forStaticContext = forStaticContext; this.forInstanceContext = forInstanceContext; this.forSelfContext = forSelfContext; this.forStaticLateBinding = forStaticLateBinding; this.staticAllowed = OptionsUtils.codeCompletionStaticMethods(); this.nonstaticAllowed = OptionsUtils.codeCompletionNonStaticMethods(); + this.forParentContext = forParentContext; } @Override @@ -2348,6 +2354,13 @@ public class PHPCodeCompletion implements CodeCompletionHandler2 { private boolean isAcceptedForNotStaticContext(final PhpElement element) { final boolean isStatic = element.getPhpModifiers().isStatic(); + if (forParentContext + && !isStatic + && element.getPhpElementKind().equals(PhpElementKind.FIELD)) { + // parent::fieldName is invalid + // this is constant + return false; + } return !isStatic || (staticAllowed && element.getPhpElementKind().equals(PhpElementKind.METHOD)); } diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java index 0936f89..14d42da 100644 --- a/php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java +++ b/php/php.editor/src/org/netbeans/modules/php/editor/elements/IndexQueryImpl.java @@ -940,6 +940,10 @@ public final class IndexQueryImpl implements ElementQuery.Index { final Set<TypeElement> inheritedTypes = elementQueryIndex.getInheritedTypes(enclosingType); for (final TypeElement nextType : inheritedTypes) { filters.add(ElementFilter.forMembersOfType(nextType)); + // GH #3486 + for (TypeElement trait : getAllUsedTraits(nextType)) { + filters.add(ElementFilter.forMembersOfType(trait)); + } } } return filters.toArray(new ElementFilter[filters.size()]); diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/gh3486/gh3486.php b/php/php.editor/test/unit/data/testfiles/completion/lib/gh3486/gh3486.php new file mode 100644 index 0000000..ea3d6e4 --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/gh3486/gh3486.php @@ -0,0 +1,103 @@ +<?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. + */ + +trait TestTrait { + + public int $publicTraitField = 1; + private int $privateTraitField = 1; + protected int $protectedTraitField = 1; + public static int $publicStaticTraitField = 1; + private static int $privateStaticTraitField = 1; + protected static int $protectedStaticTraitField = 1; + + public function publicTraitMethod() { + echo "publicTraitMethod" . PHP_EOL; + } + + private function privateTraitMethod() { + echo "privateTraitMethod" . PHP_EOL; + } + + protected function protectedTraitMethod() { + echo "protectedTraitMethod" . PHP_EOL; + } + + public static function publicStaticTraitMethod() { + echo "publicStaticTraitMethod" . PHP_EOL; + } + + private static function privateStaticTraitMethod() { + echo "privateStaticTraitMethod" . PHP_EOL; + } + + protected static function protectedStaticTraitMethod() { + echo "protectedStaticTraitMethod" . PHP_EOL; + } + +} + +class A { + + use TestTrait; + + public int $publicClassField = 1; + private int $privateClassField = 1; + protected int $protectedClassField = 1; + public static int $publicStaticClassField = 1; + private static int $privateStaticClassField = 1; + protected static int $protectedStaticClassField = 1; + + public function publicClassMethod() { + echo "publicClassMethod" . PHP_EOL; + } + + private function privateClassMethod() { + echo "privateClassMethod" . PHP_EOL; + } + + protected function protectedClassMethod() { + echo "protectedClassMethod" . PHP_EOL; + } + + public static function publicStaticClassMethod() { + echo "publicStaticClassMethod" . PHP_EOL; + } + + private static function privateStaticClassMethod() { + echo "privateStaticClassMethod" . PHP_EOL; + } + + protected static function protectedStaticClassMethod() { + echo "protectedStaticClassMethod" . PHP_EOL; + } + + protected function protectedTraitMethod() { + echo "protectedTraitMethod" . PHP_EOL; + } + +} + +class B extends A { + + protected function protectedTraitMethod() { + parent::protectedTraitMethod(); + } + +} diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/gh3486/gh3486.php.testGH3486_01.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/gh3486/gh3486.php.testGH3486_01.completion new file mode 100644 index 0000000..367cf52 --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/gh3486/gh3486.php.testGH3486_01.completion @@ -0,0 +1,16 @@ +Code completion result for source line: +parent::|protectedTraitMethod(); +(QueryType=COMPLETION, prefixSearch=true, caseSensitive=true) +METHOD protectedClassMethod() [PROTECTE A +METHOD protectedStaticClassMethod() [PROTECTE A +METHOD protectedStaticTraitMethod() [PROTECTE TestTrait +METHOD protectedTraitMethod() [PROTECTE A +METHOD publicClassMethod() [PUBLIC] A +METHOD publicStaticClassMethod() [STATIC] A +METHOD publicStaticTraitMethod() [STATIC] TestTrait +METHOD publicTraitMethod() [PUBLIC] TestTrait +VARIABLE int $protectedStaticClassField [PROTECTE A +VARIABLE int $protectedStaticTraitField [PROTECTE TestTrait +VARIABLE int $publicStaticClassField [STATIC] A +VARIABLE int $publicStaticTraitField [STATIC] TestTrait +CONSTANT class \A [PUBLIC] Magic Constant diff --git a/php/php.editor/test/unit/data/testfiles/completion/lib/test207345/bar.php.testUseCase1.completion b/php/php.editor/test/unit/data/testfiles/completion/lib/test207345/bar.php.testUseCase1.completion index 5adc7ba..0b5efc5 100644 --- a/php/php.editor/test/unit/data/testfiles/completion/lib/test207345/bar.php.testUseCase1.completion +++ b/php/php.editor/test/unit/data/testfiles/completion/lib/test207345/bar.php.testUseCase1.completion @@ -4,5 +4,4 @@ parent::| ------------------------------------ METHOD __construct() [PUBLIC] \Testing\Ns\Blah METHOD baz($param) [PUBLIC] \Testing\Ns\Blah -VARIABLE ? field [PUBLIC] \Testing\Ns\Blah CONSTANT class \Testing\Ns\Blah [PUBLIC] Magic Constant diff --git a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionGH3486Test.java b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionGH3486Test.java new file mode 100644 index 0000000..3084aa9 --- /dev/null +++ b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/completion/PHPCodeCompletionGH3486Test.java @@ -0,0 +1,49 @@ +/* + * 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. + */ +package org.netbeans.modules.php.editor.completion; + +import java.io.File; +import java.util.Collections; +import java.util.Map; +import org.netbeans.api.java.classpath.ClassPath; +import org.netbeans.modules.php.project.api.PhpSourcePath; +import org.netbeans.spi.java.classpath.support.ClassPathSupport; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; + +public class PHPCodeCompletionGH3486Test extends PHPCodeCompletionTestBase { + + public PHPCodeCompletionGH3486Test(String testName) { + super(testName); + } + + public void testGH3486_01() throws Exception { + checkCompletion("testfiles/completion/lib/gh3486/gh3486.php", " parent::^protectedTraitMethod();", false); + } + + @Override + protected Map<String, ClassPath> createClassPathsForTest() { + return Collections.singletonMap( + PhpSourcePath.SOURCE_CP, + ClassPathSupport.createClassPath(new FileObject[] { + FileUtil.toFileObject(new File(getDataDir(), "/testfiles/completion/lib/gh3486")) + }) + ); + } +} --------------------------------------------------------------------- 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