Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKalyan Prasad Tatavarthi2019-03-14 05:36:04 +0000
committerKalyan Prasad Tatavarthi2019-03-14 05:36:04 +0000
commitfe49b5fe962e9d503d5c27aed3845fe49b6fb6d8 (patch)
treedb38117d9bf0ebcc10cfe30a0d417ebaefdc5f15
parent4425ba68ac372ecba1609ab828ee1cc2a1213dfd (diff)
downloadeclipse.jdt.ui-fe49b5fe962e9d503d5c27aed3845fe49b6fb6d8.tar.gz
eclipse.jdt.ui-fe49b5fe962e9d503d5c27aed3845fe49b6fb6d8.tar.xz
eclipse.jdt.ui-fe49b5fe962e9d503d5c27aed3845fe49b6fb6d8.zip
Bug 545161: [12][extract method] Does not pass the variable used inY20190316-1220
switch expression to extracted method Change-Id: Id3772497d57ba5d0af0a05749143cfa68d00ed5b Signed-off-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
-rw-r--r--org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java35
-rw-r--r--org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/InputFlowAnalyzer.java32
2 files changed, 56 insertions, 11 deletions
diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java
index ed854ca1a9..33622ab4b2 100644
--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java
+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/FlowAnalyzer.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -92,6 +92,7 @@ import org.eclipse.jdt.core.dom.SuperConstructorInvocation;
import org.eclipse.jdt.core.dom.SuperFieldAccess;
import org.eclipse.jdt.core.dom.SuperMethodInvocation;
import org.eclipse.jdt.core.dom.SwitchCase;
+import org.eclipse.jdt.core.dom.SwitchExpression;
import org.eclipse.jdt.core.dom.SwitchStatement;
import org.eclipse.jdt.core.dom.SynchronizedStatement;
import org.eclipse.jdt.core.dom.ThisExpression;
@@ -337,18 +338,25 @@ abstract class FlowAnalyzer extends GenericVisitor {
//---- Helper to process switch statement ----------------------------------------
protected SwitchData createSwitchData(SwitchStatement node) {
+ return createSwitchData(node.statements());
+ }
+
+ protected SwitchData createSwitchData(SwitchExpression node) {
+ return createSwitchData(node.statements());
+ }
+
+ protected SwitchData createSwitchData(List<Statement> statements) {
SwitchData result= new SwitchData();
- List<Statement> statements= node.statements();
- if (statements.isEmpty())
+ if (statements == null || statements.isEmpty())
return result;
int start= -1, end= -1;
GenericSequentialFlowInfo info= null;
- for (Iterator<Statement> iter= statements.iterator(); iter.hasNext(); ) {
+ for (Iterator<Statement> iter= statements.iterator(); iter.hasNext();) {
Statement statement= iter.next();
if (statement instanceof SwitchCase) {
- SwitchCase switchCase= (SwitchCase)statement;
+ SwitchCase switchCase= (SwitchCase) statement;
if (switchCase.isDefault()) {
result.setHasDefaultCase();
}
@@ -372,9 +380,17 @@ abstract class FlowAnalyzer extends GenericVisitor {
}
protected void endVisit(SwitchStatement node, SwitchData data) {
+ preEndVisit(node, node.getExpression(), data);
+ }
+
+ protected void endVisit(SwitchExpression node, SwitchData data) {
+ preEndVisit(node, node.getExpression(), data);
+ }
+
+ private void preEndVisit(ASTNode node, Expression expression, SwitchData data) {
SwitchFlowInfo switchFlowInfo= createSwitch();
setFlowInfo(node, switchFlowInfo);
- switchFlowInfo.mergeTest(getFlowInfo(node.getExpression()), fFlowContext);
+ switchFlowInfo.mergeTest(getFlowInfo(expression), fFlowContext);
FlowInfo[] cases= data.getInfos();
for (int i= 0; i < cases.length; i++)
switchFlowInfo.mergeCase(cases[i], fFlowContext);
@@ -918,6 +934,13 @@ abstract class FlowAnalyzer extends GenericVisitor {
}
@Override
+ public void endVisit(SwitchExpression node) {
+ if (skipNode(node))
+ return;
+ endVisit(node, createSwitchData(node));
+ }
+
+ @Override
public void endVisit(SynchronizedStatement node) {
if (skipNode(node))
return;
diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/InputFlowAnalyzer.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/InputFlowAnalyzer.java
index 6450a76aee..2fac007162 100644
--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/InputFlowAnalyzer.java
+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/flow/InputFlowAnalyzer.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * Copyright (c) 2000, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -17,6 +17,8 @@
*******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring.code.flow;
+import java.util.List;
+
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.text.IRegion;
@@ -32,6 +34,7 @@ import org.eclipse.jdt.core.dom.ForStatement;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.ReturnStatement;
import org.eclipse.jdt.core.dom.Statement;
+import org.eclipse.jdt.core.dom.SwitchExpression;
import org.eclipse.jdt.core.dom.SwitchStatement;
import org.eclipse.jdt.core.dom.WhileStatement;
@@ -245,20 +248,39 @@ public class InputFlowAnalyzer extends FlowAnalyzer {
public void endVisit(SwitchStatement node) {
if (skipNode(node))
return;
- SwitchData data= createSwitchData(node);
+ SwitchData data= preEndVisit(node, node.statements(), node.getExpression());
+ if (data == null) {
+ return;
+ }
+ super.endVisit(node, data);
+ }
+
+ @Override
+ public void endVisit(SwitchExpression node) {
+ if (skipNode(node))
+ return;
+ SwitchData data= preEndVisit(node, node.statements(), node.getExpression());
+ if (data == null) {
+ return;
+ }
+ super.endVisit(node, data);
+ }
+
+ public SwitchData preEndVisit(ASTNode node, List<Statement> statements, Expression expression) {
+ SwitchData data= createSwitchData(statements);
IRegion[] ranges= data.getRanges();
for (int i= 0; i < ranges.length; i++) {
IRegion range= ranges[i];
if (fSelection.coveredBy(range)) {
GenericSequentialFlowInfo info= createSequential();
setFlowInfo(node, info);
- info.merge(getFlowInfo(node.getExpression()), fFlowContext);
+ info.merge(getFlowInfo(expression), fFlowContext);
info.merge(data.getInfo(i), fFlowContext);
info.removeLabel(null);
- return;
+ return null;
}
}
- super.endVisit(node, data);
+ return data;
}
@Override

Back to the top