Bug 574860: [17][quick fix][sealed] declare sealed class as super class
of permitted types

Change-Id: If14d652290c90c85bbba5bb1c279cd60f2ed8a4d
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/183194
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Reviewed-by: Noopur Gupta <noopur_gupta@in.ibm.com>
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java
index b8a8f6b..92b9337 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java
@@ -463,6 +463,7 @@
 	public static String LocalCorrectionsSubProcessor_throw_allocated_description;
 	public static String LocalCorrectionsSubProcessor_add_provider_method_description;
 	public static String LocalCorrectionsSubProcessor_declareSealedAsDirectSuperInterface_description;
+	public static String LocalCorrectionsSubProcessor_declareSealedAsDirectSuperClass_description;
 	public static String LocalCorrectionsSubProcessor_declareSubClassAsPermitsSealedClass_description;
 	public static String SuppressWarningsSubProcessor_fix_suppress_token_label;
 	public static String SuppressWarningsSubProcessor_remove_annotation_label;
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties
index 95174df..725322b 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties
@@ -137,6 +137,7 @@
 LocalCorrectionsSubProcessor_replace_with_unqualified_enum_constant=Replace with unqualified enum constant ''{0}''
 LocalCorrectionsSubProcessor_add_provider_method_description=Create ''{0}'' provider method
 LocalCorrectionsSubProcessor_declareSealedAsDirectSuperInterface_description=Declare ''{0}'' as direct super interface of ''{1}''
+LocalCorrectionsSubProcessor_declareSealedAsDirectSuperClass_description=Declare ''{0}'' as direct super class of ''{1}''
 LocalCorrectionsSubProcessor_declareSubClassAsPermitsSealedClass_description=Declare ''{0}'' as permitted subtype of ''{1}''
 TypeMismatchSubProcessor_addcast_description=Add cast to ''{0}''
 TypeMismatchSubProcessor_changecast_description=Change cast to ''{0}''
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 950cb77..7821c95 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
@@ -1400,20 +1400,31 @@
 		}
 
 		CompilationUnitRewrite cuRewrite= new CompilationUnitRewrite(compilationUnit);
-		TypeDeclaration declaration= ASTNodeSearchUtil.getTypeDeclarationNode((IType) permittedTypeElement, cuRewrite.getRoot());
-		if (declaration == null) {
+		TypeDeclaration permittedTypeDeclaration= ASTNodeSearchUtil.getTypeDeclarationNode((IType) permittedTypeElement, cuRewrite.getRoot());
+		if (permittedTypeDeclaration == null) {
 			return;
 		}
 
-		AST ast= declaration.getAST();
+		AST ast= permittedTypeDeclaration.getAST();
 		String sealedTypeName= sealedType.getName().getIdentifier();
 		Type type= ast.newSimpleType(ast.newSimpleName(sealedTypeName));
 
+		boolean isSealedInterface= sealedType.isInterface();
+
 		ASTRewrite astRewrite= cuRewrite.getASTRewrite();
-		astRewrite.getListRewrite(declaration, TypeDeclaration.SUPER_INTERFACE_TYPES_PROPERTY).insertLast(type, null);
+		if (isSealedInterface) {
+			astRewrite.getListRewrite(permittedTypeDeclaration, TypeDeclaration.SUPER_INTERFACE_TYPES_PROPERTY).insertLast(type, null);
+		} else {
+			astRewrite.set(permittedTypeDeclaration, TypeDeclaration.SUPERCLASS_TYPE_PROPERTY, type, null);
+		}
 
 		String permittedTypeName= problem.getProblemArguments()[0];
-		String label= Messages.format(CorrectionMessages.LocalCorrectionsSubProcessor_declareSealedAsDirectSuperInterface_description, new String[] { sealedTypeName, permittedTypeName });
+		String label;
+		if (isSealedInterface) {
+			label= Messages.format(CorrectionMessages.LocalCorrectionsSubProcessor_declareSealedAsDirectSuperInterface_description, new String[] { sealedTypeName, permittedTypeName });
+		} else {
+			label= Messages.format(CorrectionMessages.LocalCorrectionsSubProcessor_declareSealedAsDirectSuperClass_description, new String[] { sealedTypeName, permittedTypeName });
+		}
 		Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_ADD);
 		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, compilationUnit, astRewrite, IProposalRelevance.DECLARE_SEALED_AS_DIRECT_SUPER_TYPE, image);
 
@@ -1422,7 +1433,7 @@
 			importRewrite= StubUtility.createImportRewrite(compilationUnit, true);
 		}
 
-		ImportRewriteContext importRewriteContext= new ContextSensitiveImportRewriteContext(declaration.getRoot(), importRewrite);
+		ImportRewriteContext importRewriteContext= new ContextSensitiveImportRewriteContext(permittedTypeDeclaration.getRoot(), importRewrite);
 		importRewrite.addImport(sealedType.resolveBinding(), astRewrite.getAST(), importRewriteContext);
 		proposal.setImportRewrite(importRewrite);
 
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 6d34e41..bbabf86 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
@@ -131,6 +131,7 @@
 			case IProblem.SealedMissingClassModifier:
 			case IProblem.SealedMissingInterfaceModifier:
 			case IProblem.SealedNotDirectSuperInterface:
+			case IProblem.SealedNotDirectSuperClass:
 			case IProblem.SealedSuperClassDoesNotPermit:
 			case IProblem.SealedSuperInterfaceDoesNotPermit:
 			case IProblem.Task:
@@ -473,6 +474,7 @@
 				ModifierCorrectionSubProcessor.addSealedMissingModifierProposal(context, problem, proposals);
 				break;
 			case IProblem.SealedNotDirectSuperInterface:
+			case IProblem.SealedNotDirectSuperClass:
 				LocalCorrectionsSubProcessor.addSealedAsDirectSuperTypeProposal(context, problem, proposals);
 				break;
 			case IProblem.SealedSuperClassDoesNotPermit: