mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Java: Generate conditional 'break' or 'continue' in extracted duplicates (IDEA-182195)
This commit is contained in:
+19
-11
@@ -915,12 +915,7 @@ public class ExtractMethodProcessor implements MatchProvider {
|
||||
ifStatement = (PsiIfStatement)myElementFactory.createStatementFromText("if (" + varName + "==null) return null;", null);
|
||||
}
|
||||
else if (myGenerateConditionalExit) {
|
||||
if (myFirstExitStatementCopy instanceof PsiReturnStatement && ((PsiReturnStatement)myFirstExitStatementCopy).getReturnValue() != null) {
|
||||
ifStatement = (PsiIfStatement)myElementFactory.createStatementFromText("if (" + varName + "==null) return null;", null);
|
||||
}
|
||||
else {
|
||||
ifStatement = (PsiIfStatement)myElementFactory.createStatementFromText("if (" + varName + "==null) " + myFirstExitStatementCopy.getText(), null);
|
||||
}
|
||||
ifStatement = generateConditionalExitStatement(varName);
|
||||
}
|
||||
else {
|
||||
ifStatement = (PsiIfStatement)myElementFactory.createStatementFromText("if (" + varName + "==null) return;", null);
|
||||
@@ -931,7 +926,7 @@ public class ExtractMethodProcessor implements MatchProvider {
|
||||
else if (myNotNullConditionalCheck) {
|
||||
String varName = myOutputVariable != null ? myOutputVariable.getName() : "x";
|
||||
varName = declareVariableAtMethodCallLocation(varName, myReturnType instanceof PsiPrimitiveType ? ((PsiPrimitiveType)myReturnType).getBoxedType(myCodeFragmentMember) : myReturnType);
|
||||
addToMethodCallLocation(myElementFactory.createStatementFromText("if (" + varName + " != null) return " + varName + ";", null));
|
||||
addToMethodCallLocation(generateNotNullConditionalStatement(varName));
|
||||
declareVariableReusedAfterCall(myOutputVariable);
|
||||
}
|
||||
else if (myGenerateConditionalExit) {
|
||||
@@ -1041,6 +1036,19 @@ public class ExtractMethodProcessor implements MatchProvider {
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private PsiIfStatement generateConditionalExitStatement(String varName) {
|
||||
if (myFirstExitStatementCopy instanceof PsiReturnStatement && ((PsiReturnStatement)myFirstExitStatementCopy).getReturnValue() != null) {
|
||||
return (PsiIfStatement)myElementFactory.createStatementFromText("if (" + varName + "==null) return null;", null);
|
||||
}
|
||||
return (PsiIfStatement)myElementFactory.createStatementFromText("if (" + varName + "==null) " + myFirstExitStatementCopy.getText(), null);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private PsiStatement generateNotNullConditionalStatement(String varName) {
|
||||
return myElementFactory.createStatementFromText("if (" + varName + " != null) return " + varName + ";", null);
|
||||
}
|
||||
|
||||
protected PsiExpression expressionToReplace(PsiExpression expression) {
|
||||
if (expression instanceof PsiAssignmentExpression) {
|
||||
return ((PsiAssignmentExpression)expression).getRExpression();
|
||||
@@ -1299,16 +1307,16 @@ public class ExtractMethodProcessor implements MatchProvider {
|
||||
}
|
||||
|
||||
private void addNotNullConditionalCheck(Match match, PsiElement replacedMatch) {
|
||||
if (myNotNullConditionalCheck && myOutputVariable != null) {
|
||||
if ((myNotNullConditionalCheck || myGenerateConditionalExit) && myOutputVariable != null) {
|
||||
ReturnValue returnValue = match.getOutputVariableValue(myOutputVariable);
|
||||
if (returnValue instanceof VariableReturnValue) {
|
||||
String varName = ((VariableReturnValue)returnValue).getVariable().getName();
|
||||
LOG.assertTrue(varName != null, "returned variable name is null");
|
||||
PsiStatement statement = PsiTreeUtil.getParentOfType(replacedMatch, PsiStatement.class, false);
|
||||
if (statement != null) {
|
||||
PsiStatement conditionalReturn =
|
||||
myElementFactory.createStatementFromText("if (" + varName + " != null) return " + varName + ";", null);
|
||||
statement.getParent().addAfter(conditionalReturn, statement);
|
||||
PsiStatement conditionalExit = myNotNullConditionalCheck ?
|
||||
generateNotNullConditionalStatement(varName) : generateConditionalExitStatement(varName);
|
||||
statement.getParent().addAfter(conditionalExit, statement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user