diff options
| author | Kalyan Prasad Tatavarthi | 2019-03-14 05:36:04 +0000 |
|---|---|---|
| committer | Kalyan Prasad Tatavarthi | 2019-03-14 05:36:04 +0000 |
| commit | fe49b5fe962e9d503d5c27aed3845fe49b6fb6d8 (patch) | |
| tree | db38117d9bf0ebcc10cfe30a0d417ebaefdc5f15 | |
| parent | 4425ba68ac372ecba1609ab828ee1cc2a1213dfd (diff) | |
| download | eclipse.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>
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 |
