void (final GrVariable variable, Instruction[] flow, final List<BitSet> writes, final int writeInstructionNumber, final ArrayList<UsageInfo> toInline) { for (Instruction instruction : flow) { final PsiElement element = instruction.getElement(); if (instruction instanceof ReadWriteVariableInstruction) { if (((ReadWriteVariableInstruction)instruction).isWrite()) continue; if (element instanceof GrVariable && element != variable) continue; if (!(element instanceof GrReferenceExpression ref)) continue; if (ref.isQualified() || ref.resolve() != variable) continue; final BitSet prev = writes.get(instruction.num()); if (writeInstructionNumber >= 0 && prev.cardinality() == 1 && prev.get(writeInstructionNumber)) { toInline.add(new UsageInfo(ref)); } else if (writeInstructionNumber == -1 && prev.cardinality() == 0) { toInline.add(new ClosureUsage(ref)); } } else if (element instanceof GrClosableBlock) { final BitSet prev = writes.get(instruction.num()); if (writeInstructionNumber >= 0 && prev.cardinality() == 1 && prev.get(writeInstructionNumber) || writeInstructionNumber == -1 && prev.cardinality() == 0) { final GroovyControlFlow closureFlow = ControlFlowUtils.getGroovyControlFlow((GrClosableBlock)element); collectRefs(variable, closureFlow.getFlow(), ControlFlowUtils.inferWriteAccessMap(closureFlow, variable), -1, toInline); } } else if (element instanceof GrAnonymousClassDefinition) { final BitSet prev = writes.get(instruction.num()); if (writeInstructionNumber >= 0 && prev.cardinality() == 1 && prev.get(writeInstructionNumber) || writeInstructionNumber == -1 && prev.cardinality() == 0) { ((GrAnonymousClassDefinition)element).acceptChildren(new GroovyRecursiveElementVisitor() { @Override public void visitField(@NotNull GrField field) { GrExpression initializer = field.getInitializerGroovy(); if (initializer != null) { GroovyControlFlow flow = ControlFlowBuilder.buildControlFlow(initializer); collectRefs(variable, flow.getFlow(), ControlFlowUtils.inferWriteAccessMap(flow, variable), -1, toInline); } } @Override public void visitMethod(@NotNull GrMethod method) { GrOpenBlock block = method.getBlock(); if (block != null) { GroovyControlFlow flow = ControlFlowUtils.getGroovyControlFlow(block); collectRefs(variable, flow.getFlow(), ControlFlowUtils.inferWriteAccessMap(flow, variable), -1, toInline); } } @Override public void visitClassInitializer(@NotNull GrClassInitializer initializer) { GrOpenBlock block = initializer.getBlock(); GroovyControlFlow flow = ControlFlowUtils.getGroovyControlFlow(block); collectRefs(variable, flow.getFlow(), ControlFlowUtils.inferWriteAccessMap(flow, variable), -1, toInline); } }); } } } }