Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Enable Quick Fixes which extend InsertAnnotationMissingQuickFix
> ManagedBeanQuickFix
> ManagedBeanConstructorQuickFix
  • Loading branch information
anusreelakshmi934 committed Dec 13, 2023
1 parent 563529b commit 459e9d0
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,14 @@
package io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi;

import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.quickfix.InsertAnnotationMissingQuickFix;
import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.servlet.HttpServletQuickFix;

public class ManagedBeanConstructorQuickFix extends InsertAnnotationMissingQuickFix {
public ManagedBeanConstructorQuickFix() {
super("jakarta.inject.Inject");
}
@Override
public String getParticipantId() {
return ManagedBeanConstructorQuickFix.class.getName();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,29 @@

package io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi;

import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.PsiModifierListOwner;
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.quickfix.InsertAnnotationMissingQuickFix;
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 io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.corrections.proposal.ReplaceAnnotationProposal;
import org.eclipse.lsp4j.CodeAction;
import org.eclipse.lsp4j.Diagnostic;
import org.eclipse.lsp4j.WorkspaceEdit;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import static io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ManagedBeanConstants.SCOPE_FQ_NAMES;

public class ManagedBeanQuickFix extends InsertAnnotationMissingQuickFix {
private static final Logger LOGGER = Logger.getLogger(ManagedBeanQuickFix.class.getName());
private static final String ADD_ANNOTATION = "jakarta.enterprise.context.Dependent";
public ManagedBeanQuickFix() {
super("jakarta.enterprise.context.Dependent");
}
Expand All @@ -48,29 +54,38 @@ protected void insertAnnotations(Diagnostic diagnostic, JavaCodeActionContext co
}
}

private static void insertAndReplaceAnnotation(Diagnostic diagnostic, JavaCodeActionContext context,
List<CodeAction> codeActions, String annotation) {
// Diagnostic is reported on the variable declaration, however the
// annotations that need to be replaced are on the type declaration (class
// definition) containing the variable declaration. We retrieve the type
// declaration container here.
PsiElement parentNode = context.getCoveredNode();
PsiClass classBinding = PsiTreeUtil.getParentOfType(parentNode, PsiClass.class);

// Insert the annotation and the proper import by using JDT Core Manipulation
// API
private void insertAndReplaceAnnotation(Diagnostic diagnostic, JavaCodeActionContext context,
List<CodeAction> codeActions, String annotation) {
String name = getLabel(annotation);
codeActions.add(JDTUtils.createCodeAction(context, diagnostic, name, getParticipantId()));
}

@Override
public CodeAction resolveCodeAction(JavaCodeActionResolveContext context) {
final CodeAction toResolve = context.getUnresolved();
String name = getLabel(ADD_ANNOTATION);
PsiElement node = context.getCoveringNode();
PsiModifierListOwner parentType = getBinding(node);
ChangeCorrectionProposal proposal = new ReplaceAnnotationProposal(name, context.getCompilationUnit(),
context.getASTRoot(), classBinding, 0, annotation, context.getCompilationUnit(), REMOVE_ANNOTATION_NAMES);
// Convert the proposal to LSP4J CodeAction
CodeAction codeAction = context.convertToCodeAction(proposal, diagnostic);
if (codeAction != null) {
codeActions.add(codeAction);
context.getASTRoot(), parentType, 0, ADD_ANNOTATION, context.getSource().getCompilationUnit(),
REMOVE_ANNOTATION_NAMES);

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 toResolve;
}

private static String getLabel(String annotation) {
String annotationName = annotation.substring(annotation.lastIndexOf('.') + 1, annotation.length());
return Messages.getMessage("ReplaceCurrentScope", "@" + annotationName);
}

@Override
public String getParticipantId() {
return ManagedBeanQuickFix.class.getName();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,21 @@

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.ExtendClassProposal;
import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.servlet.ServletConstants;
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 io.openliberty.tools.intellij.lsp4mp4ij.psi.core.java.corrections.proposal.InsertAnnotationProposal;
import org.eclipse.lsp4j.CodeAction;
import org.eclipse.lsp4j.Diagnostic;
import org.eclipse.lsp4j.WorkspaceEdit;

import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
Expand All @@ -33,7 +40,7 @@
* @author Angelo ZERR
*
*/
public class InsertAnnotationMissingQuickFix {
public abstract class InsertAnnotationMissingQuickFix implements IJavaCodeActionParticipant {
private static final Logger LOGGER = Logger.getLogger(InsertAnnotationMissingQuickFix.class.getName());
private static final String ANNOTATION_KEY = "annotation";

Expand Down Expand Up @@ -73,6 +80,25 @@ public List<? extends CodeAction> getCodeActions(JavaCodeActionContext context,
return codeActions;
}

@Override
public CodeAction resolveCodeAction(JavaCodeActionResolveContext context) {
final CodeAction toResolve = context.getUnresolved();
String name = getLabel(annotations);
PsiElement node = context.getCoveringNode();
PsiModifierListOwner parentType = getBinding(node);

ChangeCorrectionProposal proposal = new InsertAnnotationProposal(name, context.getCompilationUnit(),
context.getASTRoot(), parentType, 0, context.getSource().getCompilationUnit(),
annotations);
try {
WorkspaceEdit we = context.convertToWorkspaceEdit(proposal);
toResolve.setEdit(we);
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Unable to create workspace edit for code action to extend the HttpServlet class.", e);
}
return toResolve;
}

protected static PsiModifierListOwner getBinding(PsiElement node) {
PsiModifierListOwner binding = PsiTreeUtil.getParentOfType(node, PsiVariable.class);
if (binding != null) {
Expand Down Expand Up @@ -103,17 +129,8 @@ protected void insertAnnotations(Diagnostic diagnostic, JavaCodeActionContext co

protected void insertAnnotation(Diagnostic diagnostic, JavaCodeActionContext context,
List<CodeAction> codeActions, String... annotations) {
String name = getLabel(annotations);
PsiElement node = context.getCoveringNode();
PsiModifierListOwner parentType = getBinding(node);

ChangeCorrectionProposal proposal = new InsertAnnotationProposal(name, context.getCompilationUnit(),
context.getASTRoot(), parentType, 0, context.getSource().getCompilationUnit(),
annotations);
CodeAction codeAction = context.convertToCodeAction(proposal, diagnostic);
if (codeAction != null) {
codeActions.add(codeAction);
}
String label = getLabel(annotations);
codeActions.add(JDTUtils.createCodeAction(context, diagnostic, label, getParticipantId()));
}

private static String getLabel(String[] annotations) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.ModifyAnnotationProposal;
import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.quickfix.InsertAnnotationMissingQuickFix;
Expand Down Expand Up @@ -55,7 +56,7 @@ protected void insertAnnotations(Diagnostic diagnostic, JavaCodeActionContext co
insertAndReplaceAnnotation(diagnostic, context, codeActions, annotations);
}

private static void insertAndReplaceAnnotation(Diagnostic diagnostic, JavaCodeActionContext context,
private void insertAndReplaceAnnotation(Diagnostic diagnostic, JavaCodeActionContext context,
List<CodeAction> codeActions, String... annotations) {
ArrayList<String> attributes = new ArrayList<>();
attributes.add("name");
Expand All @@ -69,15 +70,9 @@ private static void insertAndReplaceAnnotation(Diagnostic diagnostic, JavaCodeAc
for (PsiAnnotation annotationNode : annotationNodes) {
ChangeCorrectionProposal proposal = new ModifyAnnotationProposal(name, context.getSource().getCompilationUnit(),
context.getASTRoot(), binding, annotationNode, 0, attributes, annotations);

// Convert the proposal to LSP4J CodeAction
// We need to fix all the annotations so all the changes are combined in this one context.
// Therefore, we only need to save the last code action.
codeAction = context.convertToCodeAction(proposal, diagnostic);
}
if (codeAction != null) {
codeActions.add(codeAction);
}
codeActions.add(JDTUtils.createCodeAction(context, diagnostic, name, getParticipantId()));

}

private static List<PsiAnnotation> getAnnotations(PsiElement e, String... names) {
Expand All @@ -94,4 +89,9 @@ private static List<PsiAnnotation> getAnnotations(PsiElement e, String... names)
}
return result;
}

@Override
public String getParticipantId() {
return PersistenceAnnotationQuickFix.class.getName();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,9 @@ private static PsiAnnotation getAnnotation(PsiElement e) {
}
return PsiTreeUtil.getParentOfType(e, PsiAnnotation.class);
}

@Override
public String getParticipantId() {
return CompleteFilterAnnotationQuickFix.class.getName();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,9 @@ private static PsiAnnotation getAnnotation(PsiElement e) {
}
return PsiTreeUtil.getParentOfType(e, PsiAnnotation.class);
}

@Override
public String getParticipantId() {
return CompleteServletAnnotationQuickFix.class.getName();
}
}
22 changes: 22 additions & 0 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,28 @@
targetDiagnostic="jakarta-cdi#InvalidManagedBeanConstructor"
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ManagedBeanNoArgConstructorQuickFix"/>

<javaCodeActionParticipant kind="quickfix"
group="jakarta"
targetDiagnostic="jakarta-persistence#SupplyAttributesToAnnotations"
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.persistence.PersistenceAnnotationQuickFix"/>
<javaCodeActionParticipant kind="quickfix"
group="jakarta"
targetDiagnostic="jakarta-cdi#InvalidManagedBeanAnnotation"
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ManagedBeanQuickFix"/>
<javaCodeActionParticipant kind="quickfix"
group="jakarta"
targetDiagnostic="jakarta-servlet#CompleteHttpServletAttributes"
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.servlet.CompleteServletAnnotationQuickFix"/>
<javaCodeActionParticipant kind="quickfix"
group="jakarta"
targetDiagnostic="jakarta-cdi#InvalidManagedBeanConstructor"
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ManagedBeanConstructorQuickFix"/>

<javaCodeActionParticipant kind="quickfix"
group="jakarta"
targetDiagnostic="jakarta-cdi#InvalidManagedBeanConstructor"
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.servlet.CompleteFilterAnnotationQuickFix"/>

<configSourceProvider
implementation="io.openliberty.tools.intellij.lsp4mp4ij.psi.internal.core.providers.MicroProfileConfigSourceProvider"/>

Expand Down

0 comments on commit 459e9d0

Please sign in to comment.