4444import org .eclipse .jdt .core .dom .ITypeBinding ;
4545import org .eclipse .jdt .core .dom .IfStatement ;
4646import org .eclipse .jdt .core .dom .InfixExpression ;
47+ import org .eclipse .jdt .core .dom .InfixExpression .Operator ;
4748import org .eclipse .jdt .core .dom .MethodInvocation ;
4849import org .eclipse .jdt .core .dom .Name ;
50+ import org .eclipse .jdt .core .dom .QualifiedName ;
4951import org .eclipse .jdt .core .dom .Statement ;
5052import org .eclipse .jdt .core .dom .SuperFieldAccess ;
5153import org .eclipse .jdt .core .dom .SwitchCase ;
6264import org .eclipse .jdt .internal .corext .refactoring .nls .NLSElement ;
6365import org .eclipse .jdt .internal .corext .refactoring .nls .NLSLine ;
6466import org .eclipse .jdt .internal .corext .refactoring .structure .CompilationUnitRewrite ;
67+ import org .eclipse .jdt .internal .corext .util .JavaModelUtil ;
6568
6669import org .eclipse .jdt .ui .cleanup .ICleanUpFix ;
6770
@@ -432,29 +435,54 @@ public SourceRange computeSourceRange(final ASTNode nodeWithComment) {
432435 });
433436
434437 SwitchStatement switchStatement = ast .newSwitchStatement ();
435- switchStatement .setExpression (ASTNodes .createMoveTarget (rewrite , switchExpression ));
438+ ASTNode newStatement = switchStatement ;
439+
440+ CompilationUnit unit = cuRewrite .getRoot ();
441+ ICompilationUnit cu = (ICompilationUnit )unit .getJavaElement ();
442+ ITypeBinding switchTypeBinding = switchExpression .resolveTypeBinding ();
443+ boolean isEnum = switchTypeBinding != null && switchTypeBinding .isEnum ();
444+
445+ if (cu != null && !JavaModelUtil .is21OrHigher (cu .getJavaProject ())) {
446+ if (switchTypeBinding != null && !switchTypeBinding .isPrimitive ()) {
447+ IfStatement newIfStatement = ast .newIfStatement ();
448+ InfixExpression newInfixExpression = ast .newInfixExpression ();
449+ newInfixExpression .setOperator (Operator .NOT_EQUALS );
450+ newInfixExpression .setLeftOperand ((Expression ) rewrite .createCopyTarget (switchExpression ));
451+ newInfixExpression .setRightOperand (ast .newNullLiteral ());
452+ newIfStatement .setExpression (newInfixExpression );
453+ Block newBlock = ast .newBlock ();
454+ newIfStatement .setThenStatement (newBlock );
455+ newBlock .statements ().add (switchStatement );
456+ newStatement = newIfStatement ;
457+ }
458+ }
459+
460+ switchStatement .setExpression ((Expression ) rewrite .createCopyTarget (switchExpression ));
436461
437462 for (SwitchCaseSection aCase : cases ) {
438- addCaseWithStatements (rewrite , ast , switchStatement , aCase .literalExpressions , aCase .tagList , aCase .statements );
463+ addCaseWithStatements (rewrite , ast , switchStatement , aCase .literalExpressions , aCase .tagList , aCase .statements , isEnum );
439464 }
440465
441466 if (remainingStatement != null ) {
442467 remainingStatement .setProperty (UNTOUCH_COMMENT_PROPERTY , Boolean .TRUE );
443- addCaseWithStatements (rewrite , ast , switchStatement , null , null , ASTNodes .asList (remainingStatement ));
468+ addCaseWithStatements (rewrite , ast , switchStatement , null , null , ASTNodes .asList (remainingStatement ), isEnum );
469+ if (newStatement instanceof IfStatement ifStatement ) {
470+ ifStatement .setElseStatement ((Statement ) rewrite .createCopyTarget (remainingStatement ));
471+ }
444472 } else {
445- addCaseWithStatements (rewrite , ast , switchStatement , null , null , Collections .emptyList ());
473+ addCaseWithStatements (rewrite , ast , switchStatement , null , null , Collections .emptyList (), isEnum );
446474 }
447475
448476 for (int i = 0 ; i < ifStatements .size () - 1 ; i ++) {
449477 ASTNodes .removeButKeepComment (rewrite , ifStatements .get (i ), group );
450478 }
451479
452- ASTNodes .replaceButKeepComment (rewrite , ifStatements .get (ifStatements .size () - 1 ), switchStatement , group );
480+ ASTNodes .replaceButKeepComment (rewrite , ifStatements .get (ifStatements .size () - 1 ), newStatement , group );
453481 }
454482
455483 private void addCaseWithStatements (final ASTRewrite rewrite , final AST ast , final SwitchStatement switchStatement ,
456484 final List <Expression > caseValuesOrNullForDefault , final List <Boolean > tagList ,
457- final List <Statement > innerStatements ) {
485+ final List <Statement > innerStatements , boolean isEnum ) {
458486 List <Statement > switchStatements = switchStatement .statements ();
459487 boolean needBlock = checkForLocalDeclarations (innerStatements );
460488 Boolean hasTag = false ;
@@ -466,6 +494,9 @@ private void addCaseWithStatements(final ASTRewrite rewrite, final AST ast, fina
466494 String spaceBefore = getCoreOption (cu .getJavaProject (), DefaultCodeFormatterConstants .FORMATTER_INSERT_SPACE_BEFORE_COLON_IN_CASE , false ) ? " " : "" ; //$NON-NLS-1$ //$NON-NLS-2$
467495 for (int i = 0 ; i < caseValuesOrNullForDefault .size (); ++i ) {
468496 Expression caseValue = caseValuesOrNullForDefault .get (i );
497+ if (isEnum && caseValue instanceof QualifiedName qName ) {
498+ caseValue = qName .getName ();
499+ }
469500 hasTag = tagList .get (i );
470501 if (hasTag ) {
471502 try {
@@ -487,6 +518,16 @@ private void addCaseWithStatements(final ASTRewrite rewrite, final AST ast, fina
487518 }
488519 }
489520 } else {
521+ CompilationUnit unit = (CompilationUnit )switchExpression .getRoot ();
522+ ICompilationUnit cu = (ICompilationUnit )unit .getJavaElement ();
523+ if (cu != null && JavaModelUtil .is21OrHigher (cu .getJavaProject ())) {
524+ ITypeBinding switchTypeBinding = switchExpression .resolveTypeBinding ();
525+ if (switchTypeBinding != null && !switchTypeBinding .isPrimitive ()) {
526+ SwitchCase newSwitchCase = ast .newSwitchCase ();
527+ newSwitchCase .expressions ().add (ast .newNullLiteral ());
528+ switchStatements .add (newSwitchCase );
529+ }
530+ }
490531 switchStatements .add (ast .newSwitchCase ());
491532 }
492533
0 commit comments