diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/CorrectionMessages.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/CorrectionMessages.java index 32ed2ac945..05e3c9b584 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/CorrectionMessages.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/CorrectionMessages.java @@ -249,16 +249,23 @@ private CorrectionMessages() { public static String NoCorrectionProposal_description; public static String MarkerResolutionProposal_additionaldesc; public static String NewCUCompletionUsingWizardProposal_createclass_description; + public static String NewCUCompletionUsingWizardProposal_createrecord_description; public static String NewCUCompletionUsingWizardProposal_createenum_description; public static String NewCUCompletionUsingWizardProposal_createclass_inpackage_description; + public static String NewCUCompletionUsingWizardProposal_createrecord_inpackage_description; public static String NewCUCompletionUsingWizardProposal_createinnerclass_description; + public static String NewCUCompletionUsingWizardProposal_createnewinnerclass_description; + public static String NewCUCompletionUsingWizardProposal_createinnerrecord_description; + public static String NewCUCompletionUsingWizardProposal_createnewinnerrecord_description; public static String NewCUCompletionUsingWizardProposal_createinnerenum_description; public static String NewCUCompletionUsingWizardProposal_createannotation_description; public static String NewCUCompletionUsingWizardProposal_createinnerclass_intype_description; + public static String NewCUCompletionUsingWizardProposal_createinnerrecord_intype_description; public static String NewCUCompletionUsingWizardProposal_createinnerenum_intype_description; public static String NewCUCompletionUsingWizardProposal_createinterface_description; public static String NewCUCompletionUsingWizardProposal_createinterface_inpackage_description; public static String NewCUCompletionUsingWizardProposal_createinnerinterface_description; + public static String NewCUCompletionUsingWizardProposal_createnewinnerinterface_description; public static String NewCUCompletionUsingWizardProposal_createenum_inpackage_description; public static String NewCUCompletionUsingWizardProposal_createinnerannotation_description; public static String NewCUCompletionUsingWizardProposal_createinnerinterface_intype_description; @@ -272,6 +279,7 @@ private CorrectionMessages() { public static String NewCUCompletionUsingWizardProposal_createnewinterface_inpackage_description; public static String NewCUCompletionUsingWizardProposal_createnewannotation_inpackage_description; public static String NewCUCompletionUsingWizardProposal_createnewenum_inpackage_description; + public static String NewCUCompletionUsingWizardProposal_createnewrecord_inpackage_description; public static String ConfigureProblemSeveritySubProcessor_info; public static String ConfigureProblemSeveritySubProcessor_name; public static String ConstructorFromSuperclassProposal_description; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/CorrectionMessages.properties b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/CorrectionMessages.properties index 60840f430d..e8afcafcf1 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/CorrectionMessages.properties +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/CorrectionMessages.properties @@ -277,16 +277,23 @@ MarkerResolutionProposal_additionaldesc=Problem description: {0} NewCUCompletionUsingWizardProposal_createclass_description=Create class ''{0}'' NewCUCompletionUsingWizardProposal_createenum_description=Create enum ''{0}'' +NewCUCompletionUsingWizardProposal_createrecord_description=Create record ''{0}'' NewCUCompletionUsingWizardProposal_createclass_inpackage_description=Create class ''{0}'' in package ''{1}'' +NewCUCompletionUsingWizardProposal_createrecord_inpackage_description=Create record ''{0}'' in package ''{1}'' NewCUCompletionUsingWizardProposal_createinnerclass_description=Create member class ''{0}'' +NewCUCompletionUsingWizardProposal_createnewinnerclass_description=Create new member class +NewCUCompletionUsingWizardProposal_createinnerrecord_description=Create member record ''{0}'' +NewCUCompletionUsingWizardProposal_createnewinnerrecord_description=Create new member record NewCUCompletionUsingWizardProposal_createinnerenum_description=Create member enum ''{0}'' NewCUCompletionUsingWizardProposal_createannotation_description=Create annotation ''{0}'' NewCUCompletionUsingWizardProposal_createinnerclass_intype_description=Create class ''{0}'' in type ''{1}'' NewCUCompletionUsingWizardProposal_createinnerenum_intype_description=Create enum ''{0}'' in type ''{1}'' +NewCUCompletionUsingWizardProposal_createinnerrecord_intype_description=Create record ''{0}'' in type ''{1}'' NewCUCompletionUsingWizardProposal_createinterface_description=Create interface ''{0}'' NewCUCompletionUsingWizardProposal_createinterface_inpackage_description=Create interface ''{0}'' in package ''{1}'' NewCUCompletionUsingWizardProposal_createinnerinterface_description=Create member interface ''{0}'' +NewCUCompletionUsingWizardProposal_createnewinnerinterface_description=Create new member interface NewCUCompletionUsingWizardProposal_createenum_inpackage_description=Create enum ''{0}'' in package ''{1}'' NewCUCompletionUsingWizardProposal_createinnerannotation_description=Create member annotation ''{0}'' NewCUCompletionUsingWizardProposal_createinnerinterface_intype_description=Create interface ''{0}'' in type ''{1}'' @@ -296,6 +303,7 @@ NewCUCompletionUsingWizardProposal_createnewclass_inpackage_description=Create n NewCUCompletionUsingWizardProposal_createnewinterface_inpackage_description=Create new interface in package ''{0}'' NewCUCompletionUsingWizardProposal_createnewannotation_inpackage_description=Create new annotation in package ''{0}'' NewCUCompletionUsingWizardProposal_createnewenum_inpackage_description=Create new enum in package ''{0}'' +NewCUCompletionUsingWizardProposal_createnewrecord_inpackage_description=Create new record in package ''{0}'' NewCUCompletionUsingWizardProposal_createclass_info=Opens the new class wizard to create the type. NewCUCompletionUsingWizardProposal_createenum_info=Opens the new enum wizard to create the type. diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewCUProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewCUProposal.java index 040a9bc955..d8962070b6 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewCUProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewCUProposal.java @@ -73,6 +73,7 @@ public class NewCUProposal extends ChangeCorrectionProposalCore { public static final int K_INTERFACE = 2; public static final int K_ENUM = 3; public static final int K_ANNOTATION = 4; + public static final int K_RECORD= 5; private Name fNode; private ICompilationUnit fCompilationUnit; @@ -125,43 +126,51 @@ private void setDisplayName() { boolean isInnerType = fTypeContainer instanceof IType; switch (fTypeKind) { case K_CLASS: - if (fNode != null) { - if (isInnerType) { - if (containerName.length() == 0) { - setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerclass_description, typeLabel)); - } else { - setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerclass_intype_description, new String[] { typeLabel, containerLabel })); - } + if (fNode != null) { + if (isInnerType) { + if (containerName.length() == 0) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerclass_description, typeLabel)); } else { - if (containerName.length() == 0) { - setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createclass_description, typeLabel)); - } else { - setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createclass_inpackage_description, new String[] { typeLabel, containerLabel })); - } + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerclass_intype_description, new String[] { typeLabel, containerLabel })); } + } else { + if (containerName.length() == 0) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createclass_description, typeLabel)); + } else { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createclass_inpackage_description, new String[] { typeLabel, containerLabel })); + } + } + } else { + if (isInnerType) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createnewinnerclass_description, containerLabel)); } else { setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createnewclass_inpackage_description, containerLabel)); } - break; + } + break; case K_INTERFACE: - if (fNode != null) { - if (isInnerType) { - if (containerName.length() == 0) { - setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerinterface_description, typeLabel)); - } else { - setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerinterface_intype_description, new String[] { typeLabel, containerLabel })); - } + if (fNode != null) { + if (isInnerType) { + if (containerName.length() == 0) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerinterface_description, typeLabel)); } else { - if (containerName.length() == 0) { - setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinterface_description, typeLabel)); - } else { - setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinterface_inpackage_description, new String[] { typeLabel, containerLabel })); - } + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerinterface_intype_description, new String[] { typeLabel, containerLabel })); + } + } else { + if (containerName.length() == 0) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinterface_description, typeLabel)); + } else { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinterface_inpackage_description, new String[] { typeLabel, containerLabel })); } + } + } else { + if (isInnerType) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createnewinnerinterface_description, containerLabel)); } else { setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createnewinterface_inpackage_description, containerLabel)); } - break; + } + break; case K_ENUM: if (fNode != null) { if (isInnerType) { @@ -200,6 +209,29 @@ private void setDisplayName() { setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createnewannotation_inpackage_description, containerLabel)); } break; + case K_RECORD: + if (fNode != null) { + if (isInnerType) { + if (containerName.length() == 0) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerrecord_description, typeLabel)); + } else { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createinnerrecord_intype_description, new String[] { typeLabel, containerLabel })); + } + } else { + if (containerName.length() == 0) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createrecord_description, typeLabel)); + } else { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createrecord_inpackage_description, new String[] { typeLabel, containerLabel })); + } + } + } else { + if (isInnerType) { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createnewinnerrecord_description, containerLabel)); + } else { + setDisplayName(Messages.format(CorrectionMessages.NewCUCompletionUsingWizardProposal_createnewrecord_inpackage_description, containerLabel)); + } + } + break; default: throw new IllegalArgumentException("Unknown type kind"); //$NON-NLS-1$ } @@ -305,6 +337,9 @@ private TextEdit constructEnclosingTypeEdit(ICompilationUnit icu) throws CoreExc case K_ANNOTATION: newDeclaration = ast.newAnnotationTypeDeclaration(); break; + case K_RECORD: + newDeclaration = ast.newRecordDeclaration(); + break; default: return null; } @@ -428,6 +463,10 @@ private String constructTypeStub(ICompilationUnit parentCU, String name, int mod type = "@interface "; //$NON-NLS-1$ templateID = CodeGeneration.ANNOTATION_BODY_TEMPLATE_ID; break; + case K_RECORD: + type = "record "; //$NON-NLS-1$ + templateID = CodeGeneration.RECORD_BODY_TEMPLATE_ID; + break; } buf.append(type); buf.append(name); @@ -435,6 +474,8 @@ private String constructTypeStub(ICompilationUnit parentCU, String name, int mod buf.append(' '); buf.append(superType); buf.append(cuType.getElementName()); + } else if (fTypeKind == K_RECORD) { + buf.append("() "); } buf.append(" {").append(lineDelimiter); //$NON-NLS-1$ diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/UnresolvedElementsSubProcessor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/UnresolvedElementsSubProcessor.java index 345250130c..b3f50bb539 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/UnresolvedElementsSubProcessor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/UnresolvedElementsSubProcessor.java @@ -105,6 +105,10 @@ protected void addNewTypeProposalsInteractiveInnerLoop(ICompilationUnit cu, Name if ((kind & TypeKinds.CLASSES) != 0) { NewCUProposal proposal = new NewCUProposal(cu, node, NewCUProposal.K_CLASS, enclosing, rel + 3); proposals.add(CodeActionHandler.wrap(proposal, CodeActionKind.QuickFix)); + if (canUseRecord(cu.getJavaProject(), refNode)) { + proposal = new NewCUProposal(cu, node, NewCUProposal.K_RECORD, enclosing, rel + 3); + proposals.add(CodeActionHandler.wrap(proposal, CodeActionKind.QuickFix)); + } } if ((kind & TypeKinds.INTERFACES) != 0) { NewCUProposal proposal = new NewCUProposal(cu, node, NewCUProposal.K_INTERFACE, enclosing, rel + 3);