diff options
| author | Noopur Gupta | 2019-05-20 15:26:56 +0000 |
|---|---|---|
| committer | Noopur Gupta | 2019-05-21 09:22:36 +0000 |
| commit | a07e7d98b59b701173951c3a500a6bd2e5578de0 (patch) | |
| tree | c5127574b8e2bad2531c8cf55316f6ce774510bb | |
| parent | d30e4b27fddd3a9a8d3ba1434d4217e648fad060 (diff) | |
| download | eclipse.jdt.ui-a07e7d98b59b701173951c3a500a6bd2e5578de0.tar.gz eclipse.jdt.ui-a07e7d98b59b701173951c3a500a6bd2e5578de0.tar.xz eclipse.jdt.ui-a07e7d98b59b701173951c3a500a6bd2e5578de0.zip | |
Bug 545340: [12][quick fix][switch expression] 'Add missing case
statements'
Change-Id: Id87e09bd1d4d92b18769a05c6f940485d354f7cb
2 files changed, 54 insertions, 20 deletions
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java index c9bbc389c0..3cbfa4d007 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java @@ -1718,19 +1718,34 @@ public class LocalCorrectionsSubProcessor { } ASTNode selectedNode= problem.getCoveringNode(context.getASTRoot()); - if (selectedNode instanceof Expression && selectedNode.getLocationInParent() == SwitchStatement.EXPRESSION_PROPERTY) { - SwitchStatement statement= (SwitchStatement) selectedNode.getParent(); - ITypeBinding binding= statement.getExpression().resolveTypeBinding(); + if (selectedNode instanceof Expression) { + StructuralPropertyDescriptor locationInParent= selectedNode.getLocationInParent(); + ASTNode parent= selectedNode.getParent(); + ITypeBinding binding; + List<Statement> statements; + + if (locationInParent == SwitchStatement.EXPRESSION_PROPERTY) { + SwitchStatement statement= (SwitchStatement) parent; + binding= statement.getExpression().resolveTypeBinding(); + statements= statement.statements(); + } else if (locationInParent == SwitchExpression.EXPRESSION_PROPERTY) { + SwitchExpression switchExpression= (SwitchExpression) parent; + binding= switchExpression.getExpression().resolveTypeBinding(); + statements= switchExpression.statements(); + } else { + return; + } + if (binding == null || !binding.isEnum()) { return; } ArrayList<String> missingEnumCases= new ArrayList<>(); - boolean hasDefault= evaluateMissingSwitchCases(binding, statement.statements(), missingEnumCases); + boolean hasDefault= evaluateMissingSwitchCases(binding, statements, missingEnumCases); if (missingEnumCases.size() == 0 && hasDefault) return; - createMissingCaseProposals(context, statement, missingEnumCases, proposals); + createMissingCaseProposals(context, parent, missingEnumCases, proposals); } } @@ -1772,8 +1787,20 @@ public class LocalCorrectionsSubProcessor { return hasDefault; } - public static void createMissingCaseProposals(IInvocationContext context, SwitchStatement switchStatement, ArrayList<String> enumConstNames, Collection<ICommandAccess> proposals) { - List<Statement> statements= switchStatement.statements(); + public static void createMissingCaseProposals(IInvocationContext context, ASTNode parent, ArrayList<String> enumConstNames, Collection<ICommandAccess> proposals) { + List<Statement> statements; + Expression expression; + if (parent instanceof SwitchStatement) { + SwitchStatement switchStatement= (SwitchStatement) parent; + statements= switchStatement.statements(); + expression= switchStatement.getExpression(); + } else if (parent instanceof SwitchExpression) { + SwitchExpression switchExpression= (SwitchExpression) parent; + statements= switchExpression.statements(); + expression= switchExpression.getExpression(); + } else { + return; + } int defaultIndex= statements.size(); for (int i= 0; i < statements.size(); i++) { Statement curr= statements.get(i); @@ -1792,12 +1819,17 @@ public class LocalCorrectionsSubProcessor { } boolean hasDefault= defaultIndex < statements.size(); - AST ast= switchStatement.getAST(); + AST ast= parent.getAST(); Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); if (enumConstNames.size() > 0) { ASTRewrite astRewrite= ASTRewrite.create(ast); - ListRewrite listRewrite= astRewrite.getListRewrite(switchStatement, SwitchStatement.STATEMENTS_PROPERTY); + ListRewrite listRewrite; + if (parent instanceof SwitchStatement) { + listRewrite= astRewrite.getListRewrite(parent, SwitchStatement.STATEMENTS_PROPERTY); + } else { + listRewrite= astRewrite.getListRewrite(parent, SwitchExpression.STATEMENTS_PROPERTY); + } String label= CorrectionMessages.LocalCorrectionsSubProcessor_add_missing_cases_description; LinkedCorrectionProposal proposal= new LinkedCorrectionProposal(label, context.getCompilationUnit(), astRewrite, IProposalRelevance.ADD_MISSING_CASE_STATEMENTS, image); @@ -1815,13 +1847,13 @@ public class LocalCorrectionsSubProcessor { defaultIndex++; if (!hasDefault) { if (ast.apiLevel() >= AST.JLS12) { - if (switchStatement.statements().size() > 0) { - Statement firstStatement= (Statement) switchStatement.statements().get(0); + if (statements.size() > 0) { + Statement firstStatement= statements.get(0); SwitchCase switchCase= (SwitchCase) firstStatement; boolean isArrow= switchCase.isSwitchLabeledRule(); - if (isArrow) { - newSwitchCase.setSwitchLabeledRule(isArrow); - ThrowStatement newThrowStatement= getThrowForUnsupportedCase(switchStatement.getExpression(), ast, astRewrite); + newSwitchCase.setSwitchLabeledRule(isArrow); + if (isArrow || parent instanceof SwitchExpression) { + ThrowStatement newThrowStatement= getThrowForUnsupportedCase(expression, ast, astRewrite); listRewrite.insertLast(newThrowStatement, null); proposal.addLinkedPosition(astRewrite.track(newThrowStatement), true, enumConstName); } else { @@ -1843,13 +1875,13 @@ public class LocalCorrectionsSubProcessor { defaultIndex++; if (ast.apiLevel() >= AST.JLS12) { - if (switchStatement.statements().size() > 0) { - Statement firstStatement= (Statement) switchStatement.statements().get(0); + if (statements.size() > 0) { + Statement firstStatement= statements.get(0); SwitchCase switchCase= (SwitchCase) firstStatement; boolean isArrow= switchCase.isSwitchLabeledRule(); - if (isArrow) { - newSwitchCase.setSwitchLabeledRule(isArrow); - ThrowStatement newThrowStatement= getThrowForUnexpectedDefault(switchStatement.getExpression(), ast, astRewrite); + newSwitchCase.setSwitchLabeledRule(isArrow); + if (isArrow || parent instanceof SwitchExpression) { + ThrowStatement newThrowStatement= getThrowForUnexpectedDefault(expression, ast, astRewrite); listRewrite.insertLast(newThrowStatement, null); proposal.addLinkedPosition(astRewrite.track(newThrowStatement), true, "defaultCase"); //$NON-NLS-1$ } else { @@ -1866,7 +1898,7 @@ public class LocalCorrectionsSubProcessor { proposals.add(proposal); } if (!hasDefault) { - createMissingDefaultProposal(context, switchStatement, image, proposals); + createMissingDefaultProposal(context, parent, image, proposals); } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java index efae825cc4..3ec044cf0b 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java @@ -302,6 +302,7 @@ public class QuickFixProcessor implements IQuickFixProcessor { case IProblem.ServiceImplDefaultConstructorNotPublic: case IProblem.PreviewFeatureDisabled: case IProblem.PreviewFeatureNotSupported: + case IProblem.SwitchExpressionMissingEnumConstantCase: case IProblem.SwitchExpressionMissingDefaultCase: return true; default: @@ -727,6 +728,7 @@ public class QuickFixProcessor implements IQuickFixProcessor { break; case IProblem.MissingEnumConstantCase: case IProblem.MissingEnumDefaultCase: + case IProblem.SwitchExpressionMissingEnumConstantCase: LocalCorrectionsSubProcessor.getMissingEnumConstantCaseProposals(context, problem, proposals); break; case IProblem.MissingDefaultCase: |
