From e8bf72eec654d4fb46d3eca1a255ab3b2ece4c28 Mon Sep 17 00:00:00 2001 From: Junichi Yamamoto Date: Mon, 10 Jul 2023 00:09:29 +0900 Subject: [PATCH] Fix incorrect AbstractClassInstantiationHintError #6119 - https://github.com/apache/netbeans/issues/6119 - Check whether the class name has `$` - Add unit tests --- .../modules/php/editor/CodeUtils.java | 9 ++++ .../AbstractClassInstantiationHintError.java | 12 +++-- .../AbstractClassInstantiationHint/gh6119.php | 23 +++++++++ .../gh6119.php.testGH6119.hints | 1 + .../testAbstractClassInstantiationHint.php | 0 ...p.testAbstractClassInstantiationHint.hints | 0 .../testAbstractClassInstantiationHint_02.php | 0 ...estAbstractClassInstantiationHint_02.hints | 0 ...stractClassInstantiationHintErrorTest.java | 47 +++++++++++++++++++ .../php/editor/verification/HintsTest.java | 8 ---- 10 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 php/php.editor/test/unit/data/testfiles/verification/AbstractClassInstantiationHint/gh6119.php create mode 100644 php/php.editor/test/unit/data/testfiles/verification/AbstractClassInstantiationHint/gh6119.php.testGH6119.hints rename php/php.editor/test/unit/data/testfiles/verification/{ => AbstractClassInstantiationHint}/testAbstractClassInstantiationHint.php (100%) rename php/php.editor/test/unit/data/testfiles/verification/{ => AbstractClassInstantiationHint}/testAbstractClassInstantiationHint.php.testAbstractClassInstantiationHint.hints (100%) rename php/php.editor/test/unit/data/testfiles/verification/{ => AbstractClassInstantiationHint}/testAbstractClassInstantiationHint_02.php (100%) rename php/php.editor/test/unit/data/testfiles/verification/{ => AbstractClassInstantiationHint}/testAbstractClassInstantiationHint_02.php.testAbstractClassInstantiationHint_02.hints (100%) create mode 100644 php/php.editor/test/unit/src/org/netbeans/modules/php/editor/verification/AbstractClassInstantiationHintErrorTest.java diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java b/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java index fcc307ef3106..d87712a33306 100644 --- a/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java +++ b/php/php.editor/src/org/netbeans/modules/php/editor/CodeUtils.java @@ -690,6 +690,15 @@ public static boolean isConstructor(MethodDeclaration node) { return "__construct".equals(extractMethodName(node)); //NOI18N } + public static boolean isDollaredName(ClassName className) { + Expression name = className.getName(); + if (name instanceof Variable) { + Variable variable = (Variable) name; + return variable.isDollared(); + } + return false; + } + /** * Finds common namespace prefixes for the given sorted namespaces. *

diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/verification/AbstractClassInstantiationHintError.java b/php/php.editor/src/org/netbeans/modules/php/editor/verification/AbstractClassInstantiationHintError.java index f1d3dcc389dc..375807bed5ac 100644 --- a/php/php.editor/src/org/netbeans/modules/php/editor/verification/AbstractClassInstantiationHintError.java +++ b/php/php.editor/src/org/netbeans/modules/php/editor/verification/AbstractClassInstantiationHintError.java @@ -19,11 +19,13 @@ package org.netbeans.modules.php.editor.verification; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; import org.netbeans.modules.csl.api.Hint; import org.netbeans.modules.csl.api.OffsetRange; import org.netbeans.modules.csl.spi.support.CancelSupport; +import org.netbeans.modules.php.editor.CodeUtils; import org.netbeans.modules.php.editor.api.ElementQuery.Index; import org.netbeans.modules.php.editor.api.NameKind; import org.netbeans.modules.php.editor.api.QualifiedName; @@ -79,7 +81,7 @@ private CheckVisitor(FileObject fileObject, Index index, Model model) { } public List getHints() { - return hints; + return Collections.unmodifiableList(hints); } @Override @@ -88,7 +90,12 @@ public List getHints() { "AbstractClassInstantiationDesc=Abstract class {0} can not be instantiated" }) public void visit(ClassInstanceCreation node) { - if (CancelSupport.getDefault().isCancelled()) { + if (CancelSupport.getDefault().isCancelled() + || CodeUtils.isDollaredName(node.getClassName())) { + // GH-6119 + // e.g. + // abstract class AbstractClass {} + // $a = new $abstractClass(); return; } ASTNodeInfo info = ASTNodeInfo.create(node); @@ -110,7 +117,6 @@ public void visit(ClassInstanceCreation node) { } } } - } @Override diff --git a/php/php.editor/test/unit/data/testfiles/verification/AbstractClassInstantiationHint/gh6119.php b/php/php.editor/test/unit/data/testfiles/verification/AbstractClassInstantiationHint/gh6119.php new file mode 100644 index 000000000000..105ae28aa97f --- /dev/null +++ b/php/php.editor/test/unit/data/testfiles/verification/AbstractClassInstantiationHint/gh6119.php @@ -0,0 +1,23 @@ +