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: