From 2eb0f4d07c759cf1b6e93d30872ca7e0c411f757 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 14 Oct 2025 18:33:37 +0200 Subject: [PATCH] [java-analysis] clean up: simplify getConstructorSideEffect, relying on MutationSignature only GitOrigin-RevId: f919f8fd00fb2f3b2de2c385e75010c6ca70a1b4 --- .../siyeh/ig/psiutils/SideEffectChecker.java | 50 +------- .../PointlessNullCheck.java | 2 + .../inlineMethod/AnonymousCall.java.after | 5 - java/jdkAnnotations/java/lang/annotations.xml | 94 +++++++++++++- java/jdkAnnotations/java/util/annotations.xml | 115 ++++++++++++++++++ 5 files changed, 214 insertions(+), 52 deletions(-) diff --git a/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SideEffectChecker.java b/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SideEffectChecker.java index 1ef7396981f0..96e689ae3360 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SideEffectChecker.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SideEffectChecker.java @@ -329,52 +329,12 @@ public final class SideEffectChecker { } private static @NotNull ThreeState getConstructorSideEffect(@NotNull PsiNewExpression newExpression) { - if (newExpression.isArrayCreation()) return ThreeState.NO; - PsiAnonymousClass anonymousClass = newExpression.getAnonymousClass(); - if (anonymousClass != null && anonymousClass.getInitializers().length == 0) { - PsiClass baseClass = anonymousClass.getBaseClassType().resolve(); - if (baseClass != null && baseClass.isInterface()) { - return ThreeState.NO; - } + MutationSignature signature = MutationSignature.fromCall(newExpression); + if (signature.isPure()) { + return ThreeState.NO; } - PsiJavaCodeReferenceElement classReference = newExpression.getClassReference(); - PsiClass aClass = classReference == null ? null : tryCast(classReference.resolve(), PsiClass.class); - String qualifiedName = aClass == null ? null : aClass.getQualifiedName(); - if (qualifiedName == null) return ThreeState.UNSURE; - if (ourSideEffectFreeClasses.contains(qualifiedName)) return ThreeState.NO; - PsiMethod method = newExpression.resolveConstructor(); - if (method != null && !method.isDefaultConstructor()) { - MutationSignature signature = MutationSignature.fromMethod(method); - if (signature.isPure()) { - return ThreeState.NO; - } - if (signature.mutatesAnything()) { - return ThreeState.YES; - } - } - - PsiFile file = aClass.getContainingFile(); - PsiDirectory directory = file.getContainingDirectory(); - PsiPackage classPackage = directory == null ? null : JavaDirectoryService.getInstance().getPackage(directory); - String packageName = classPackage == null ? null : classPackage.getQualifiedName(); - - // all Throwable descendants from java.lang are side effects free - if (CommonClassNames.DEFAULT_PACKAGE.equals(packageName) || "java.io".equals(packageName)) { - if (PsiClassUtil.isThrowable(aClass)) { - return ThreeState.NO; - } - } - if (method == null || method.isDefaultConstructor()) { - PsiClass superClass = aClass.getSuperClass(); - if (superClass != null && CommonClassNames.JAVA_LANG_OBJECT.equals(superClass.getQualifiedName())) { - for (PsiClassInitializer initializer : aClass.getInitializers()) { - if (!initializer.hasModifierProperty(PsiModifier.STATIC)) return ThreeState.UNSURE; - } - for (PsiField field : aClass.getFields()) { - if (!field.hasModifierProperty(PsiModifier.STATIC) && field.hasInitializer()) return ThreeState.UNSURE; - } - return ThreeState.NO; - } + if (signature.mutatesAnything()) { + return ThreeState.YES; } return ThreeState.UNSURE; } diff --git a/java/java-tests/testData/ig/com/siyeh/igtest/controlflow/pointless_null_check/PointlessNullCheck.java b/java/java-tests/testData/ig/com/siyeh/igtest/controlflow/pointless_null_check/PointlessNullCheck.java index be25bcc06ad3..ce3a103952fc 100644 --- a/java/java-tests/testData/ig/com/siyeh/igtest/controlflow/pointless_null_check/PointlessNullCheck.java +++ b/java/java-tests/testData/ig/com/siyeh/igtest/controlflow/pointless_null_check/PointlessNullCheck.java @@ -3,6 +3,8 @@ package com.siyeh.igtest.controlflow.pointless_null_check; public class PointlessNullCheck { String arg1 = "foo"; + + double sideEffect = Math.random(); public void testMethods(Object obj, Object obj1, Object obj2) { if(obj != null && check(obj)) { diff --git a/java/java-tests/testData/refactoring/inlineMethod/AnonymousCall.java.after b/java/java-tests/testData/refactoring/inlineMethod/AnonymousCall.java.after index feb4296de1e2..3fd68f3d3fbd 100644 --- a/java/java-tests/testData/refactoring/inlineMethod/AnonymousCall.java.after +++ b/java/java-tests/testData/refactoring/inlineMethod/AnonymousCall.java.after @@ -1,10 +1,5 @@ class Foo { void test() { - new Object() { - void foo(String s) { - System.out.println(s); - } - }; System.out.println("hello"); } } \ No newline at end of file diff --git a/java/jdkAnnotations/java/lang/annotations.xml b/java/jdkAnnotations/java/lang/annotations.xml index dc553a1937db..ea57a6b33af0 100644 --- a/java/jdkAnnotations/java/lang/annotations.xml +++ b/java/jdkAnnotations/java/lang/annotations.xml @@ -5,6 +5,11 @@ + + + + + @@ -44,11 +49,21 @@ + + + + + + + + + + @@ -651,6 +666,11 @@ + + + + + @@ -680,6 +700,11 @@ + + + + + @@ -688,6 +713,16 @@ + + + + + + + + + + @@ -706,12 +741,22 @@ - + + + + + + - + + + + + + @@ -759,6 +804,11 @@ + + + + + @@ -807,11 +857,21 @@ + + + + + + + + + + @@ -1058,6 +1118,11 @@ + + + + + @@ -1099,6 +1164,11 @@ + + + + + @@ -1655,6 +1725,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/java/jdkAnnotations/java/util/annotations.xml b/java/jdkAnnotations/java/util/annotations.xml index 21d527a59c92..08326e60fcb7 100644 --- a/java/jdkAnnotations/java/util/annotations.xml +++ b/java/jdkAnnotations/java/util/annotations.xml @@ -2854,6 +2854,11 @@ + + + + + @@ -3278,6 +3283,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -3288,6 +3313,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3295,6 +3360,11 @@ + + + + + @@ -4994,6 +5064,11 @@ + + + + + @@ -5047,6 +5122,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -5054,5 +5149,25 @@ + + + + + + + + + + + + + + + + + + + +