This is an automated email from the ASF dual-hosted git repository. neilcsmith 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 a067bcb581 Avoid getting all types with an empty type name #6039 new f052d630a9 Merge pull request #6237 from junichi11/php-gh-6039-fix-regression a067bcb581 is described below commit a067bcb581f7ba619e7f70e6f4eddde419ad69d9 Author: Junichi Yamamoto <junich...@apache.org> AuthorDate: Thu Jul 20 19:42:53 2023 +0900 Avoid getting all types with an empty type name #6039 - https://github.com/apache/netbeans/issues/6039 - Remove `<>` and `{}` from type name - Ignore an empty type name to avoid getting all types - Add unit tests --- .../php/editor/actions/ImportDataCreator.java | 5 ++ .../php/editor/parser/PHPDocCommentParser.java | 31 ++++++++--- .../ReturnTypeArrayShapes01.pass | 9 +++ .../ReturnTypeArrayShapes02.pass | 9 +++ .../ReturnTypeGenerics01.pass | 9 +++ .../ReturnTypeGenerics02.pass | 9 +++ .../ReturnTypeGenerics03.pass | 9 +++ .../ReturnTypeGenerics04.pass | 9 +++ .../ReturnTypeGenerics05.pass | 9 +++ .../ReturnTypeObjectShapes01.pass | 9 +++ .../ReturnTypeObjectShapes02.pass | 9 +++ .../testfiles/actions/testGH6039/testGH6039_01.php | 64 ++++++++++++++++++++++ .../testGH6039/testGH6039_01.php.importData | 7 +++ .../php/editor/actions/ImportDataCreatorTest.java | 4 ++ .../php/editor/parser/PHPDocCommentParserTest.java | 45 +++++++++++++++ 15 files changed, 230 insertions(+), 7 deletions(-) diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/actions/ImportDataCreator.java b/php/php.editor/src/org/netbeans/modules/php/editor/actions/ImportDataCreator.java index 60e1b6a5b1..6d9b1eb002 100644 --- a/php/php.editor/src/org/netbeans/modules/php/editor/actions/ImportDataCreator.java +++ b/php/php.editor/src/org/netbeans/modules/php/editor/actions/ImportDataCreator.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.TreeSet; import org.netbeans.modules.php.api.PhpVersion; +import org.netbeans.modules.php.api.util.StringUtils; import org.netbeans.modules.php.editor.CodeUtils; import org.netbeans.modules.php.editor.actions.FixUsesAction.Options; import org.netbeans.modules.php.editor.actions.ImportData.DataItem; @@ -87,6 +88,10 @@ public class ImportDataCreator { } private void processFQElementName(final String fqElementName) { + // GH-6039: avoid getting all types + if (!StringUtils.hasText(fqElementName)) { + return; + } // GH-6075 String fqeName = CodeUtils.removeNullableTypePrefix(fqElementName); Collection<FullyQualifiedElement> possibleFQElements = fetchPossibleFQElements(fqeName); diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java b/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java index 160df03925..64c9c3417e 100644 --- a/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java +++ b/php/php.editor/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParser.java @@ -263,6 +263,7 @@ public class PHPDocCommentParser { List<PHPDocTypeNode> result = new ArrayList<>(); for (String stype : getTypes(description, isReturnTag)) { stype = removeHTMLTags(stype); + stype = sanitizeShapes(stype); int startDocNode = findStartOfDocNode(originalComment, originalCommentStart, stype, startDescription); if (startDocNode == -1) { continue; @@ -377,17 +378,33 @@ public class PHPDocCommentParser { private String removeHTMLTags(String text) { String value = text; - int index = value.indexOf('>'); - if (index > -1) { - value = value.substring(index + 1); - index = value.indexOf('<'); - if (index > -1) { - value = value.substring(0, index); - } + int startTagIndex = value.indexOf('<'); + if (startTagIndex > -1) { + value = value.substring(0, startTagIndex).trim(); } return value; } + /** + * Remove `{'key': type}`. + * + * e.g. {@code array{'foo': int}}, {@code object{'foo': int, "bar": string}} + * + * @see https://phpstan.org/writing-php-code/phpdoc-types#array-shapes + * @see https://phpstan.org/writing-php-code/phpdoc-types#object-shapes + * + * @param type the type + * @return the sanitized type + */ + private String sanitizeShapes(String type) { + String sanitizedType = type; + int startIndex = sanitizedType.indexOf("{"); // NOI18N + if (startIndex > -1) { + sanitizedType = sanitizedType.substring(0, startIndex).trim(); + } + return sanitizedType; + } + /** * Find the start position of the specified string in the comment. * diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeArrayShapes01.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeArrayShapes01.pass new file mode 100644 index 0000000000..d1c3bd88ae --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeArrayShapes01.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='39'> + <Tags> + <PHPDocTypeTag start='3' end='42' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='19' value='array' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeArrayShapes02.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeArrayShapes02.pass new file mode 100644 index 0000000000..fb2224833d --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeArrayShapes02.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='54'> + <Tags> + <PHPDocTypeTag start='3' end='57' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='19' value='array' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics01.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics01.pass new file mode 100644 index 0000000000..ee8a4e1caa --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics01.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='33'> + <Tags> + <PHPDocTypeTag start='3' end='36' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='19' value='array' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics02.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics02.pass new file mode 100644 index 0000000000..d1c3bd88ae --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics02.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='39'> + <Tags> + <PHPDocTypeTag start='3' end='42' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='19' value='array' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics03.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics03.pass new file mode 100644 index 0000000000..398c9ccbe8 --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics03.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='32'> + <Tags> + <PHPDocTypeTag start='3' end='35' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='18' value='list' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics04.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics04.pass new file mode 100644 index 0000000000..a474a71ce3 --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics04.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='32'> + <Tags> + <PHPDocTypeTag start='3' end='35' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='18' value='Test' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics05.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics05.pass new file mode 100644 index 0000000000..a474a71ce3 --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeGenerics05.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='32'> + <Tags> + <PHPDocTypeTag start='3' end='35' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='18' value='Test' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeObjectShapes01.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeObjectShapes01.pass new file mode 100644 index 0000000000..58dd1a0fce --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeObjectShapes01.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='40'> + <Tags> + <PHPDocTypeTag start='3' end='43' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='20' value='object' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeObjectShapes02.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeObjectShapes02.pass new file mode 100644 index 0000000000..2c62ef79c1 --- /dev/null +++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest/ReturnTypeObjectShapes02.pass @@ -0,0 +1,9 @@ +<PHPDocBlock start='3' end='55'> + <Tags> + <PHPDocTypeTag start='3' end='58' kind='return'> + <Types> + <PHPDocTypeNode start='14' end='20' value='object' isArray='false'/> + </Types> + </PHPDocTypeTag> + </Tags> +</PHPDocBlock> diff --git a/php/php.editor/test/unit/data/testfiles/actions/testGH6039/testGH6039_01.php b/php/php.editor/test/unit/data/testfiles/actions/testGH6039/testGH6039_01.php new file mode 100644 index 0000000000..dae38009b5 --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/actions/testGH6039/testGH6039_01.php @@ -0,0 +1,64 @@ +<?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 NS\GH6039; + +class TestClass1{}; +class TestClass2{}; +class TestClass3{}; +class TestClass4{}; + +namespace Test; + +class Example { + /** + * @return array<int> Description + */ + public function gh6039_01(): array { + return []; + } + + /** + * @return array<int, string> Description + */ + public function gh6039_02(): array { + return []; + } + + /** + * @return Example<int> Description + */ + public function gh6039_03(): Example { + return $this; + } + + /** + * @return int<0, 100> Description + */ + public function gh6039_04(): Example { + return 1; + } + + /** + * @return array{int, int} Description + */ + public function gh6039_05(): array { + return []; + } +} diff --git a/php/php.editor/test/unit/data/testfiles/actions/testGH6039/testGH6039_01.php.importData b/php/php.editor/test/unit/data/testfiles/actions/testGH6039/testGH6039_01.php.importData new file mode 100644 index 0000000000..31f1e16dab --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/actions/testGH6039/testGH6039_01.php.importData @@ -0,0 +1,7 @@ +Caret position: 1037 +Should show uses panel: false +Defaults: + +Names: + +Variants: diff --git a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/actions/ImportDataCreatorTest.java b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/actions/ImportDataCreatorTest.java index c65cca98dc..f1f201a68f 100644 --- a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/actions/ImportDataCreatorTest.java +++ b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/actions/ImportDataCreatorTest.java @@ -126,6 +126,10 @@ public class ImportDataCreatorTest extends PHPTestBase { performTest("function test(): void ^{"); } + public void testGH6039_01() throws Exception { + performTest(" public function gh6039_01(): ^array {"); + } + private void performTest(String caretLine) throws Exception { performTest(caretLine, null); } diff --git a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest.java b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest.java index 7124691013..84bdab81b7 100644 --- a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest.java +++ b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/parser/PHPDocCommentParserTest.java @@ -385,6 +385,51 @@ public class PHPDocCommentParserTest extends PHPTestBase { perform(comment, "MethodStatic03"); } + public void testReturnTypeGenerics01() throws Exception { + String comment = " * @return array<int> description"; + perform(comment, "ReturnTypeGenerics01"); + } + + public void testReturnTypeGenerics02() throws Exception { + String comment = " * @return array<int, Test> description"; + perform(comment, "ReturnTypeGenerics02"); + } + + public void testReturnTypeGenerics03() throws Exception { + String comment = " * @return list<int> description"; + perform(comment, "ReturnTypeGenerics03"); + } + + public void testReturnTypeGenerics04() throws Exception { + String comment = " * @return Test<int> description"; + perform(comment, "ReturnTypeGenerics04"); + } + + public void testReturnTypeGenerics05() throws Exception { + String comment = " * @return Test<max> description"; + perform(comment, "ReturnTypeGenerics05"); + } + + public void testReturnTypeArrayShapes01() throws Exception { + String comment = " * @return array{'foo':int} description"; + perform(comment, "ReturnTypeArrayShapes01"); + } + + public void testReturnTypeArrayShapes02() throws Exception { + String comment = " * @return array{'foo':int, \"bar\": string} description"; + perform(comment, "ReturnTypeArrayShapes02"); + } + + public void testReturnTypeObjectShapes01() throws Exception { + String comment = " * @return object{'foo':int} description"; + perform(comment, "ReturnTypeObjectShapes01"); + } + + public void testReturnTypeObjectShapes02() throws Exception { + String comment = " * @return object{'foo':int, \"bar\": string} description"; + perform(comment, "ReturnTypeObjectShapes02"); + } + public void perform(String comment, String filename) throws Exception { PHPDocCommentParser parser = new PHPDocCommentParser(); PHPDocBlock block = parser.parse(0, comment.length(), comment); --------------------------------------------------------------------- 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