void (PsiIfStatement ifStatement, @NotNull ModPsiUpdater updater) { boolean breaksNeedRelabeled = false; PsiStatement breakTarget = null; String newLabel = ""; if (ControlFlowUtils.statementContainsNakedBreak(ifStatement)) { breakTarget = PsiTreeUtil.getParentOfType(ifStatement, PsiLoopStatement.class, PsiSwitchStatement.class); if (breakTarget != null) { final PsiElement parent = breakTarget.getParent(); if (parent instanceof PsiLabeledStatement labeledStatement) { newLabel = labeledStatement.getLabelIdentifier().getText(); breakTarget = labeledStatement; } else { newLabel = SwitchUtils.findUniqueLabelName(ifStatement, "label"); } breaksNeedRelabeled = true; } } final PsiIfStatement statementToReplace = ifStatement; final PsiExpression switchExpression = SwitchUtils.getSwitchSelectorExpression(ifStatement.getCondition()); if (switchExpression == null) { return; } final List<IfStatementBranch> branches = new ArrayList<>(20); while (true) { final PsiExpression condition = ifStatement.getCondition(); final PsiStatement thenBranch = ifStatement.getThenBranch(); final IfStatementBranch ifBranch = new IfStatementBranch(thenBranch, false); extractCaseExpressions(condition, switchExpression, ifBranch); if (!branches.isEmpty()) { extractIfComments(ifStatement, ifBranch); } extractStatementComments(thenBranch, ifBranch); branches.add(ifBranch); final PsiStatement elseBranch = ifStatement.getElseBranch(); if (elseBranch instanceof PsiIfStatement) { ifStatement = (PsiIfStatement)elseBranch; } else if (elseBranch == null) { break; } else { final IfStatementBranch elseIfBranch = new IfStatementBranch(elseBranch, true); final PsiKeyword elseKeyword = ifStatement.getElseElement(); extractIfComments(elseKeyword, elseIfBranch); extractStatementComments(elseBranch, elseIfBranch); branches.add(elseIfBranch); break; } } if (SwitchUtils.canBePatternSwitchCase(ifStatement.getCondition(), switchExpression)) { final boolean hasDefaultElse = ContainerUtil.exists(branches, (branch) -> branch.isElse()); if (!hasDefaultElse && !hasUnconditionalPatternCheck(ifStatement, switchExpression)) { branches.add(new IfStatementBranch(new PsiEmptyStatementImpl(), true)); } } if (HighlightingFeature.PATTERNS_IN_SWITCH.isAvailable(switchExpression)){ if (getNullability(switchExpression) != Nullability.NOT_NULL && findNullCheckedOperand(statementToReplace) == null) { final IfStatementBranch defaultBranch = ContainerUtil.find(branches, (branch) -> branch.isElse()); final PsiElementFactory factory = PsiElementFactory.getInstance(ifStatement.getProject()); final PsiExpression condition = factory.createExpressionFromText("null", switchExpression.getContext()); if (defaultBranch != null) defaultBranch.addCaseExpression(condition); } } @NonNls final StringBuilder switchStatementText = new StringBuilder(); switchStatementText.append("switch(").append(switchExpression.getText()).append("){"); final PsiType type = switchExpression.getType(); final boolean castToInt = type != null && type.equalsToText(CommonClassNames.JAVA_LANG_INTEGER); for (IfStatementBranch branch : branches) { boolean hasConflicts = false; for (IfStatementBranch testBranch : branches) { if (branch == testBranch) { continue; } if (branch.topLevelDeclarationsConflictWith(testBranch)) { hasConflicts = true; } } dumpBranch(branch, castToInt, hasConflicts, breaksNeedRelabeled, newLabel, switchStatementText); } switchStatementText.append('}'); final PsiElementFactory factory = JavaPsiFacade.getElementFactory(ifStatement.getProject()); final PsiStatement newStatement = factory.createStatementFromText(switchStatementText.toString(), ifStatement); final PsiSwitchStatement replacement = (PsiSwitchStatement)statementToReplace.replace(newStatement); updater.moveTo(replacement); if (HighlightingFeature.ENHANCED_SWITCH.isAvailable(replacement)) { final EnhancedSwitchMigrationInspection.SwitchReplacer replacer = EnhancedSwitchMigrationInspection.findSwitchReplacer(replacement); if (replacer != null) { replacer.replace(replacement); } } if (breaksNeedRelabeled) { final PsiLabeledStatement labeledStatement = (PsiLabeledStatement)factory.createStatementFromText(newLabel + ":;", null); final PsiStatement statement = labeledStatement.getStatement(); assert statement != null; statement.replace(breakTarget); breakTarget.replace(labeledStatement); } }