diff --git a/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToStringSwitch.java b/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToStringSwitch.java --- a/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToStringSwitch.java +++ b/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToStringSwitch.java @@ -368,6 +368,8 @@ private final List> literal2Statement; private final TreePathHandle defaultStatement; private boolean varNotNull; + + private Set ifSeen = new HashSet(); public ConvertToSwitch(CompilationInfo info, TreePath create, TreePathHandle value, List> literal2Statement, TreePathHandle defaultStatement, boolean varNotNull) { @@ -482,12 +484,20 @@ return label; } + + private Tree findExpressionParentIf(TreePath p) { + while (!StatementTree.class.isAssignableFrom(p.getLeaf().getKind().asInterface()) && p != null) { + p = p.getParentPath(); + } + return p == null ? null : p.getLeaf(); + } private boolean addCase(WorkingCopy copy, CatchDescription desc, List cases, Map> catch2Declared, Map> catch2Used) { TreeMaker make = copy.getTreeMaker(); List statements = new LinkedList(); Tree then = desc.path.getLeaf(); + Tree replacedByCase = null; if (then.getKind() == Kind.BLOCK) { Set currentDeclared = catch2Declared.get(desc.path); boolean keepBlock = false; @@ -517,15 +527,17 @@ } BlockTree block = (BlockTree) then; - if (keepBlock) { if (!exitsFromAllBranches) { - statements.add(make.addBlockStatement(block, make.Break(null))); + statements.add( + make.asReplacementOf( + make.addBlockStatement(block, make.Break(null)), block, true)); } else { statements.add(block); } } else { statements.addAll(block.getStatements()); + replacedByCase = block; if (!exitsFromAllBranches) { statements.add(make.Break(null)); } @@ -536,9 +548,9 @@ statements.add(make.Break(null)); } } - + if (desc.literals == null) { - cases.add(make.Case(null, statements)); + cases.add(make.asReplacementOf(make.Case(null, statements), replacedByCase, true)); return false; } @@ -551,12 +563,19 @@ //XXX: log return true; } + Tree ifSt = findExpressionParentIf(lit); + if (ifSt != null && !ifSeen.add(ifSt)) { + ifSt = null; + } List body = it.hasNext() ? Collections.emptyList() : statements; - - cases.add(make.Case((ExpressionTree) lit.getLeaf(), body)); + CaseTree nc = make.Case((ExpressionTree) lit.getLeaf(), body); + if (ifSt != null) { + nc = make.asReplacementOf(nc, ifSt, true); + } + cases.add(nc); } - + return false; }