From 1520e434afbe931bf7d1c0d851ca0c33db199bd7 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 25 Jun 2019 06:23:25 +0200 Subject: [PATCH] [java] 'yield' statements support in the side-effect extractor GitOrigin-RevId: a6020c6427a05f0bcd6f6987a13252929854c547 --- ...afterIfSwitchCondition2Java13Preview.java} | 0 ... afterIfSwitchConditionJava13Preview.java} | 0 ...beforeIfSwitchCondition2Java12Preview.java | 14 ------ ...beforeIfSwitchCondition2Java13Preview.java | 14 ++++++ ...beforeIfSwitchConditionJava13Preview.java} | 12 ++--- .../siyeh/ig/psiutils/StatementExtractor.java | 45 +++++++++---------- 6 files changed, 42 insertions(+), 43 deletions(-) rename java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/{afterIfSwitchCondition2Java12Preview.java => afterIfSwitchCondition2Java13Preview.java} (100%) rename java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/{afterIfSwitchConditionJava12Preview.java => afterIfSwitchConditionJava13Preview.java} (100%) delete mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchCondition2Java12Preview.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchCondition2Java13Preview.java rename java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/{beforeIfSwitchConditionJava12Preview.java => beforeIfSwitchConditionJava13Preview.java} (63%) diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/afterIfSwitchCondition2Java12Preview.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/afterIfSwitchCondition2Java13Preview.java similarity index 100% rename from java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/afterIfSwitchCondition2Java12Preview.java rename to java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/afterIfSwitchCondition2Java13Preview.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/afterIfSwitchConditionJava12Preview.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/afterIfSwitchConditionJava13Preview.java similarity index 100% rename from java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/afterIfSwitchConditionJava12Preview.java rename to java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/afterIfSwitchConditionJava13Preview.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchCondition2Java12Preview.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchCondition2Java12Preview.java deleted file mode 100644 index 91d49e1bd31a..000000000000 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchCondition2Java12Preview.java +++ /dev/null @@ -1,14 +0,0 @@ -// "Extract side effects as an 'if' statement" "true" -class Z { - - void z() { - if (foo ? switch(0) { - case 0: break false; - case 1: break true; - default: break new Foo().getBar(); - } : switch(0) { - case 0: break false; - case 1: break true; - default: break false;}) {} - } -} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchCondition2Java13Preview.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchCondition2Java13Preview.java new file mode 100644 index 000000000000..afc282f29b32 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchCondition2Java13Preview.java @@ -0,0 +1,14 @@ +// "Extract side effects as an 'if' statement" "true" +class Z { + + void z() { + if (foo ? switch(0) { + case 0: yield false; + case 1: yield true; + default: yield new Foo().getBar(); + } : switch(0) { + case 0: yield false; + case 1: yield true; + default: yield false;}) {} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchConditionJava12Preview.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchConditionJava13Preview.java similarity index 63% rename from java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchConditionJava12Preview.java rename to java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchConditionJava13Preview.java index fcb6d4d434bb..623648907964 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchConditionJava12Preview.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/emptyStatement/beforeIfSwitchConditionJava13Preview.java @@ -6,20 +6,20 @@ class Z { case 0 -> false; case 1 -> { System.out.println("oops"); - break true; + yield true; } case 2 -> { System.out.println("bar"); - break Math.random() > 0.5 && new Foo().getBar(); + yield Math.random() > 0.5 && new Foo().getBar(); } case 3 -> { - if(Math.random() > 0.5) break true; - else break false; + if(Math.random() > 0.5) yield true; + else yield false; } case 4 -> { - if(Math.random() > 0.5) break true; + if(Math.random() > 0.5) yield true; System.out.println("four"); - break false; + yield false; } default -> "foo"+(new Foo()); }) {} diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/StatementExtractor.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/StatementExtractor.java index 06333fc7ff47..eb93571121fe 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/StatementExtractor.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/StatementExtractor.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.siyeh.ig.psiutils; import com.intellij.codeInsight.BlockUtils; @@ -77,12 +63,13 @@ public class StatementExtractor { PsiSwitchExpression switchExpression = PsiTreeUtil.getParentOfType(parentElement, PsiSwitchExpression.class, true, PsiMember.class, PsiLambdaExpression.class); if (switchExpression != null && PsiTreeUtil.isAncestor(root, switchExpression, false)) { - boolean isBreak = - parentElement instanceof PsiBreakStatement && ((PsiBreakStatement)parentElement).findExitedElement() == switchExpression; + boolean isYield = + parentElement instanceof PsiBreakStatement && ((PsiBreakStatement)parentElement).findExitedElement() == switchExpression || + parentElement instanceof PsiYieldStatement && ((PsiYieldStatement)parentElement).findEnclosingExpression() == switchExpression; boolean isRuleExpression = parentElement instanceof PsiExpressionStatement && parentElement.getParent() instanceof PsiSwitchLabeledRuleStatement && ((PsiSwitchLabeledRuleStatement)parentElement.getParent()).getEnclosingSwitchBlock() == switchExpression; - if (isBreak || isRuleExpression) { + if (isYield || isRuleExpression) { result = new Switch(switchExpression, Collections.singletonMap((PsiStatement)parentElement, result)); } else { @@ -272,6 +259,13 @@ public class StatementExtractor { } } + @Override + public void visitYieldStatement(PsiYieldStatement statement) { + if (statement.getExpression() != null && statement.findEnclosingExpression() == copy) { + process(statement); + } + } + @Override public void visitExpression(PsiExpression expression) { // Do not go into any expressions @@ -288,7 +282,7 @@ public class StatementExtractor { } }); replacementMap.forEach((statement, replacements) -> { - boolean keep = statement instanceof PsiBreakStatement && shouldKeepBreak(statement); + boolean keep = (statement instanceof PsiBreakStatement || statement instanceof PsiYieldStatement) && shouldKeepBreak(statement); if (!keep && replacements.length == 1) { statement.replace(replacements[0]); } @@ -302,11 +296,14 @@ public class StatementExtractor { parent.addBefore(replacement, statement); } } - if (keep) { - Objects.requireNonNull(((PsiBreakStatement)statement).getValueExpression()).delete(); + if (!keep) { + statement.delete(); + } + else if (statement instanceof PsiYieldStatement) { + statement.replace(factory.createStatementFromText("break;", null)); } else { - statement.delete(); + Objects.requireNonNull(((PsiBreakStatement)statement).getValueExpression()).delete(); } } }); @@ -314,7 +311,9 @@ public class StatementExtractor { } public boolean shouldKeepBreak(PsiStatement statement) { - if (PsiTreeUtil.skipWhitespacesAndCommentsForward(statement) instanceof PsiStatement) return true; + if (PsiTreeUtil.skipWhitespacesAndCommentsForward(statement) instanceof PsiStatement) { + return true; + } PsiElement parent = statement.getParent(); if (parent instanceof PsiCodeBlock) { PsiElement gParent = parent.getParent();