From 56712ce35f76b81b0b787082ed4cddc59a3757ea Mon Sep 17 00:00:00 2001 From: dessina-devasia <143582034+dessina-devasia@users.noreply.github.com> Date: Wed, 25 Oct 2023 13:57:37 +0530 Subject: [PATCH 1/6] [#534]: Refactored and bring the test cases ready for ResourceMethodMultipleEntityQuickFix --- ...rceMethodMultipleEntityParamsQuickFix.java | 126 +++++++++++++----- src/main/resources/META-INF/plugin.xml | 15 +++ .../PostConstructAnnotationTest.java | 4 +- .../annotations/PreDestroyAnnotationTest.java | 4 +- .../it/jaxrs/ResourceMethodTest.java | 53 ++++++-- 5 files changed, 152 insertions(+), 50 deletions(-) diff --git a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java index e7b2faff5..507f63578 100644 --- a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java +++ b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java @@ -17,15 +17,23 @@ import com.intellij.psi.util.PsiTreeUtil; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.Messages; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.RemoveParamsProposal; +import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.ExtendedCodeAction; +import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.IJavaCodeActionParticipant; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.JavaCodeActionContext; +import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.JavaCodeActionResolveContext; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.corrections.proposal.ChangeCorrectionProposal; import org.eclipse.lsp4j.CodeAction; +import org.eclipse.lsp4j.CodeActionKind; import org.eclipse.lsp4j.Diagnostic; +import org.eclipse.lsp4j.WorkspaceEdit; +import org.eclipse.lsp4mp.commons.CodeActionResolveData; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Quick fix for the ResourceMethodMultipleEntityParams diagnostic in @@ -35,54 +43,108 @@ * @author Bera Sogut * */ -public class ResourceMethodMultipleEntityParamsQuickFix { +public class ResourceMethodMultipleEntityParamsQuickFix implements IJavaCodeActionParticipant { + + private static final Logger LOGGER = Logger.getLogger(ResourceMethodMultipleEntityParamsQuickFix.class.getName()); + + @Override + public String getParticipantId() { + return ResourceMethodMultipleEntityParamsQuickFix.class.getName(); + } public List getCodeActions(JavaCodeActionContext context, Diagnostic diagnostic) { final PsiElement node = context.getCoveredNode(); final PsiMethod parentMethod = PsiTreeUtil.getParentOfType(node, PsiMethod.class); + final List codeActions = new ArrayList<>(); if (parentMethod != null) { - final List codeActions = new ArrayList<>(); - final List entityParamIndexes = new ArrayList<>(); - - final PsiParameterList parameterList = parentMethod.getParameterList(); - if (parameterList != null && parameterList.getParametersCount() > 0) { - final PsiParameter[] parameters = parameterList.getParameters(); - for (int i = 0; i < parameters.length; ++i) { - if (isEntityParam(parameters[i])) { - entityParamIndexes.add(i); - } + return addCodeActions(context, diagnostic, parentMethod, codeActions); + } + return codeActions; + } + + private List addCodeActions(JavaCodeActionContext context, Diagnostic diagnostic, PsiMethod parentMethod, List codeActions) { + final List entityParamIndexes = new ArrayList<>(); + + final PsiParameterList parameterList = parentMethod.getParameterList(); + if (parameterList != null && parameterList.getParametersCount() > 0) { + final PsiParameter[] parameters = parameterList.getParameters(); + for (int i = 0; i < parameters.length; ++i) { + if (isEntityParam(parameters[i])) { + entityParamIndexes.add(i); } } + } + return iterateAndCreateCodeAction(context, diagnostic, codeActions, entityParamIndexes); + } + + private List iterateAndCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions, List entityParamIndexes) { + entityParamIndexes.forEach(entityParamIndex -> { + addCreateCodeAction(context, diagnostic, codeActions, entityParamIndexes, entityParamIndex); + }); + return codeActions; + } - entityParamIndexes.forEach(entityParamIndex -> { - final JavaCodeActionContext targetContext = context.copy(); - final PsiElement targetNode = targetContext.getCoveredNode(); - final PsiClass parentType = PsiTreeUtil.getParentOfType(targetNode, PsiClass.class); - final PsiParameter[] parameters = PsiTreeUtil.getParentOfType(targetNode, PsiMethod.class).getParameterList().getParameters(); + private void addCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions, List entityParamIndexes, Integer entityParamIndex) { + final JavaCodeActionContext targetContext = context.copy(); + final PsiElement targetNode = targetContext.getCoveredNode(); + final PsiParameter[] parameters = PsiTreeUtil.getParentOfType(targetNode, PsiMethod.class).getParameterList().getParameters(); - final String TITLE_MESSAGE = Messages.getMessage("RemoveAllEntityParametersExcept", - parameters[entityParamIndex].getName()); + final String title = getTitle(parameters[entityParamIndex]); - final List entityParams = new ArrayList<>(); - entityParamIndexes.forEach(x -> { - if (!x.equals(entityParamIndex)) { - entityParams.add(parameters[x]); + codeActions.add(createCodeAction(context, diagnostic, title)); + } + + private static String getTitle(PsiParameter parameters) { + return Messages.getMessage("RemoveAllEntityParametersExcept", + parameters.getName()); + } + + @Override + public CodeAction resolveCodeAction(JavaCodeActionResolveContext context) { + final CodeAction toResolve = context.getUnresolved(); + final PsiElement node = context.getCoveredNode(); + final PsiClass parentType = PsiTreeUtil.getParentOfType(node, PsiClass.class); + final PsiMethod parentMethod = PsiTreeUtil.getParentOfType(node, PsiMethod.class); + assert parentMethod != null; + final PsiParameterList parameterList = parentMethod.getParameterList(); + final List entityParams = new ArrayList<>(); + String title = toResolve.getTitle(); + + if (parameterList.getParametersCount() > 0) { + final PsiParameter[] parameters = parameterList.getParameters(); + for (PsiParameter parameter : parameters) { + if (isEntityParam(parameter)) { + if (!title.contains(parameter.getName())) { + entityParams.add(parameter); } - }); + } + } + } - ChangeCorrectionProposal proposal = new RemoveParamsProposal(TITLE_MESSAGE, targetContext.getSource().getCompilationUnit(), - targetContext.getASTRoot(), parentType, 0, entityParams); + ChangeCorrectionProposal proposal = new RemoveParamsProposal(title, context.getSource().getCompilationUnit(), + context.getASTRoot(), parentType, 0, entityParams, false); - // Convert the proposal to LSP4J CodeAction - CodeAction codeAction = targetContext.convertToCodeAction(proposal, diagnostic); - codeAction.setTitle(TITLE_MESSAGE); - codeActions.add(codeAction); - }); - return codeActions; + try { + WorkspaceEdit we = context.convertToWorkspaceEdit(proposal); + toResolve.setEdit(we); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unable to create workspace edit for code action", e); } - return Collections.emptyList(); + return toResolve; + } + + private CodeAction createCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, String label) { + ExtendedCodeAction codeAction = new ExtendedCodeAction(label); + codeAction.setRelevance(0); + codeAction.setDiagnostics(Collections.singletonList(diagnostic)); + codeAction.setKind(CodeActionKind.QuickFix); + codeAction.setData(new CodeActionResolveData(context.getUri(), getParticipantId(), + context.getParams().getRange(), Collections.emptyMap(), + context.getParams().isResourceOperationSupported(), + context.getParams().isCommandConfigurationUpdateSupported())); + return codeAction; } /** diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 5f148488d..947f0fa75 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -276,6 +276,21 @@ targetDiagnostic="jakarta-bean-validation#FixTypeOfElement" implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.beanvalidation.BeanValidationQuickFix"/> + + + + + + diff --git a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java index 62b9efa6d..7b965b632 100644 --- a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java +++ b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java @@ -105,10 +105,8 @@ public void GeneratedAnnotation() throws Exception { JakartaJavaCodeActionParams codeActionParams1 = createCodeActionParams(uri, d2); TextEdit te1 = te(19, 4, 20, 4, ""); - TextEdit te2 = te(20, 29, 20, 40, ""); CodeAction ca1 = ca(uri, "Remove @PostConstruct", d2, te1); - CodeAction ca2 = ca(uri, "Remove all parameters", d2, te2); - assertJavaCodeAction(codeActionParams1, utils, ca1, ca2); + assertJavaCodeAction(codeActionParams1, utils, ca1); } } diff --git a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PreDestroyAnnotationTest.java b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PreDestroyAnnotationTest.java index 8d3d5d6dd..6ded6f5b3 100644 --- a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PreDestroyAnnotationTest.java +++ b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PreDestroyAnnotationTest.java @@ -68,10 +68,8 @@ public void GeneratedAnnotation() throws Exception { if (CHECK_CODE_ACTIONS) { JakartaJavaCodeActionParams codeActionParams = createCodeActionParams(uri, d1); TextEdit te = te(19, 1, 20, 1, ""); - TextEdit te1 = te(20, 29, 20, 40, ""); CodeAction ca = ca(uri, "Remove @PreDestroy", d1, te); - CodeAction ca1 = ca(uri, "Remove all parameters", d1, te1); - assertJavaCodeAction(codeActionParams, utils, ca, ca1); + assertJavaCodeAction(codeActionParams, utils, ca); JakartaJavaCodeActionParams codeActionParams1 = createCodeActionParams(uri, d2); TextEdit te2 = te(25, 1, 26, 1, ""); diff --git a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/jaxrs/ResourceMethodTest.java b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/jaxrs/ResourceMethodTest.java index 54aac6843..0b209165a 100644 --- a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/jaxrs/ResourceMethodTest.java +++ b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/jaxrs/ResourceMethodTest.java @@ -91,18 +91,47 @@ public void multipleEntityParamsMethod() throws Exception { JakartaForJavaAssert.assertJavaDiagnostics(diagnosticsParams, utils, d); - if (CHECK_CODE_ACTIONS) { - // Test for quick-fix code action - JakartaJavaCodeActionParams codeActionParams = JakartaForJavaAssert.createCodeActionParams(uri, d); - - TextEdit te1 = JakartaForJavaAssert.te(21, 112, 21, 130, ""); - CodeAction ca1 = JakartaForJavaAssert.ca(uri, "Remove all entity parameters except entityParam1", d, te1); - - TextEdit te2 = JakartaForJavaAssert.te(21, 47, 21, 68, ""); - CodeAction ca2 = JakartaForJavaAssert.ca(uri, "Remove all entity parameters except entityParam2", d, te2); - - JakartaForJavaAssert.assertJavaCodeAction(codeActionParams, utils, ca1, ca2); - } + //if (CHECK_CODE_ACTIONS) { + // Test for quick-fix code action + JakartaJavaCodeActionParams codeActionParams = JakartaForJavaAssert.createCodeActionParams(uri, d); + String newText1 = "/*******************************************************************************\n" + + "* Copyright (c) 2021 IBM Corporation.\n*\n" + + "* This program and the accompanying materials are made available under the\n" + + "* terms of the Eclipse Public License v. 2.0 which is available at\n" + + "* http://www.eclipse.org/legal/epl-2.0.\n*\n" + + "* SPDX-License-Identifier: EPL-2.0\n*\n" + + "* Contributors:\n* Bera Sogut\n" + + "*******************************************************************************/\n\n" + + "package io.openliberty.sample.jakarta.jax_rs;\n\n" + + "import jakarta.ws.rs.DELETE;\n" + + "import jakarta.ws.rs.FormParam;\n\n" + + "public class MultipleEntityParamsResourceMethod {\n\n " + + "@DELETE\n " + + "public void resourceMethodWithTwoEntityParams(String entityParam1, @FormParam(value = \"\") String nonEntityParam) {\n " + + "\n }\n}\n"; + TextEdit te1 = JakartaForJavaAssert.te(0, 0, 25, 0, newText1); + CodeAction ca1 = JakartaForJavaAssert.ca(uri, "Remove all entity parameters except entityParam1", d, te1); + + String newText2 = "/*******************************************************************************\n" + + "* Copyright (c) 2021 IBM Corporation.\n*\n" + + "* This program and the accompanying materials are made available under the\n" + + "* terms of the Eclipse Public License v. 2.0 which is available at\n" + + "* http://www.eclipse.org/legal/epl-2.0.\n*\n" + + "* SPDX-License-Identifier: EPL-2.0\n*\n* Contributors:\n" + + "* Bera Sogut\n" + + "*******************************************************************************/\n\n" + + "package io.openliberty.sample.jakarta.jax_rs;\n\n" + + "import jakarta.ws.rs.DELETE;\n" + + "import jakarta.ws.rs.FormParam;\n\n" + + "public class MultipleEntityParamsResourceMethod {\n\n " + + "@DELETE\n " + + "public void resourceMethodWithTwoEntityParams(@FormParam(value = \"\") String nonEntityParam, int entityParam2) {" + + "\n \n }\n}\n"; + TextEdit te2 = JakartaForJavaAssert.te(0, 0, 25, 0, newText2); + CodeAction ca2 = JakartaForJavaAssert.ca(uri, "Remove all entity parameters except entityParam2", d, te2); + + JakartaForJavaAssert.assertJavaCodeAction(codeActionParams, utils, ca1, ca2); + //} } } From 4f02bcec27c3d3d29816b8cd68aa48a0b9e594a5 Mon Sep 17 00:00:00 2001 From: dessina-devasia <143582034+dessina-devasia@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:55:55 +0530 Subject: [PATCH 2/6] [#534]: Refactoring and Test cases modification on RemoveMethodParametersQuickFix --- .../proposal/RemoveElementsProposal.java | 2 +- .../proposal/RemoveParamsProposal.java | 6 ++ .../RemoveMethodParametersQuickFix.java | 60 +++++++++++++++---- .../PostConstructAnnotationTest.java | 23 +++++++ .../annotations/PreDestroyAnnotationTest.java | 28 +++++++++ 5 files changed, 108 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/RemoveElementsProposal.java b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/RemoveElementsProposal.java index 76db94bf8..36eff9718 100644 --- a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/RemoveElementsProposal.java +++ b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/RemoveElementsProposal.java @@ -56,7 +56,7 @@ protected RemoveElementsProposal(String label, PsiFile sourceCU, PsiFile invocat @Override public final Change getChange() { elementsToRemove.forEach(PsiElement::delete); - if(isFormatRequired) { + if (isFormatRequired) { PositionUtils.formatDocument(binding); // fix up whitespace } final Document document = invocationNode.getViewProvider().getDocument(); diff --git a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/RemoveParamsProposal.java b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/RemoveParamsProposal.java index fcca92523..b257e30cf 100644 --- a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/RemoveParamsProposal.java +++ b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/RemoveParamsProposal.java @@ -37,4 +37,10 @@ public RemoveParamsProposal(String label, PsiFile sourceCU, PsiFile invocationNo List parametersToRemove) { super(label, sourceCU, invocationNode, binding, relevance, parametersToRemove); } + + public RemoveParamsProposal(String label, PsiFile sourceCU, PsiFile invocationNode, + PsiModifierListOwner binding, int relevance, + List parametersToRemove, boolean isFormatRequired) { + super(label, sourceCU, invocationNode, binding, relevance, parametersToRemove, isFormatRequired); + } } diff --git a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/quickfix/RemoveMethodParametersQuickFix.java b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/quickfix/RemoveMethodParametersQuickFix.java index e80a59738..7d0eb71b1 100644 --- a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/quickfix/RemoveMethodParametersQuickFix.java +++ b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/quickfix/RemoveMethodParametersQuickFix.java @@ -20,39 +20,79 @@ import com.intellij.psi.util.PsiTreeUtil; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.Messages; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.RemoveParamsProposal; +import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.ExtendedCodeAction; +import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.IJavaCodeActionParticipant; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.JavaCodeActionContext; +import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.JavaCodeActionResolveContext; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.corrections.proposal.ChangeCorrectionProposal; import org.eclipse.lsp4j.CodeAction; +import org.eclipse.lsp4j.CodeActionKind; import org.eclipse.lsp4j.Diagnostic; +import org.eclipse.lsp4j.WorkspaceEdit; +import org.eclipse.lsp4mp.commons.CodeActionResolveData; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Quickfix for removing all parameters from a method * * @author Zijian Pei */ -public class RemoveMethodParametersQuickFix { +public class RemoveMethodParametersQuickFix implements IJavaCodeActionParticipant { private static final String NAME = Messages.getMessage("RemoveAllParameters"); + private static final Logger LOGGER = Logger.getLogger(RemoveMethodParametersQuickFix.class.getName()); + + @Override + public String getParticipantId() { + return RemoveMethodParametersQuickFix.class.getName(); + } public List getCodeActions(JavaCodeActionContext context, Diagnostic diagnostic) { + List codeActions = new ArrayList<>(); + final PsiElement node = context.getCoveredNode(); + final PsiMethod parentMethod = PsiTreeUtil.getParentOfType(node, PsiMethod.class); + if (parentMethod != null) { + codeActions.add(createCodeAction(context, diagnostic)); + } + return codeActions; + } + + @Override + public CodeAction resolveCodeAction(JavaCodeActionResolveContext context) { + final CodeAction toResolve = context.getUnresolved(); final PsiElement node = context.getCoveredNode(); final PsiClass parentType = PsiTreeUtil.getParentOfType(node, PsiClass.class); final PsiMethod parentMethod = PsiTreeUtil.getParentOfType(node, PsiMethod.class); - if (parentMethod != null) { - final PsiParameterList parameterList = parentMethod.getParameterList(); - if (parameterList != null && parameterList.getParametersCount() > 0) { - ChangeCorrectionProposal proposal = new RemoveParamsProposal(NAME, context.getSource().getCompilationUnit(), - context.getASTRoot(), parentType, 0, Arrays.asList(parameterList.getParameters())); - CodeAction codeAction = context.convertToCodeAction(proposal, diagnostic); - return Collections.singletonList(codeAction); - } + assert parentMethod != null; + final PsiParameterList parameterList = parentMethod.getParameterList(); + ChangeCorrectionProposal proposal = new RemoveParamsProposal(NAME, context.getSource().getCompilationUnit(), + context.getASTRoot(), parentType, 0, Arrays.asList(parameterList.getParameters()), false); + try { + WorkspaceEdit we = context.convertToWorkspaceEdit(proposal); + toResolve.setEdit(we); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Unable to create workspace edit for code action", e); } - return Collections.emptyList(); + return toResolve; + } + + private CodeAction createCodeAction(JavaCodeActionContext context, Diagnostic diagnostic) { + ExtendedCodeAction codeAction = new ExtendedCodeAction(NAME); + codeAction.setRelevance(0); + codeAction.setDiagnostics(Collections.singletonList(diagnostic)); + codeAction.setKind(CodeActionKind.QuickFix); + codeAction.setData(new CodeActionResolveData(context.getUri(), getParticipantId(), + context.getParams().getRange(), Collections.emptyMap(), + context.getParams().isResourceOperationSupported(), + context.getParams().isCommandConfigurationUpdateSupported())); + return codeAction; } } diff --git a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java index 7b965b632..00758ffcb 100644 --- a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java +++ b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java @@ -109,5 +109,28 @@ public void GeneratedAnnotation() throws Exception { assertJavaCodeAction(codeActionParams1, utils, ca1); } + + JakartaJavaCodeActionParams codeActionParams1 = createCodeActionParams(uri, d2); + String newText = "package io.openliberty.sample.jakarta.annotations;\n\n" + + "import jakarta.annotation.PostConstruct;\n" + + "import jakarta.annotation.Resource;\n\n" + + "@Resource(type = Object.class, name = \"aa\")\n" + + "public class PostConstructAnnotation {\n\n " + + "private Integer studentId;\n\n " + + "private boolean isHappy;\n\n " + + "private boolean isSad;\n\n " + + "@PostConstruct()\n " + + "public Integer getStudentId() {\n " + + "return this.studentId;\n }\n\n " + + "@PostConstruct\n " + + "public void getHappiness() {\n\n }\n\n " + + "@PostConstruct\n " + + "public void throwTantrum() throws Exception {\n " + + "System.out.println(\"I'm sad\");\n " + + "}\n\n " + + "private String emailAddress;\n\n}\n"; + TextEdit te = te(0, 0, 32, 0, newText); + CodeAction ca = ca(uri, "Remove all parameters", d2, te); + assertJavaCodeAction(codeActionParams1, utils, ca); } } diff --git a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PreDestroyAnnotationTest.java b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PreDestroyAnnotationTest.java index 6ded6f5b3..33019889b 100644 --- a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PreDestroyAnnotationTest.java +++ b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PreDestroyAnnotationTest.java @@ -78,6 +78,34 @@ public void GeneratedAnnotation() throws Exception { CodeAction ca3 = ca(uri, "Remove the 'static' modifier from this method", d2, te3); assertJavaCodeAction(codeActionParams1, utils, ca2, ca3); } + + JakartaJavaCodeActionParams codeActionParams = createCodeActionParams(uri, d1); + String newText = "package io.openliberty.sample.jakarta.annotations;\n\n" + + "import jakarta.annotation.PreDestroy;\n" + + "import jakarta.annotation.Resource;\n\n" + + "@Resource(type = Object.class, name = \"aa\") \n" + + "public class PreDestroyAnnotation { \n\n " + + "private Integer studentId;\n \n " + + "private boolean isHappy;\n\n " + + "private boolean isSad;\n \n " + + "@PreDestroy()\n " + + "public Integer getStudentId() {\n " + + "return this.studentId;\n }\n \n " + + "@PreDestroy()\n " + + "public boolean getHappiness() {\n " + + "if (type.equals(\"happy\")) return this.isHappy;\n " + + "return this.isSad;\n }\n \n " + + "@PreDestroy()\n " + + "public static void makeUnhappy() {\n " + + "System.out.println(\"I'm sad\");\n }\n \n " + + "@PreDestroy()\n " + + "public void throwTantrum() throws Exception {\n " + + "System.out.println(\"I'm sad\");\n }\n\n\n " + + "private String emailAddress;\n\n\n}\n\n\n\n"; + + TextEdit te = te(0, 0, 43, 0, newText); + CodeAction ca = ca(uri, "Remove all parameters", d1, te); + assertJavaCodeAction(codeActionParams, utils, ca); } } From 1ab9b2c0bf95de2db8109a5fd9cd1cc7d7eb1c08 Mon Sep 17 00:00:00 2001 From: dessina-devasia <143582034+dessina-devasia@users.noreply.github.com> Date: Mon, 13 Nov 2023 18:26:03 +0530 Subject: [PATCH 3/6] [534]: Optimized quickfixes by using createCodeAction method from JDTUtils --- .../quickfix/RemoveMethodParametersQuickFix.java | 15 ++------------- ...esourceMethodMultipleEntityParamsQuickFix.java | 15 ++------------- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/quickfix/RemoveMethodParametersQuickFix.java b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/quickfix/RemoveMethodParametersQuickFix.java index 7d0eb71b1..77e7cc96f 100644 --- a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/quickfix/RemoveMethodParametersQuickFix.java +++ b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/codeAction/proposal/quickfix/RemoveMethodParametersQuickFix.java @@ -18,6 +18,7 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiParameterList; import com.intellij.psi.util.PsiTreeUtil; +import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.JDTUtils; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.Messages; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.RemoveParamsProposal; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.ExtendedCodeAction; @@ -59,7 +60,7 @@ public List getCodeActions(JavaCodeActionContext context, final PsiElement node = context.getCoveredNode(); final PsiMethod parentMethod = PsiTreeUtil.getParentOfType(node, PsiMethod.class); if (parentMethod != null) { - codeActions.add(createCodeAction(context, diagnostic)); + codeActions.add(JDTUtils.createCodeAction(context, diagnostic, NAME, getParticipantId())); } return codeActions; } @@ -83,16 +84,4 @@ public CodeAction resolveCodeAction(JavaCodeActionResolveContext context) { } return toResolve; } - - private CodeAction createCodeAction(JavaCodeActionContext context, Diagnostic diagnostic) { - ExtendedCodeAction codeAction = new ExtendedCodeAction(NAME); - codeAction.setRelevance(0); - codeAction.setDiagnostics(Collections.singletonList(diagnostic)); - codeAction.setKind(CodeActionKind.QuickFix); - codeAction.setData(new CodeActionResolveData(context.getUri(), getParticipantId(), - context.getParams().getRange(), Collections.emptyMap(), - context.getParams().isResourceOperationSupported(), - context.getParams().isCommandConfigurationUpdateSupported())); - return codeAction; - } } diff --git a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java index 507f63578..c95aab82a 100644 --- a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java +++ b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java @@ -15,6 +15,7 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.JDTUtils; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.Messages; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.RemoveParamsProposal; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.ExtendedCodeAction; @@ -93,7 +94,7 @@ private void addCreateCodeAction(JavaCodeActionContext context, Diagnostic diagn final String title = getTitle(parameters[entityParamIndex]); - codeActions.add(createCodeAction(context, diagnostic, title)); + codeActions.add(JDTUtils.createCodeAction(context, diagnostic, title, getParticipantId())); } private static String getTitle(PsiParameter parameters) { @@ -135,18 +136,6 @@ public CodeAction resolveCodeAction(JavaCodeActionResolveContext context) { return toResolve; } - private CodeAction createCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, String label) { - ExtendedCodeAction codeAction = new ExtendedCodeAction(label); - codeAction.setRelevance(0); - codeAction.setDiagnostics(Collections.singletonList(diagnostic)); - codeAction.setKind(CodeActionKind.QuickFix); - codeAction.setData(new CodeActionResolveData(context.getUri(), getParticipantId(), - context.getParams().getRange(), Collections.emptyMap(), - context.getParams().isResourceOperationSupported(), - context.getParams().isCommandConfigurationUpdateSupported())); - return codeAction; - } - /** * Returns a boolean variable that indicates whether the given parameter is an * entity parameter or not. From 1f18099b69f72ef68772a5f9eda678a7728db2d2 Mon Sep 17 00:00:00 2001 From: dessina-devasia <143582034+dessina-devasia@users.noreply.github.com> Date: Wed, 15 Nov 2023 21:05:59 +0530 Subject: [PATCH 4/6] [#534]: Modifications done after PR review --- ...rceMethodMultipleEntityParamsQuickFix.java | 64 +++++++++++-------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java index c95aab82a..a670f9591 100644 --- a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java +++ b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java @@ -15,7 +15,6 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; -import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.JDTUtils; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.Messages; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.RemoveParamsProposal; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.ExtendedCodeAction; @@ -29,10 +28,7 @@ import org.eclipse.lsp4j.WorkspaceEdit; import org.eclipse.lsp4mp.commons.CodeActionResolveData; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -47,6 +43,8 @@ public class ResourceMethodMultipleEntityParamsQuickFix implements IJavaCodeActionParticipant { private static final Logger LOGGER = Logger.getLogger(ResourceMethodMultipleEntityParamsQuickFix.class.getName()); + private static final String ENTITY_PARAM_INDEX_KEY = "entityParamIndex"; + private final List entityParamIndexes = new ArrayList<>(); @Override public String getParticipantId() { @@ -66,35 +64,32 @@ public List getCodeActions(JavaCodeActionContext context, } private List addCodeActions(JavaCodeActionContext context, Diagnostic diagnostic, PsiMethod parentMethod, List codeActions) { - final List entityParamIndexes = new ArrayList<>(); final PsiParameterList parameterList = parentMethod.getParameterList(); - if (parameterList != null && parameterList.getParametersCount() > 0) { - final PsiParameter[] parameters = parameterList.getParameters(); + final PsiParameter[] parameters = parameterList.getParameters(); + if (parameterList.getParametersCount() > 0) { for (int i = 0; i < parameters.length; ++i) { if (isEntityParam(parameters[i])) { entityParamIndexes.add(i); } } } - return iterateAndCreateCodeAction(context, diagnostic, codeActions, entityParamIndexes); + return iterateAndCreateCodeAction(context, diagnostic, codeActions); } - private List iterateAndCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions, List entityParamIndexes) { + private List iterateAndCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions) { entityParamIndexes.forEach(entityParamIndex -> { - addCreateCodeAction(context, diagnostic, codeActions, entityParamIndexes, entityParamIndex); + addCreateCodeAction(context, diagnostic, codeActions, entityParamIndex); }); return codeActions; } - private void addCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions, List entityParamIndexes, Integer entityParamIndex) { + private void addCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions, Integer entityParamIndex) { final JavaCodeActionContext targetContext = context.copy(); final PsiElement targetNode = targetContext.getCoveredNode(); - final PsiParameter[] parameters = PsiTreeUtil.getParentOfType(targetNode, PsiMethod.class).getParameterList().getParameters(); - + final PsiParameter[] parameters = Objects.requireNonNull(PsiTreeUtil.getParentOfType(targetNode, PsiMethod.class)).getParameterList().getParameters(); final String title = getTitle(parameters[entityParamIndex]); - - codeActions.add(JDTUtils.createCodeAction(context, diagnostic, title, getParticipantId())); + codeActions.add(createCodeAction(context, diagnostic, title, getParticipantId(), entityParamIndex)); } private static String getTitle(PsiParameter parameters) { @@ -108,21 +103,19 @@ public CodeAction resolveCodeAction(JavaCodeActionResolveContext context) { final PsiElement node = context.getCoveredNode(); final PsiClass parentType = PsiTreeUtil.getParentOfType(node, PsiClass.class); final PsiMethod parentMethod = PsiTreeUtil.getParentOfType(node, PsiMethod.class); - assert parentMethod != null; - final PsiParameterList parameterList = parentMethod.getParameterList(); - final List entityParams = new ArrayList<>(); String title = toResolve.getTitle(); + CodeActionResolveData data = (CodeActionResolveData) toResolve.getData(); + Integer currentEntityParamIndex = (Integer) data.getExtendedDataEntry(ENTITY_PARAM_INDEX_KEY); - if (parameterList.getParametersCount() > 0) { - final PsiParameter[] parameters = parameterList.getParameters(); - for (PsiParameter parameter : parameters) { - if (isEntityParam(parameter)) { - if (!title.contains(parameter.getName())) { - entityParams.add(parameter); - } - } + assert parentMethod != null; + final PsiParameter[] parameters = parentMethod.getParameterList().getParameters(); + + final List entityParams = new ArrayList<>(); + entityParamIndexes.forEach(x -> { + if (!x.equals(currentEntityParamIndex)) { + entityParams.add(parameters[x]); } - } + }); ChangeCorrectionProposal proposal = new RemoveParamsProposal(title, context.getSource().getCompilationUnit(), context.getASTRoot(), parentType, 0, entityParams, false); @@ -155,4 +148,19 @@ private boolean isEntityParam(PsiParameter param) { } return true; } + + public CodeAction createCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, + String quickFixMessage, String participantId, Integer entityParamIndex) { + ExtendedCodeAction codeAction = new ExtendedCodeAction(quickFixMessage); + codeAction.setRelevance(0); + codeAction.setDiagnostics(Collections.singletonList(diagnostic)); + codeAction.setKind(CodeActionKind.QuickFix); + Map extendedData = new HashMap<>(); + extendedData.put(ENTITY_PARAM_INDEX_KEY, entityParamIndex); + codeAction.setData(new CodeActionResolveData(context.getUri(), participantId, + context.getParams().getRange(), extendedData, + context.getParams().isResourceOperationSupported(), + context.getParams().isCommandConfigurationUpdateSupported())); + return codeAction; + } } From 08034d47206017ac5ca387cf9e89d2e49fdc7d18 Mon Sep 17 00:00:00 2001 From: dessina-devasia <143582034+dessina-devasia@users.noreply.github.com> Date: Fri, 8 Dec 2023 13:37:40 +0530 Subject: [PATCH 5/6] [#534] Modifications as per PR review --- ...rceMethodMultipleEntityParamsQuickFix.java | 36 +++++++------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java index a670f9591..561231c17 100644 --- a/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java +++ b/src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/jax_rs/ResourceMethodMultipleEntityParamsQuickFix.java @@ -15,15 +15,14 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.JDTUtils; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.Messages; import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.RemoveParamsProposal; -import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.ExtendedCodeAction; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.IJavaCodeActionParticipant; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.JavaCodeActionContext; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.codeaction.JavaCodeActionResolveContext; import io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.corrections.proposal.ChangeCorrectionProposal; import org.eclipse.lsp4j.CodeAction; -import org.eclipse.lsp4j.CodeActionKind; import org.eclipse.lsp4j.Diagnostic; import org.eclipse.lsp4j.WorkspaceEdit; import org.eclipse.lsp4mp.commons.CodeActionResolveData; @@ -44,7 +43,7 @@ public class ResourceMethodMultipleEntityParamsQuickFix implements IJavaCodeActi private static final Logger LOGGER = Logger.getLogger(ResourceMethodMultipleEntityParamsQuickFix.class.getName()); private static final String ENTITY_PARAM_INDEX_KEY = "entityParamIndex"; - private final List entityParamIndexes = new ArrayList<>(); + private static final String ENTITY_PARAM_INDEXES_KEY = "entityParamIndexes"; @Override public String getParticipantId() { @@ -64,7 +63,7 @@ public List getCodeActions(JavaCodeActionContext context, } private List addCodeActions(JavaCodeActionContext context, Diagnostic diagnostic, PsiMethod parentMethod, List codeActions) { - + final List entityParamIndexes = new ArrayList<>(); final PsiParameterList parameterList = parentMethod.getParameterList(); final PsiParameter[] parameters = parameterList.getParameters(); if (parameterList.getParametersCount() > 0) { @@ -74,22 +73,25 @@ private List addCodeActions(JavaCodeActionContext context, Diagnosti } } } - return iterateAndCreateCodeAction(context, diagnostic, codeActions); + return iterateAndCreateCodeAction(context, diagnostic, codeActions, entityParamIndexes); } - private List iterateAndCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions) { + private List iterateAndCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions, List entityParamIndexes) { entityParamIndexes.forEach(entityParamIndex -> { - addCreateCodeAction(context, diagnostic, codeActions, entityParamIndex); + addCreateCodeAction(context, diagnostic, codeActions, entityParamIndex, entityParamIndexes); }); return codeActions; } - private void addCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions, Integer entityParamIndex) { + private void addCreateCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, List codeActions, Integer entityParamIndex, List entityParamIndexes) { final JavaCodeActionContext targetContext = context.copy(); final PsiElement targetNode = targetContext.getCoveredNode(); final PsiParameter[] parameters = Objects.requireNonNull(PsiTreeUtil.getParentOfType(targetNode, PsiMethod.class)).getParameterList().getParameters(); final String title = getTitle(parameters[entityParamIndex]); - codeActions.add(createCodeAction(context, diagnostic, title, getParticipantId(), entityParamIndex)); + Map extendedData = new HashMap<>(); + extendedData.put(ENTITY_PARAM_INDEX_KEY, entityParamIndex); + extendedData.put(ENTITY_PARAM_INDEXES_KEY, entityParamIndexes); + codeActions.add(JDTUtils.createCodeAction(context, diagnostic, title, getParticipantId(), extendedData)); } private static String getTitle(PsiParameter parameters) { @@ -106,6 +108,7 @@ public CodeAction resolveCodeAction(JavaCodeActionResolveContext context) { String title = toResolve.getTitle(); CodeActionResolveData data = (CodeActionResolveData) toResolve.getData(); Integer currentEntityParamIndex = (Integer) data.getExtendedDataEntry(ENTITY_PARAM_INDEX_KEY); + List entityParamIndexes = (List) data.getExtendedDataEntry(ENTITY_PARAM_INDEXES_KEY); assert parentMethod != null; final PsiParameter[] parameters = parentMethod.getParameterList().getParameters(); @@ -148,19 +151,4 @@ private boolean isEntityParam(PsiParameter param) { } return true; } - - public CodeAction createCodeAction(JavaCodeActionContext context, Diagnostic diagnostic, - String quickFixMessage, String participantId, Integer entityParamIndex) { - ExtendedCodeAction codeAction = new ExtendedCodeAction(quickFixMessage); - codeAction.setRelevance(0); - codeAction.setDiagnostics(Collections.singletonList(diagnostic)); - codeAction.setKind(CodeActionKind.QuickFix); - Map extendedData = new HashMap<>(); - extendedData.put(ENTITY_PARAM_INDEX_KEY, entityParamIndex); - codeAction.setData(new CodeActionResolveData(context.getUri(), participantId, - context.getParams().getRange(), extendedData, - context.getParams().isResourceOperationSupported(), - context.getParams().isCommandConfigurationUpdateSupported())); - return codeAction; - } } From d22ea05457284c89e135e130ee3798016aae39cd Mon Sep 17 00:00:00 2001 From: dessina-devasia <143582034+dessina-devasia@users.noreply.github.com> Date: Wed, 20 Dec 2023 12:58:43 +0530 Subject: [PATCH 6/6] [#534]: Updated test case to resolve failure in PostConstructAnnotatationTest --- .../it/annotations/PostConstructAnnotationTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java index 00758ffcb..7b54ff8fc 100644 --- a/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java +++ b/src/test/java/io/openliberty/tools/intellij/lsp4jakarta/it/annotations/PostConstructAnnotationTest.java @@ -126,10 +126,9 @@ public void GeneratedAnnotation() throws Exception { "public void getHappiness() {\n\n }\n\n " + "@PostConstruct\n " + "public void throwTantrum() throws Exception {\n " + - "System.out.println(\"I'm sad\");\n " + - "}\n\n " + - "private String emailAddress;\n\n}\n"; - TextEdit te = te(0, 0, 32, 0, newText); + "System.out.println(\"I'm sad\");\n }\n\n " + + "private String emailAddress;\n\n}"; + TextEdit te = te(0, 0, 31, 1, newText); CodeAction ca = ca(uri, "Remove all parameters", d2, te); assertJavaCodeAction(codeActionParams1, utils, ca); }