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 6468b24767 [JAVAVSCODE-53] Assignments to parameters to record compact 
constructors should not be marked as unused.
     new 68bb0e8e61 Merge pull request #6635 from lahodaj/javavscode-53
6468b24767 is described below

commit 6468b247675ed17dc11b3b7a1810a5f9d3cd2e7f
Author: Jan Lahoda <jan.lah...@oracle.com>
AuthorDate: Mon Oct 30 15:09:13 2023 +0100

    [JAVAVSCODE-53] Assignments to parameters to record compact constructors 
should not be marked as unused.
---
 .../java/hints/bugs/UnusedAssignmentOrBranch.java  | 28 ++++++++++++++++++----
 .../hints/bugs/UnusedAssignmentOrBranchTest.java   | 27 +++++++++++++++++++++
 2 files changed, 51 insertions(+), 4 deletions(-)

diff --git 
a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/UnusedAssignmentOrBranch.java
 
b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/UnusedAssignmentOrBranch.java
index 1ec8ac0061..0e13f8e6d6 100644
--- 
a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/UnusedAssignmentOrBranch.java
+++ 
b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/UnusedAssignmentOrBranch.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Set;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
 import org.netbeans.api.java.source.CompilationInfo;
@@ -133,25 +134,44 @@ public class UnusedAssignmentOrBranch {
         @TriggerPattern("$mods$ $type $var = $value;")
     })
     public static ErrorDescription unusedAssignment(final HintContext ctx) {
+        final CompilationInfo info = ctx.getInfo();
+        Element var = 
info.getTrees().getElement(ctx.getVariables().get("$var"));
+
+        if (var == null || !LOCAL_VARIABLES.contains(var.getKind()) ||
+            isImplicitParamOfRecordCanonicalConstructor(info, var)) {
+            return null;
+        }
+
         final String unusedAssignmentLabel = 
NbBundle.getMessage(UnusedAssignmentOrBranch.class, 
"LBL_UNUSED_ASSIGNMENT_LABEL");
         Pair<Set<Tree>, Set<Element>> computedAssignments = 
computeUsedAssignments(ctx);
         
         if (ctx.isCanceled() || computedAssignments == null) return null;
 
-        final CompilationInfo info = ctx.getInfo();
         final Set<Tree> usedAssignments = computedAssignments.first();
         final Set<Element> usedVariables = computedAssignments.second();
-        Element var = 
info.getTrees().getElement(ctx.getVariables().get("$var"));
         TreePath valuePath = ctx.getVariables().get("$value");
         Tree value = (valuePath == null ? ctx.getPath() : valuePath).getLeaf();
 
-        if (var != null && LOCAL_VARIABLES.contains(var.getKind()) && 
!usedAssignments.contains(value) && usedVariables.contains(var)) {
+        if (!usedAssignments.contains(value) && usedVariables.contains(var)) {
             return ErrorDescriptionFactory.forTree(ctx, value, 
unusedAssignmentLabel);
         }
 
         return null;
     }
-    
+
+    private static boolean 
isImplicitParamOfRecordCanonicalConstructor(CompilationInfo info, Element el) {
+        Element enclosingElement = el.getEnclosingElement();
+
+        if (enclosingElement.getKind() != ElementKind.CONSTRUCTOR) {
+            return false;
+        }
+
+        ExecutableElement constr = (ExecutableElement) enclosingElement;
+
+        return info.getElements().isCompactConstructor(constr) &&
+               constr.getParameters().contains(el);
+    }
+
     private static boolean mayHaveSideEffects(HintContext ctx, TreePath path) {
         SideEffectVisitor visitor = new 
SideEffectVisitor(ctx).stopOnUnknownMethods(true);
         Tree culprit = null;
diff --git 
a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/bugs/UnusedAssignmentOrBranchTest.java
 
b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/bugs/UnusedAssignmentOrBranchTest.java
index c03f5d9fc7..94532dbf04 100644
--- 
a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/bugs/UnusedAssignmentOrBranchTest.java
+++ 
b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/bugs/UnusedAssignmentOrBranchTest.java
@@ -18,6 +18,7 @@
  */
 package org.netbeans.modules.java.hints.bugs;
 
+import org.junit.Assume;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.java.hints.test.api.HintTest;
 
@@ -211,4 +212,30 @@ public class UnusedAssignmentOrBranchTest extends 
NbTestCase {
                 .run(UnusedAssignmentOrBranch.class)
                 .assertWarnings();
     }
+
+    public void testRecordCompactConstructor() throws Exception {
+        Assume.assumeTrue(isRecordClassPresent());
+
+        HintTest
+                .create()
+                .input("package test;\n" +
+                       "\n" +
+                       "public record Test(int i, int j) {\n" +
+                       "    public Test {\n" +
+                       "        i = -i;\n" +
+                       "    }\n" +
+                       "}")
+                .sourceLevel("21")
+                .run(UnusedAssignmentOrBranch.class)
+                .assertWarnings();
+    }
+
+    private boolean isRecordClassPresent() {
+        try {
+            Class.forName("java.lang.Record");
+            return true;
+        } catch (ClassNotFoundException ex) {
+            return false;
+        }
+    }
 }


---------------------------------------------------------------------
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