Skip to content

Commit a45730c

Browse files
authored
Feature/mutually exclusive ones (#1423)
* Added two new quick fixes * new mappings in plugin.xml * Added mutuallyExclusive logic * Update plugin.xml * Update plugin.xml * Update ManagedBeanDiagnosticsCollector.java * Update ManagedBeanDiagnosticsCollector.java * test cases * pr fix * Update ManagedBeanDiagnosticsCollector.java * Update ManagedBeanDiagnosticsCollector.java
1 parent 10d60d3 commit a45730c

File tree

6 files changed

+192
-47
lines changed

6 files changed

+192
-47
lines changed

src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/cdi/ManagedBeanConstants.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,12 @@ public class ManagedBeanConstants {
3636
public static final String DIAGNOSTIC_CODE_INVALID_INJECT_PARAM = "RemoveInjectOrConflictedAnnotations";
3737
public static final String DIAGNOSTIC_CODE_INVALID_PRODUCES_PARAM = "RemoveProducesOrConflictedAnnotations";
3838
public static final String DIAGNOSTIC_CODE_INVALID_DISPOSES_PARAM = "RemoveDisposesOrConflictedAnnotations";
39+
public static final String DIAGNOSTIC_INJECT_MULTIPLE_METHOD_PARAM = "InvalidInjectAnnotationOnMultipleMethodParams";
3940

4041
public static final String DIAGNOSTIC_CODE_REDUNDANT_DISPOSES = "RemoveExtraDisposes";
41-
42+
//Added as part of fix that adds two quick fixes which are mutually exclusive issue #540
43+
public static final String[] INVALID_DISPOSER_FQ_PARAMS = { DISPOSES_FQ_NAME };
44+
public static final String[] INVALID_DISPOSER_FQ_CONFLICTED_PARAMS = { OBSERVES_FQ_NAME, OBSERVES_ASYNC_FQ_NAME };
4245
public static final String[] INVALID_INJECT_PARAMS_FQ = { DISPOSES_FQ_NAME, OBSERVES_FQ_NAME,
4346
OBSERVES_ASYNC_FQ_NAME };
4447

src/main/java/io/openliberty/tools/intellij/lsp4jakarta/lsp4ij/cdi/ManagedBeanDiagnosticsCollector.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@
1313

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

16-
import java.util.ArrayList;
17-
import java.util.List;
18-
import java.util.Set;
19-
import java.util.TreeSet;
16+
import java.util.*;
2017
import java.util.stream.Stream;
2118

2219
import com.intellij.psi.*;
@@ -311,7 +308,9 @@ DIAGNOSTIC_CODE_SCOPEDECL, new Gson().toJsonTree(managedBeanAnnotations),
311308

312309
private void invalidParamsCheck(PsiJavaFile unit, List<Diagnostic> diagnostics, PsiClass type, String target,
313310
String diagnosticCode) {
311+
Set<String> paramScopesSet;
314312
for (PsiMethod method : type.getMethods()) {
313+
boolean mutuallyExclusive = false;
315314
PsiAnnotation targetAnnotation = null;
316315

317316
for (PsiAnnotation annotation : method.getAnnotations()) {
@@ -333,15 +332,26 @@ private void invalidParamsCheck(PsiJavaFile unit, List<Diagnostic> diagnostics,
333332
for (String annotation : paramScopes) {
334333
invalidAnnotations.add("@" + getSimpleName(annotation));
335334
}
335+
paramScopesSet = new LinkedHashSet<>(paramScopes);
336+
if (paramScopesSet.size() == INVALID_INJECT_PARAMS_FQ.length && paramScopesSet.equals(Set.of(INVALID_INJECT_PARAMS_FQ))) {
337+
mutuallyExclusive = true;
338+
}
336339
}
337340

338341
if (!invalidAnnotations.isEmpty()) {
339-
String label = PRODUCES_FQ_NAME.equals(target) ?
340-
createInvalidProducesLabel(invalidAnnotations) :
341-
createInvalidInjectLabel(invalidAnnotations);
342-
diagnostics.add(createDiagnostic(method, unit, label, diagnosticCode, null, DiagnosticSeverity.Error));
342+
if(PRODUCES_FQ_NAME.equals(target)) {
343+
diagnostics.add(createDiagnostic(method, unit, createInvalidProducesLabel(invalidAnnotations),
344+
diagnosticCode, null, DiagnosticSeverity.Error));
345+
} else {
346+
if (mutuallyExclusive) {
347+
diagnostics.add(createDiagnostic(method, unit, createInvalidInjectLabel(invalidAnnotations),
348+
DIAGNOSTIC_INJECT_MULTIPLE_METHOD_PARAM, null, DiagnosticSeverity.Error));
349+
} else {
350+
diagnostics.add(createDiagnostic(method, unit, createInvalidInjectLabel(invalidAnnotations),
351+
diagnosticCode, null, DiagnosticSeverity.Error));
352+
}
353+
}
343354
}
344-
345355
}
346356
}
347357

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 IBM Corporation and others.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* IBM Corporation - initial API and implementation
12+
*******************************************************************************/
13+
14+
package io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi;
15+
16+
import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.quickfix.RemoveParamAnnotationQuickFix;
17+
import static io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ManagedBeanConstants.INVALID_DISPOSER_FQ_CONFLICTED_PARAMS;
18+
19+
/**
20+
*
21+
* Removes the @Observes and @ObservesAsync annotations from the declaring element.
22+
*
23+
*/
24+
public class RemoveInvalidDisposerConflictParamAnnotationQuickFix extends RemoveParamAnnotationQuickFix {
25+
26+
public RemoveInvalidDisposerConflictParamAnnotationQuickFix() {
27+
super(INVALID_DISPOSER_FQ_CONFLICTED_PARAMS);
28+
}
29+
30+
@Override
31+
public String getParticipantId() {
32+
return RemoveInvalidDisposerConflictParamAnnotationQuickFix.class.getName();
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 IBM Corporation and others.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* IBM Corporation - initial API and implementation
12+
*******************************************************************************/
13+
14+
package io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi;
15+
16+
import io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.quickfix.RemoveParamAnnotationQuickFix;
17+
import static io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ManagedBeanConstants.INVALID_DISPOSER_FQ_PARAMS;
18+
19+
/**
20+
*
21+
* Removes the @Disposes annotations from the declaring element.
22+
*
23+
*/
24+
public class RemoveInvalidDisposerParamAnnotationQuickFix extends RemoveParamAnnotationQuickFix {
25+
26+
public RemoveInvalidDisposerParamAnnotationQuickFix() {
27+
super(INVALID_DISPOSER_FQ_PARAMS);
28+
}
29+
30+
@Override
31+
public String getParticipantId() {
32+
return RemoveInvalidDisposerParamAnnotationQuickFix.class.getName();
33+
}
34+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -414,18 +414,26 @@
414414
group="jakarta"
415415
targetDiagnostic="jakarta-cdi#RemoveProducesOrConflictedAnnotations"
416416
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveProduceAnnotationQuickFix"/>
417+
<javaCodeActionParticipant kind="quickfix"
418+
group="jakarta"
419+
targetDiagnostic="jakarta-cdi#RemoveProducesOrConflictedAnnotations"
420+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidInjectParamAnnotationQuickFix"/>
417421
<javaCodeActionParticipant kind="quickfix"
418422
group="jakarta"
419423
targetDiagnostic="jakarta-cdi#RemoveInjectOrConflictedAnnotations"
420424
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidInjectParamAnnotationQuickFix"/>
425+
<javaCodeActionParticipant kind="quickfix"
426+
group="jakarta"
427+
targetDiagnostic="jakarta-cdi#RemoveInjectOrConflictedAnnotations"
428+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.quickfix.RemoveInjectAnnotationQuickFix"/>
421429
<javaCodeActionParticipant kind="quickfix"
422430
group="jakarta"
423431
targetDiagnostic="jakarta-cdi#RemoveDisposesOrConflictedAnnotations"
424-
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidInjectParamAnnotationQuickFix"/>
432+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidDisposerConflictParamAnnotationQuickFix"/>
425433
<javaCodeActionParticipant kind="quickfix"
426434
group="jakarta"
427-
targetDiagnostic="jakarta-cdi#RemoveProducesOrConflictedAnnotations"
428-
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidInjectParamAnnotationQuickFix"/>
435+
targetDiagnostic="jakarta-cdi#RemoveDisposesOrConflictedAnnotations"
436+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidDisposerParamAnnotationQuickFix"/>
429437
<javaCodeActionParticipant kind="quickfix"
430438
group="jakarta"
431439
targetDiagnostic="jakarta-cdi#InvalidManagedBeanAnnotation"
@@ -436,12 +444,34 @@
436444
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ConflictProducesInjectQuickFix"/>
437445
<javaCodeActionParticipant kind="quickfix"
438446
group="jakarta"
439-
targetDiagnostic="jakarta-cdi#RemoveInjectOrConflictedAnnotations"
447+
targetDiagnostic="jakarta-cdi#InvalidScopeDecl"
448+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ScopeDeclarationQuickFix"/>
449+
<javaCodeActionParticipant kind="quickfix"
450+
group="jakarta"
451+
targetDiagnostic="jakarta-cdi#InvalidInjectAnnotationOnMultipleMethodParams"
440452
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.codeAction.proposal.quickfix.RemoveInjectAnnotationQuickFix"/>
441453
<javaCodeActionParticipant kind="quickfix"
442454
group="jakarta"
443-
targetDiagnostic="jakarta-cdi#InvalidScopeDecl"
444-
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.ScopeDeclarationQuickFix"/>
455+
targetDiagnostic="jakarta-cdi#InvalidInjectAnnotationOnMultipleMethodParams"
456+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidInjectParamAnnotationQuickFix"/>
457+
<javaCodeActionParticipant kind="quickfix"
458+
group="jakarta"
459+
targetDiagnostic="jakarta-cdi#InvalidInjectAnnotationOnMultipleMethodParams"
460+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidDisposerParamAnnotationQuickFix"/>
461+
<javaCodeActionParticipant kind="quickfix"
462+
group="jakarta"
463+
targetDiagnostic="jakarta-cdi#InvalidInjectAnnotationOnMultipleMethodParams"
464+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidDisposerConflictParamAnnotationQuickFix"/>
465+
<javaCodeActionParticipant kind="quickfix"
466+
group="jakarta"
467+
targetDiagnostic="jakarta-cdi#RemoveExtraDisposes"
468+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.InvalidDisposesAnnotationOnMultipleMethodParams"/>
469+
<javaCodeActionParticipant kind="quickfix"
470+
group="jakarta"
471+
targetDiagnostic="jakarta-cdi#RemoveExtraDisposes"
472+
implementationClass="io.openliberty.tools.intellij.lsp4jakarta.lsp4ij.cdi.RemoveInvalidDisposerConflictParamAnnotationQuickFix"/>
473+
474+
445475

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

0 commit comments

Comments
 (0)