/** Start the method's visit. */ public void start() { if (!mg.isAbstract() && !mg.isNative()) { for (InstructionHandle ih = mg.getInstructionList().getStart(); ih != null; ih = ih.getNext()) { Instruction i = ih.getInstruction(); if (!visitInstruction(i)) i.accept(this); } updateExceptionHandlers(); } }
@NotNull protected DfaInstructionState[] acceptInstruction( @NotNull InstructionVisitor visitor, @NotNull DfaInstructionState instructionState) { Instruction instruction = instructionState.getInstruction(); PsiElement closure = DfaUtil.getClosureInside(instruction); if (closure instanceof PsiClass) { registerNestedClosures(instructionState, (PsiClass) closure); } else if (closure instanceof PsiLambdaExpression) { registerNestedClosures(instructionState, (PsiLambdaExpression) closure); } return instruction.accept(this, instructionState.getMemoryState(), visitor); }
private void processInstruction(Instruction instruction, final int currentPosition) { instruction.accept( new InstructionVisitor() { @Override public void visitInstructionWithNext(@NotNull InstructionWithNext instruction) { instruction.setNext(getNextPosition(currentPosition)); } @Override public void visitJump(@NotNull AbstractJumpInstruction instruction) { instruction.setResolvedTarget(getJumpTarget(instruction.getTargetLabel())); } @Override public void visitNondeterministicJump( @NotNull NondeterministicJumpInstruction instruction) { instruction.setNext(getNextPosition(currentPosition)); List<Label> targetLabels = instruction.getTargetLabels(); for (Label targetLabel : targetLabels) { instruction.setResolvedTarget(targetLabel, getJumpTarget(targetLabel)); } } @Override public void visitConditionalJump(@NotNull ConditionalJumpInstruction instruction) { Instruction nextInstruction = getNextPosition(currentPosition); Instruction jumpTarget = getJumpTarget(instruction.getTargetLabel()); if (instruction.getOnTrue()) { instruction.setNextOnFalse(nextInstruction); instruction.setNextOnTrue(jumpTarget); } else { instruction.setNextOnFalse(jumpTarget); instruction.setNextOnTrue(nextInstruction); } visitJump(instruction); } @Override public void visitLocalFunctionDeclarationInstruction( @NotNull LocalFunctionDeclarationInstruction instruction) { PseudocodeImpl body = (PseudocodeImpl) instruction.getBody(); body.setParent(PseudocodeImpl.this); body.postProcess(); instruction.setNext(getSinkInstruction()); } @Override public void visitSubroutineExit(@NotNull SubroutineExitInstruction instruction) { // Nothing } @Override public void visitSubroutineSink(@NotNull SubroutineSinkInstruction instruction) { // Nothing } @Override public void visitInstruction(@NotNull Instruction instruction) { throw new UnsupportedOperationException(instruction.toString()); } }); }