PsiElementVisitor (@NotNull ProblemsHolder holder, boolean isOnTheFly) { return new JavaElementVisitor() { @Override public void visitClass(@NotNull PsiClass aClass) { if (aClass instanceof PsiTypeParameter) return; if (PsiUtil.isLocalOrAnonymousClass(aClass) && !(aClass instanceof PsiEnumConstantInitializer)) return; var runner = new StandardDataFlowRunner(holder.getProject(), ThreeState.fromBoolean(IGNORE_ASSERT_STATEMENTS)); DataFlowInstructionVisitor visitor = analyzeDfaWithNestedClosures(aClass, holder, runner, Collections.singletonList(runner.createMemoryState())); List<DfaMemoryState> states = visitor.getEndOfInitializerStates(); boolean physical = aClass.isPhysical(); for (PsiMethod method : aClass.getConstructors()) { if (physical && !method.isPhysical()) { // Constructor could be provided by, e.g. Lombok plugin: ignore it, we won't report any problems inside anyway continue; } List<DfaMemoryState> initialStates; PsiMethodCallExpression call = JavaPsiConstructorUtil.findThisOrSuperCallInConstructor(method); if (JavaPsiConstructorUtil.isChainedConstructorCall(call) || (call == null && DfaUtil.hasImplicitImpureSuperCall(aClass, method))) { initialStates = Collections.singletonList(runner.createMemoryState()); } else { initialStates = ContainerUtil.map(states, DfaMemoryState::createCopy); } analyzeMethod(method, runner, initialStates); } } @Override public void visitMethod(@NotNull PsiMethod method) { if (method.isConstructor()) return; var runner = new StandardDataFlowRunner(holder.getProject(), ThreeState.fromBoolean(IGNORE_ASSERT_STATEMENTS)); analyzeMethod(method, runner, Collections.singletonList(runner.createMemoryState())); } private void analyzeMethod(PsiMethod method, StandardDataFlowRunner runner, List<DfaMemoryState> initialStates) { PsiCodeBlock scope = method.getBody(); if (scope == null) return; PsiClass containingClass = PsiTreeUtil.getParentOfType(method, PsiClass.class); if (containingClass != null && PsiUtil.isLocalOrAnonymousClass(containingClass) && !(containingClass instanceof PsiEnumConstantInitializer)) return; analyzeDfaWithNestedClosures(scope, holder, runner, initialStates); analyzeNullLiteralMethodArguments(method, holder); } @Override public void visitMethodReferenceExpression(@NotNull PsiMethodReferenceExpression expression) { super.visitMethodReferenceExpression(expression); if (!REPORT_UNSOUND_WARNINGS) return; final PsiElement resolve = expression.resolve(); if (resolve instanceof PsiMethod) { final PsiType methodReturnType = ((PsiMethod)resolve).getReturnType(); if (TypeConversionUtil.isPrimitiveWrapper(methodReturnType) && NullableNotNullManager.isNullable((PsiMethod)resolve)) { final PsiType returnType = LambdaUtil.getFunctionalInterfaceReturnType(expression); if (TypeConversionUtil.isPrimitiveAndNotNull(returnType)) { holder.registerProblem(expression, JavaAnalysisBundle.message("dataflow.message.unboxing.method.reference")); } } } } }; }