DfaInstructionState[] (@NotNull DataFlowInterpreter interpreter, @NotNull DfaMemoryState stateBefore) { DfaValue index = stateBefore.pop(); DfaValue array = stateBefore.pop(); DfaInstructionState[] states = myProblem.processOutOfBounds(interpreter, stateBefore, index, array, myOutOfBoundsTransfer); if (states != null) return states; LongRangeSet rangeSet = DfIntType.extractRange(stateBefore.getDfType(index)); DfaValue arrayElementValue = ArrayElementDescriptor.getArrayElementValue(interpreter.getFactory(), array, rangeSet); DfaValue result; if (!DfaTypeValue.isUnknown(arrayElementValue)) { result = arrayElementValue; } else { DfType type = TypeConstraint.fromDfType(stateBefore.getDfType(array)).getArrayComponentType(); type = type.meet(ArrayElementDescriptor.getArrayComponentType(array)); result = type == DfType.BOTTOM ? interpreter.getFactory().getUnknown() : interpreter.getFactory().fromDfType(type); } if (!(result instanceof DfaVariableValue) && array instanceof DfaVariableValue) { for (DfaVariableValue value : ((DfaVariableValue)array).getDependentVariables().toArray(new DfaVariableValue[0])) { if (value.getQualifier() == array) { JavaDfaHelpers.dropLocality(value, stateBefore); } } } pushResult(interpreter, stateBefore, result); return nextStates(interpreter, stateBefore); }