List<ReadWriteVariableInstruction> (@NotNull GroovyControlFlow flow, @NotNull Set<? extends GrVariable> variables, @NotNull Set<? extends GrVariable> alreadyInitialized) { DFAEngine<MyData> engine = new DFAEngine<>(flow.getFlow(), new MyDFAInstance(), new MySemilattice()); final List<@Nullable MyData> dfaResult = engine.performDFAWithTimeout(); if (dfaResult == null) return null; List<ReadWriteVariableInstruction> result = new ArrayList<>(); Set<Integer> descriptors = variables.stream() .filter(Objects::nonNull) .map($this$createDescriptor -> flow.getIndex(VariableDescriptorFactory.createDescriptor($this$createDescriptor))) .collect(Collectors.toSet()); Set<Integer> initializedDescriptors = alreadyInitialized.stream() .filter(Objects::nonNull) .map($this$createDescriptor -> flow.getIndex(VariableDescriptorFactory.createDescriptor($this$createDescriptor))) .collect(Collectors.toSet()); for (int i = 0; i < flow.getFlow().length; i++) { Instruction instruction = flow.getFlow()[i]; if (instruction instanceof ReadWriteVariableInstruction && ((ReadWriteVariableInstruction)instruction).isWrite()) { final MyData initialized = dfaResult.get(i); int descriptor = ((ReadWriteVariableInstruction)instruction).getDescriptor(); if (!descriptors.contains(descriptor)) continue; if (initializedDescriptors.contains(descriptor)) { if (initialized.isInitialized(descriptor)) { result.add((ReadWriteVariableInstruction)instruction); } } else { if (initialized.isOverInitialized(descriptor)) { result.add((ReadWriteVariableInstruction)instruction); } } } } return result; }