void (PsiArrayInitializerExpression expression, PsiExpression originalExpression) { PsiType type = expression.getType(); PsiType componentType = type instanceof PsiArrayType arrayType ? arrayType.getComponentType() : null; DfaVariableValue var = getTargetVariable(expression); DfaVariableValue arrayWriteTarget = var; if (var == null) { var = createTempVariable(type); } PsiExpression[] initializers = expression.getInitializers(); if (arrayWriteTarget != null) { PsiVariable arrayVariable = ObjectUtils.tryCast(arrayWriteTarget.getPsiVariable(), PsiVariable.class); if (arrayWriteTarget.isFlushableByCalls() || arrayVariable == null || VariableAccessUtils.variableIsUsed(arrayVariable, expression) || ExpressionUtils.getConstantArrayElements(arrayVariable) != null || !(ArrayElementDescriptor.getArrayElementValue(getFactory(), arrayWriteTarget, 0) instanceof DfaVariableValue)) { arrayWriteTarget = null; } } DfType arrayType = SpecialField.ARRAY_LENGTH.asDfType(DfTypes.intValue(initializers.length)) .meet(type == null ? DfTypes.OBJECT_OR_NULL : TypeConstraints.exact(type).asDfType()) .meet(DfTypes.LOCAL_OBJECT); if (arrayWriteTarget != null) { addInstruction(new JvmPushInstruction(arrayWriteTarget, null, true)); push(arrayType, expression); addInstruction(new AssignInstruction(originalExpression, arrayWriteTarget)); int index = 0; for (PsiExpression initializer : initializers) { DfaValue target = null; if (index < MAX_ARRAY_INDEX_FOR_INITIALIZER) { target = Objects.requireNonNull(ArrayElementDescriptor.getArrayElementValue(getFactory(), arrayWriteTarget, index)); } index++; addInstruction(new JvmPushInstruction(target == null ? myFactory.getUnknown() : target, null, true)); initializer.accept(this); if (componentType != null) { generateBoxingUnboxingInstructionFor(initializer, componentType); } addInstruction(new AssignInstruction(initializer, null)); addInstruction(new PopInstruction()); } } else { for (PsiExpression initializer : initializers) { addInstruction(new JvmPushInstruction(myFactory.getUnknown(), null, true)); initializer.accept(this); if (componentType != null) { generateBoxingUnboxingInstructionFor(initializer, componentType); } addInstruction(new AssignInstruction(initializer, null)); addInstruction(new PopInstruction()); } addInstruction(new JvmPushInstruction(var, null, true)); push(arrayType, expression); addInstruction(new AssignInstruction(originalExpression, var)); } }