IG: copied object passed to super constructor should not prevent warning (IDEA-247907)
authorBas Leijdekkers <basleijdekkers@gmail.com>
Mon, 10 Aug 2020 14:47:30 +0000 (16:47 +0200)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Mon, 10 Aug 2020 19:48:58 +0000 (19:48 +0000)
GitOrigin-RevId: 2d41b2e365d397a17e9dd4382a3e75f33ec1a631

plugins/InspectionGadgets/src/com/siyeh/ig/bugs/CopyConstructorMissesFieldInspection.java
plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/copy_constructor_misses_field/CopyConstructorMissesField.java [new file with mode: 0644]
plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/CopyConstructorMissesFieldInspectionTest.java

index 33f36fe5c356e196d1153188c4c8f66a0484124c..f3f77dc23ee2fd5dd8d504ceb66d799eccb1c758 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
 package com.siyeh.ig.bugs;
 
 import com.intellij.psi.*;
@@ -16,8 +16,10 @@ import com.siyeh.ig.psiutils.MethodUtils;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 
 /**
  * @author Bas Leijdekkers
@@ -58,11 +60,11 @@ public class CopyConstructorMissesFieldInspection extends BaseInspection {
       if (aClass == null) {
         return;
       }
-      final List<PsiField> fields = Arrays.stream(aClass.getFields())
-        .filter(f -> !f.hasModifierProperty(PsiModifier.STATIC)
-                     && !f.hasModifierProperty(PsiModifier.TRANSIENT)
-                     && (!f.hasModifierProperty(PsiModifier.FINAL) || f.getInitializer() == null))
-        .collect(Collectors.toList());
+      final List<PsiField> fields = ContainerUtil.filter(aClass.getFields(),
+                                                         f -> !f.hasModifierProperty(PsiModifier.STATIC) &&
+                                                              !f.hasModifierProperty(PsiModifier.TRANSIENT) &&
+                                                              (!f.hasModifierProperty(PsiModifier.FINAL) ||
+                                                               f.getInitializer() == null));
       if (fields.isEmpty()) return;
       final PsiParameter parameter = Objects.requireNonNull(method.getParameterList().getParameter(0));
       final List<PsiField> assignedFields = new SmartList<>();
@@ -96,7 +98,7 @@ public class CopyConstructorMissesFieldInspection extends BaseInspection {
           assignedFields.add((PsiField)variable);
         }
       }
-      else if (JavaPsiConstructorUtil.isConstructorCall(element)) {
+      else if (JavaPsiConstructorUtil.isChainedConstructorCall(element)) {
         final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)element;
         for (PsiExpression argument : methodCallExpression.getArgumentList().getExpressions()) {
           argument = PsiUtil.skipParenthesizedExprDown(argument);
@@ -138,7 +140,7 @@ public class CopyConstructorMissesFieldInspection extends BaseInspection {
       return true;
     }
 
-    private static PsiVariable resolveVariable(PsiExpression expression, PsiParameter requiredQualifier) {
+    private static PsiVariable resolveVariable(PsiExpression expression, @Nullable PsiParameter requiredQualifier) {
       if (!(expression instanceof PsiReferenceExpression)) {
         return null;
       }
@@ -156,7 +158,7 @@ public class CopyConstructorMissesFieldInspection extends BaseInspection {
       return target instanceof PsiVariable ? (PsiVariable)target : null;
     }
 
-    private static PsiField resolveFieldOfGetter(PsiExpression expression, PsiParameter requiredQualifier) {
+    private static PsiField resolveFieldOfGetter(PsiExpression expression, @NotNull PsiParameter requiredQualifier) {
       if (!(expression instanceof PsiMethodCallExpression)) {
         return null;
       }
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/copy_constructor_misses_field/CopyConstructorMissesField.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/copy_constructor_misses_field/CopyConstructorMissesField.java
new file mode 100644 (file)
index 0000000..90b9e6e
--- /dev/null
@@ -0,0 +1,17 @@
+class CopyConstructorMissesField {
+
+  private String name;
+
+  CopyConstructorMissesField(CopyConstructorMissesField other) {
+    name = other.name;
+  }
+}
+class Child extends CopyConstructorMissesField {
+  private String field1;
+  private String field2;
+
+  <warning descr="Copy constructor does not copy field 'field2'">Child</warning>(Child other) {
+    super(other);
+    field1 = other.field1;
+  }
+}
\ No newline at end of file
index b39d7439bfdc0ffa3f09f068147cd36604e39e46..f664701c31be5e610b19d380dfbfb700ea9cae8e 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
+// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
 package com.siyeh.ig.bugs;
 
 import com.intellij.codeInspection.InspectionProfileEntry;
@@ -10,6 +10,10 @@ import org.jetbrains.annotations.Nullable;
  */
 public class CopyConstructorMissesFieldInspectionTest extends LightJavaInspectionTestCase {
 
+  public void testCopyConstructorMissesField() {
+    doTest();
+  }
+
   public void testSimple() {
     doTest("class Simple {" +
            "  private String name;" +