Mutability (@NotNull PsiModifierListOwner owner) { if (owner instanceof PsiParameter && owner.getParent() instanceof PsiParameterList list) { PsiMethod method = ObjectUtils.tryCast(list.getParent(), PsiMethod.class); if (method != null) { int index = list.getParameterIndex((PsiParameter)owner); JavaMethodContractUtil.ContractInfo contractInfo = JavaMethodContractUtil.getContractInfo(method); if (contractInfo.isExplicit()) { MutationSignature signature = contractInfo.getMutationSignature(); if (signature.mutatesArg(index)) { return MUTABLE; } else if (signature.preservesArg(index)) { return MUST_NOT_MODIFY; } } return UNKNOWN; } } if (AnnotationUtil.isAnnotated(owner, Collections.singleton(UNMODIFIABLE_ANNOTATION), AnnotationUtil.CHECK_HIERARCHY | AnnotationUtil.CHECK_EXTERNAL | AnnotationUtil.CHECK_INFERRED)) { return UNMODIFIABLE; } if (AnnotationUtil.isAnnotated(owner, Collections.singleton(UNMODIFIABLE_VIEW_ANNOTATION), AnnotationUtil.CHECK_HIERARCHY | AnnotationUtil.CHECK_EXTERNAL | AnnotationUtil.CHECK_INFERRED)) { return UNMODIFIABLE_VIEW; } if (owner instanceof PsiField field && owner.hasModifierProperty(PsiModifier.FINAL)) { List<PsiExpression> initializers = ContainerUtil.createMaybeSingletonList(field.getInitializer()); if (initializers.isEmpty() && !owner.hasModifierProperty(PsiModifier.STATIC)) { initializers = DfaPsiUtil.findAllConstructorInitializers(field); } initializers = StreamEx.of(initializers).flatMap(ExpressionUtils::nonStructuralChildren).toList(); if (initializers.isEmpty()) return UNKNOWN; Mutability mutability = UNMODIFIABLE; for (PsiExpression initializer : initializers) { Mutability newMutability = UNKNOWN; if (ClassUtils.isImmutable(initializer.getType())) { newMutability = UNMODIFIABLE; } else if (initializer instanceof PsiMethodCallExpression call) { if (STREAM_COLLECT.test(call)) { PsiExpression collector = call.getArgumentList().getExpressions()[0]; newMutability = UNMODIFIABLE_COLLECTORS.matches(collector) ? UNMODIFIABLE : UNKNOWN; } else if (STREAM_TO_LIST.test(call)) { newMutability = UNMODIFIABLE; } else { PsiMethod method = call.resolveMethod(); newMutability = method == null ? UNKNOWN : getMutability(method); } } mutability = mutability.join(newMutability); if (!mutability.isUnmodifiable()) break; } return mutability; } return owner instanceof PsiMethodImpl ? JavaSourceInference.inferMutability((PsiMethodImpl)owner) : UNKNOWN; }