From 98793266f01761393c0693d5a1aaf2f0d1660187 Mon Sep 17 00:00:00 2001 From: UNV Date: Fri, 20 Jun 2025 23:09:27 +0300 Subject: [PATCH 1/3] Reformatting MergeModuleStatementsFix, MergePackageAccessibilityStatementsFix, MergeProvidesStatementsFix. --- .../quickfix/MergeModuleStatementsFix.java | 113 +++++++------ ...ergePackageAccessibilityStatementsFix.java | 154 +++++++++--------- .../quickfix/MergeProvidesStatementsFix.java | 119 +++++++------- 3 files changed, 201 insertions(+), 185 deletions(-) diff --git a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java index c541e752b4..2016e1f51e 100644 --- a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java +++ b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java @@ -27,6 +27,7 @@ import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; + import java.util.HashSet; import java.util.List; import java.util.Set; @@ -36,67 +37,79 @@ * @author Pavel.Dolgov */ public abstract class MergeModuleStatementsFix extends LocalQuickFixAndIntentionActionOnPsiElement { + protected MergeModuleStatementsFix(@Nonnull PsiJavaModule javaModule) { + super(javaModule); + } - protected MergeModuleStatementsFix(@Nonnull PsiJavaModule javaModule) { - super(javaModule); - } - - @Override - public boolean isAvailable(@Nonnull Project project, @Nonnull PsiFile file, @Nonnull PsiElement startElement, @Nonnull PsiElement endElement) { - return PsiUtil.isLanguageLevel9OrHigher(file); - } + @Override + public boolean isAvailable( + @Nonnull Project project, + @Nonnull PsiFile file, + @Nonnull PsiElement startElement, + @Nonnull PsiElement endElement + ) { + return PsiUtil.isLanguageLevel9OrHigher(file); + } - @Override - public void invoke(@Nonnull Project project, @Nonnull PsiFile file, @Nullable Editor editor, @Nonnull PsiElement startElement, @Nonnull PsiElement endElement) { - if (startElement instanceof PsiJavaModule) { - final PsiJavaModule javaModule = (PsiJavaModule) startElement; - final List statementsToMerge = getStatementsToMerge(javaModule); - LOG.assertTrue(!statementsToMerge.isEmpty()); + @Override + public void invoke( + @Nonnull Project project, + @Nonnull PsiFile file, + @Nullable Editor editor, + @Nonnull PsiElement startElement, + @Nonnull PsiElement endElement + ) { + if (startElement instanceof PsiJavaModule) { + final PsiJavaModule javaModule = (PsiJavaModule) startElement; + final List statementsToMerge = getStatementsToMerge(javaModule); + LOG.assertTrue(!statementsToMerge.isEmpty()); - final String tempModuleText = PsiKeyword.MODULE + " " + javaModule.getName() + " {" + getReplacementText(statementsToMerge) + "}"; - final PsiJavaModule tempModule = JavaPsiFacade.getInstance(project).getElementFactory().createModuleFromText(tempModuleText); + final String tempModuleText = + PsiKeyword.MODULE + " " + javaModule.getName() + " {" + getReplacementText(statementsToMerge) + "}"; + final PsiJavaModule tempModule = JavaPsiFacade.getInstance(project).getElementFactory().createModuleFromText(tempModuleText); - final List tempStatements = getStatementsToMerge(tempModule); - LOG.assertTrue(!tempStatements.isEmpty()); - final T replacement = tempStatements.get(0); + final List tempStatements = getStatementsToMerge(tempModule); + LOG.assertTrue(!tempStatements.isEmpty()); + final T replacement = tempStatements.get(0); - final T firstStatement = statementsToMerge.get(0); - final CommentTracker commentTracker = new CommentTracker(); - final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); - final PsiElement resultingStatement = codeStyleManager.reformat(commentTracker.replace(firstStatement, replacement)); + final T firstStatement = statementsToMerge.get(0); + final CommentTracker commentTracker = new CommentTracker(); + final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); + final PsiElement resultingStatement = codeStyleManager.reformat(commentTracker.replace(firstStatement, replacement)); - for (int i = 1; i < statementsToMerge.size(); i++) { - T statement = statementsToMerge.get(i); - commentTracker.delete(statement); - } - commentTracker.insertCommentsBefore(resultingStatement); + for (int i = 1; i < statementsToMerge.size(); i++) { + T statement = statementsToMerge.get(i); + commentTracker.delete(statement); + } + commentTracker.insertCommentsBefore(resultingStatement); - if (editor != null) { - final int offset = resultingStatement.getTextRange().getEndOffset(); - editor.getCaretModel().moveToOffset(offset); - } + if (editor != null) { + final int offset = resultingStatement.getTextRange().getEndOffset(); + editor.getCaretModel().moveToOffset(offset); + } + } } - } - @Nonnull - protected abstract String getReplacementText(List statementsToMerge); + @Nonnull + protected abstract String getReplacementText(List statementsToMerge); - @Nonnull - protected abstract List getStatementsToMerge(@Nonnull PsiJavaModule javaModule); + @Nonnull + protected abstract List getStatementsToMerge(@Nonnull PsiJavaModule javaModule); - @Nonnull - protected static String joinUniqueNames(@Nonnull List names) { - final Set unique = new HashSet<>(); - return names.stream().filter(name -> unique.add(name)).collect(Collectors.joining(",")); - } + @Nonnull + protected static String joinUniqueNames(@Nonnull List names) { + final Set unique = new HashSet<>(); + return names.stream().filter(name -> unique.add(name)).collect(Collectors.joining(",")); + } - @Nullable - public static MergeModuleStatementsFix createFix(@Nullable PsiElement statement) { - if (statement instanceof PsiPackageAccessibilityStatement) { - return MergePackageAccessibilityStatementsFix.createFix((PsiPackageAccessibilityStatement) statement); - } else if (statement instanceof PsiProvidesStatement) { - return MergeProvidesStatementsFix.createFix((PsiProvidesStatement) statement); + @Nullable + public static MergeModuleStatementsFix createFix(@Nullable PsiElement statement) { + if (statement instanceof PsiPackageAccessibilityStatement) { + return MergePackageAccessibilityStatementsFix.createFix((PsiPackageAccessibilityStatement) statement); + } + else if (statement instanceof PsiProvidesStatement) { + return MergeProvidesStatementsFix.createFix((PsiProvidesStatement) statement); + } + return null; } - return null; - } } diff --git a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java index 957b91d6f4..10448bf91a 100644 --- a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java +++ b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java @@ -26,6 +26,7 @@ import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -36,95 +37,96 @@ * @author Pavel.Dolgov */ public class MergePackageAccessibilityStatementsFix extends MergeModuleStatementsFix { + private static final Logger LOG = Logger.getInstance(MergePackageAccessibilityStatementsFix.class); + private final String myPackageName; + private final Role myRole; - private static final Logger LOG = Logger.getInstance(MergePackageAccessibilityStatementsFix.class); - private final String myPackageName; - private final Role myRole; - - protected MergePackageAccessibilityStatementsFix(@Nonnull PsiJavaModule javaModule, @Nonnull String packageName, @Nonnull Role role) { - super(javaModule); - myPackageName = packageName; - myRole = role; - } + protected MergePackageAccessibilityStatementsFix(@Nonnull PsiJavaModule javaModule, @Nonnull String packageName, @Nonnull Role role) { + super(javaModule); + myPackageName = packageName; + myRole = role; + } - @Nls - @Nonnull - @Override - public String getText() { - return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.name", getKeyword(), myPackageName); - } + @Nls + @Nonnull + @Override + public String getText() { + return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.name", getKeyword(), myPackageName); + } - @Nls - @Nonnull - @Override - public String getFamilyName() { - return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.family.name", getKeyword()); - } + @Nls + @Nonnull + @Override + public String getFamilyName() { + return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.family.name", getKeyword()); + } - @Nonnull - @Override - protected String getReplacementText(@Nonnull List statementsToMerge) { - final List moduleNames = getModuleNames(statementsToMerge); - if (!moduleNames.isEmpty()) { - return getKeyword() + " " + myPackageName + " " + PsiKeyword.TO + " " + joinUniqueNames(moduleNames) + ";"; + @Nonnull + @Override + protected String getReplacementText(@Nonnull List statementsToMerge) { + final List moduleNames = getModuleNames(statementsToMerge); + if (!moduleNames.isEmpty()) { + return getKeyword() + " " + myPackageName + " " + PsiKeyword.TO + " " + joinUniqueNames(moduleNames) + ";"; + } + return getKeyword() + " " + myPackageName + ";"; } - return getKeyword() + " " + myPackageName + ";"; - } - @Nonnull - private static List getModuleNames(@Nonnull List statements) { - final List result = new ArrayList<>(); - for (PsiPackageAccessibilityStatement statement : statements) { - final List moduleNames = statement.getModuleNames(); - if (moduleNames.isEmpty()) { - return Collections.emptyList(); - } - result.addAll(moduleNames); + @Nonnull + private static List getModuleNames(@Nonnull List statements) { + final List result = new ArrayList<>(); + for (PsiPackageAccessibilityStatement statement : statements) { + final List moduleNames = statement.getModuleNames(); + if (moduleNames.isEmpty()) { + return Collections.emptyList(); + } + result.addAll(moduleNames); + } + return result; } - return result; - } - @Nonnull - @Override - protected List getStatementsToMerge(@Nonnull PsiJavaModule javaModule) { - return StreamSupport.stream(getStatements(javaModule, myRole).spliterator(), false).filter(statement -> myPackageName.equals(statement.getPackageName())).collect(Collectors.toList()); - } + @Nonnull + @Override + protected List getStatementsToMerge(@Nonnull PsiJavaModule javaModule) { + return StreamSupport.stream(getStatements(javaModule, myRole).spliterator(), false) + .filter(statement -> myPackageName.equals(statement.getPackageName())) + .collect(Collectors.toList()); + } - @Nullable - public static MergeModuleStatementsFix createFix(@Nullable PsiPackageAccessibilityStatement statement) { - if (statement != null) { - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiJavaModule) { - final String packageName = statement.getPackageName(); - if (packageName != null) { - return new MergePackageAccessibilityStatementsFix((PsiJavaModule) parent, packageName, statement.getRole()); + @Nullable + public static MergeModuleStatementsFix createFix(@Nullable PsiPackageAccessibilityStatement statement) { + if (statement != null) { + final PsiElement parent = statement.getParent(); + if (parent instanceof PsiJavaModule) { + final String packageName = statement.getPackageName(); + if (packageName != null) { + return new MergePackageAccessibilityStatementsFix((PsiJavaModule) parent, packageName, statement.getRole()); + } + } } - } + return null; } - return null; - } - @Nonnull - private static Iterable getStatements(@Nonnull PsiJavaModule javaModule, @Nonnull Role role) { - switch (role) { - case OPENS: - return javaModule.getOpens(); - case EXPORTS: - return javaModule.getExports(); + @Nonnull + private static Iterable getStatements(@Nonnull PsiJavaModule javaModule, @Nonnull Role role) { + switch (role) { + case OPENS: + return javaModule.getOpens(); + case EXPORTS: + return javaModule.getExports(); + } + LOG.error("Unexpected role " + role); + return Collections.emptyList(); } - LOG.error("Unexpected role " + role); - return Collections.emptyList(); - } - @Nonnull - private String getKeyword() { - switch (myRole) { - case OPENS: - return PsiKeyword.OPENS; - case EXPORTS: - return PsiKeyword.EXPORTS; + @Nonnull + private String getKeyword() { + switch (myRole) { + case OPENS: + return PsiKeyword.OPENS; + case EXPORTS: + return PsiKeyword.EXPORTS; + } + LOG.error("Unexpected role " + myRole); + return ""; } - LOG.error("Unexpected role " + myRole); - return ""; - } } diff --git a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java index 241fb4d84f..7b78a9aa8a 100644 --- a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java +++ b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nls; import jakarta.annotation.Nullable; + import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -32,73 +33,73 @@ * @author Pavel.Dolgov */ public class MergeProvidesStatementsFix extends MergeModuleStatementsFix { - private final String myInterfaceName; + private final String myInterfaceName; - MergeProvidesStatementsFix(@Nonnull PsiJavaModule javaModule, @Nonnull String interfaceName) { - super(javaModule); - myInterfaceName = interfaceName; - } + MergeProvidesStatementsFix(@Nonnull PsiJavaModule javaModule, @Nonnull String interfaceName) { + super(javaModule); + myInterfaceName = interfaceName; + } - @Nonnull - @Override - public String getText() { - return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.name", PsiKeyword.PROVIDES, myInterfaceName); - } + @Nonnull + @Override + public String getText() { + return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.name", PsiKeyword.PROVIDES, myInterfaceName); + } - @Nls - @Nonnull - @Override - public String getFamilyName() { - return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.family.name", PsiKeyword.PROVIDES); - } + @Nls + @Nonnull + @Override + public String getFamilyName() { + return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.family.name", PsiKeyword.PROVIDES); + } - @Nonnull - @Override - protected String getReplacementText(@Nonnull List statementsToMerge) { - final List implementationNames = getImplementationNames(statementsToMerge); - LOG.assertTrue(!implementationNames.isEmpty()); - return PsiKeyword.PROVIDES + " " + myInterfaceName + " " + PsiKeyword.WITH + " " + joinUniqueNames(implementationNames) + ";"; - } + @Nonnull + @Override + protected String getReplacementText(@Nonnull List statementsToMerge) { + final List implementationNames = getImplementationNames(statementsToMerge); + LOG.assertTrue(!implementationNames.isEmpty()); + return PsiKeyword.PROVIDES + " " + myInterfaceName + " " + PsiKeyword.WITH + " " + joinUniqueNames(implementationNames) + ";"; + } - @Nonnull - private static List getImplementationNames(@Nonnull List statements) { - List list = new ArrayList<>(); - for (PsiProvidesStatement statement : statements) { - PsiReferenceList implementationList = statement.getImplementationList(); - if (implementationList == null) { - continue; - } - for (PsiJavaCodeReferenceElement element : implementationList.getReferenceElements()) { - ContainerUtil.addIfNotNull(list, element.getQualifiedName()); - } + @Nonnull + private static List getImplementationNames(@Nonnull List statements) { + List list = new ArrayList<>(); + for (PsiProvidesStatement statement : statements) { + PsiReferenceList implementationList = statement.getImplementationList(); + if (implementationList == null) { + continue; + } + for (PsiJavaCodeReferenceElement element : implementationList.getReferenceElements()) { + ContainerUtil.addIfNotNull(list, element.getQualifiedName()); + } + } + return list; } - return list; - } - @Nonnull - @Override - protected List getStatementsToMerge(@Nonnull PsiJavaModule javaModule) { - return StreamSupport.stream(javaModule.getProvides().spliterator(), false).filter(statement -> - { - final PsiJavaCodeReferenceElement reference = statement.getInterfaceReference(); - return reference != null && myInterfaceName.equals(reference.getQualifiedName()); - }).collect(Collectors.toList()); - } + @Nonnull + @Override + protected List getStatementsToMerge(@Nonnull PsiJavaModule javaModule) { + return StreamSupport.stream(javaModule.getProvides().spliterator(), false).filter(statement -> + { + final PsiJavaCodeReferenceElement reference = statement.getInterfaceReference(); + return reference != null && myInterfaceName.equals(reference.getQualifiedName()); + }).collect(Collectors.toList()); + } - @Nullable - public static MergeModuleStatementsFix createFix(@Nullable PsiProvidesStatement statement) { - if (statement != null) { - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiJavaModule) { - final PsiJavaCodeReferenceElement interfaceReference = statement.getInterfaceReference(); - if (interfaceReference != null) { - final String interfaceName = interfaceReference.getQualifiedName(); - if (interfaceName != null) { - return new MergeProvidesStatementsFix((PsiJavaModule) parent, interfaceName); - } + @Nullable + public static MergeModuleStatementsFix createFix(@Nullable PsiProvidesStatement statement) { + if (statement != null) { + final PsiElement parent = statement.getParent(); + if (parent instanceof PsiJavaModule) { + final PsiJavaCodeReferenceElement interfaceReference = statement.getInterfaceReference(); + if (interfaceReference != null) { + final String interfaceName = interfaceReference.getQualifiedName(); + if (interfaceName != null) { + return new MergeProvidesStatementsFix((PsiJavaModule) parent, interfaceName); + } + } + } } - } + return null; } - return null; - } } From abcb6fe0142080c9a26e06eba97a562515d1e0da Mon Sep 17 00:00:00 2001 From: UNV Date: Fri, 20 Jun 2025 23:27:22 +0300 Subject: [PATCH 2/3] Refactoring MergeModuleStatementsFix, MergePackageAccessibilityStatementsFix, MergeProvidesStatementsFix. --- .../quickfix/MergeModuleStatementsFix.java | 38 +++++++------- ...ergePackageAccessibilityStatementsFix.java | 52 +++++++------------ .../quickfix/MergeProvidesStatementsFix.java | 34 ++++++------ 3 files changed, 54 insertions(+), 70 deletions(-) diff --git a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java index 2016e1f51e..e70525c366 100644 --- a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java +++ b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeModuleStatementsFix.java @@ -18,6 +18,8 @@ import com.intellij.java.language.psi.*; import com.intellij.java.language.psi.util.PsiUtil; import com.siyeh.ig.psiutils.CommentTracker; +import consulo.annotation.access.RequiredReadAction; +import consulo.annotation.access.RequiredWriteAction; import consulo.codeEditor.Editor; import consulo.language.codeStyle.CodeStyleManager; import consulo.language.editor.inspection.LocalQuickFixAndIntentionActionOnPsiElement; @@ -42,6 +44,7 @@ protected MergeModuleStatementsFix(@Nonnull PsiJavaModule javaModule) { } @Override + @RequiredReadAction public boolean isAvailable( @Nonnull Project project, @Nonnull PsiFile file, @@ -52,6 +55,7 @@ public boolean isAvailable( } @Override + @RequiredWriteAction public void invoke( @Nonnull Project project, @Nonnull PsiFile file, @@ -59,23 +63,22 @@ public void invoke( @Nonnull PsiElement startElement, @Nonnull PsiElement endElement ) { - if (startElement instanceof PsiJavaModule) { - final PsiJavaModule javaModule = (PsiJavaModule) startElement; - final List statementsToMerge = getStatementsToMerge(javaModule); + if (startElement instanceof PsiJavaModule javaModule) { + List statementsToMerge = getStatementsToMerge(javaModule); LOG.assertTrue(!statementsToMerge.isEmpty()); - final String tempModuleText = + String tempModuleText = PsiKeyword.MODULE + " " + javaModule.getName() + " {" + getReplacementText(statementsToMerge) + "}"; - final PsiJavaModule tempModule = JavaPsiFacade.getInstance(project).getElementFactory().createModuleFromText(tempModuleText); + PsiJavaModule tempModule = JavaPsiFacade.getInstance(project).getElementFactory().createModuleFromText(tempModuleText); - final List tempStatements = getStatementsToMerge(tempModule); + List tempStatements = getStatementsToMerge(tempModule); LOG.assertTrue(!tempStatements.isEmpty()); - final T replacement = tempStatements.get(0); + T replacement = tempStatements.get(0); - final T firstStatement = statementsToMerge.get(0); - final CommentTracker commentTracker = new CommentTracker(); - final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); - final PsiElement resultingStatement = codeStyleManager.reformat(commentTracker.replace(firstStatement, replacement)); + T firstStatement = statementsToMerge.get(0); + CommentTracker commentTracker = new CommentTracker(); + CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); + PsiElement resultingStatement = codeStyleManager.reformat(commentTracker.replace(firstStatement, replacement)); for (int i = 1; i < statementsToMerge.size(); i++) { T statement = statementsToMerge.get(i); @@ -84,7 +87,7 @@ public void invoke( commentTracker.insertCommentsBefore(resultingStatement); if (editor != null) { - final int offset = resultingStatement.getTextRange().getEndOffset(); + int offset = resultingStatement.getTextRange().getEndOffset(); editor.getCaretModel().moveToOffset(offset); } } @@ -98,17 +101,16 @@ public void invoke( @Nonnull protected static String joinUniqueNames(@Nonnull List names) { - final Set unique = new HashSet<>(); - return names.stream().filter(name -> unique.add(name)).collect(Collectors.joining(",")); + return names.stream().distinct().collect(Collectors.joining(",")); } @Nullable public static MergeModuleStatementsFix createFix(@Nullable PsiElement statement) { - if (statement instanceof PsiPackageAccessibilityStatement) { - return MergePackageAccessibilityStatementsFix.createFix((PsiPackageAccessibilityStatement) statement); + if (statement instanceof PsiPackageAccessibilityStatement packageAccessibilityStmt) { + return MergePackageAccessibilityStatementsFix.createFix(packageAccessibilityStmt); } - else if (statement instanceof PsiProvidesStatement) { - return MergeProvidesStatementsFix.createFix((PsiProvidesStatement) statement); + else if (statement instanceof PsiProvidesStatement providesStmt) { + return MergeProvidesStatementsFix.createFix(providesStmt); } return null; } diff --git a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java index 10448bf91a..bea6deb5eb 100644 --- a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java +++ b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergePackageAccessibilityStatementsFix.java @@ -19,11 +19,8 @@ import com.intellij.java.language.psi.PsiKeyword; import com.intellij.java.language.psi.PsiPackageAccessibilityStatement; import com.intellij.java.language.psi.PsiPackageAccessibilityStatement.Role; -import consulo.java.analysis.impl.JavaQuickFixBundle; -import consulo.language.psi.PsiElement; +import consulo.java.analysis.impl.localize.JavaQuickFixLocalize; import consulo.logging.Logger; -import org.jetbrains.annotations.Nls; - import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -47,24 +44,22 @@ protected MergePackageAccessibilityStatementsFix(@Nonnull PsiJavaModule javaModu myRole = role; } - @Nls @Nonnull @Override public String getText() { - return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.name", getKeyword(), myPackageName); + return JavaQuickFixLocalize.java9MergeModuleStatementsFixName(getKeyword(), myPackageName).get(); } - @Nls @Nonnull @Override public String getFamilyName() { - return JavaQuickFixBundle.message("java.9.merge.module.statements.fix.family.name", getKeyword()); + return JavaQuickFixLocalize.java9MergeModuleStatementsFixFamilyName(getKeyword()).get(); } @Nonnull @Override protected String getReplacementText(@Nonnull List statementsToMerge) { - final List moduleNames = getModuleNames(statementsToMerge); + List moduleNames = getModuleNames(statementsToMerge); if (!moduleNames.isEmpty()) { return getKeyword() + " " + myPackageName + " " + PsiKeyword.TO + " " + joinUniqueNames(moduleNames) + ";"; } @@ -73,9 +68,9 @@ protected String getReplacementText(@Nonnull List getModuleNames(@Nonnull List statements) { - final List result = new ArrayList<>(); + List result = new ArrayList<>(); for (PsiPackageAccessibilityStatement statement : statements) { - final List moduleNames = statement.getModuleNames(); + List moduleNames = statement.getModuleNames(); if (moduleNames.isEmpty()) { return Collections.emptyList(); } @@ -94,13 +89,10 @@ protected List getStatementsToMerge(@Nonnull P @Nullable public static MergeModuleStatementsFix createFix(@Nullable PsiPackageAccessibilityStatement statement) { - if (statement != null) { - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiJavaModule) { - final String packageName = statement.getPackageName(); - if (packageName != null) { - return new MergePackageAccessibilityStatementsFix((PsiJavaModule) parent, packageName, statement.getRole()); - } + if (statement != null && statement.getParent() instanceof PsiJavaModule javaModule) { + String packageName = statement.getPackageName(); + if (packageName != null) { + return new MergePackageAccessibilityStatementsFix(javaModule, packageName, statement.getRole()); } } return null; @@ -108,25 +100,17 @@ public static MergeModuleStatementsFix createFix(@Nullable PsiPackageAccessibili @Nonnull private static Iterable getStatements(@Nonnull PsiJavaModule javaModule, @Nonnull Role role) { - switch (role) { - case OPENS: - return javaModule.getOpens(); - case EXPORTS: - return javaModule.getExports(); - } - LOG.error("Unexpected role " + role); - return Collections.emptyList(); + return switch (role) { + case OPENS -> javaModule.getOpens(); + case EXPORTS -> javaModule.getExports(); + }; } @Nonnull private String getKeyword() { - switch (myRole) { - case OPENS: - return PsiKeyword.OPENS; - case EXPORTS: - return PsiKeyword.EXPORTS; - } - LOG.error("Unexpected role " + myRole); - return ""; + return switch (myRole) { + case OPENS -> PsiKeyword.OPENS; + case EXPORTS -> PsiKeyword.EXPORTS; + }; } } diff --git a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java index 7b78a9aa8a..5e9e7e4b78 100644 --- a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java +++ b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/quickfix/MergeProvidesStatementsFix.java @@ -17,6 +17,7 @@ import com.intellij.java.language.psi.*; import consulo.java.analysis.impl.JavaQuickFixBundle; +import consulo.java.analysis.impl.localize.JavaQuickFixLocalize; import consulo.language.psi.PsiElement; import consulo.util.collection.ContainerUtil; import jakarta.annotation.Nonnull; @@ -43,20 +44,19 @@ public class MergeProvidesStatementsFix extends MergeModuleStatementsFix statementsToMerge) { - final List implementationNames = getImplementationNames(statementsToMerge); + List implementationNames = getImplementationNames(statementsToMerge); LOG.assertTrue(!implementationNames.isEmpty()); return PsiKeyword.PROVIDES + " " + myInterfaceName + " " + PsiKeyword.WITH + " " + joinUniqueNames(implementationNames) + ";"; } @@ -79,24 +79,22 @@ private static List getImplementationNames(@Nonnull List getStatementsToMerge(@Nonnull PsiJavaModule javaModule) { - return StreamSupport.stream(javaModule.getProvides().spliterator(), false).filter(statement -> - { - final PsiJavaCodeReferenceElement reference = statement.getInterfaceReference(); - return reference != null && myInterfaceName.equals(reference.getQualifiedName()); - }).collect(Collectors.toList()); + return StreamSupport.stream(javaModule.getProvides().spliterator(), false) + .filter(statement -> { + PsiJavaCodeReferenceElement reference = statement.getInterfaceReference(); + return reference != null && myInterfaceName.equals(reference.getQualifiedName()); + }) + .collect(Collectors.toList()); } @Nullable public static MergeModuleStatementsFix createFix(@Nullable PsiProvidesStatement statement) { - if (statement != null) { - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiJavaModule) { - final PsiJavaCodeReferenceElement interfaceReference = statement.getInterfaceReference(); - if (interfaceReference != null) { - final String interfaceName = interfaceReference.getQualifiedName(); - if (interfaceName != null) { - return new MergeProvidesStatementsFix((PsiJavaModule) parent, interfaceName); - } + if (statement != null && statement.getParent() instanceof PsiJavaModule javaModule) { + PsiJavaCodeReferenceElement interfaceReference = statement.getInterfaceReference(); + if (interfaceReference != null) { + String interfaceName = interfaceReference.getQualifiedName(); + if (interfaceName != null) { + return new MergeProvidesStatementsFix(javaModule, interfaceName); } } } From c1404eb2339a4924d6eabfb9a58ed9986ef8feb6 Mon Sep 17 00:00:00 2001 From: UNV Date: Fri, 20 Jun 2025 23:28:21 +0300 Subject: [PATCH 3/3] Fixing NullPointerException during MergeModuleStatementsFix adding in ModuleHighlightUtil. --- .../daemon/impl/analysis/ModuleHighlightUtil.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java index a7d6799040..e94c5f8997 100644 --- a/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java +++ b/java-analysis-impl/src/main/java/com/intellij/java/analysis/impl/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java @@ -197,13 +197,16 @@ private static void checkDuplicateRefs( for (T statement : statements) { String refText = ref.apply(statement).orElse(null); if (refText != null && !filter.add(refText)) { - HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + HighlightInfo.Builder hlBuilder = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) .range(statement) .descriptionAndTooltip(descriptionTemplate.apply(refText)) - .registerFix(factory().createDeleteFix(statement)) - .registerFix(MergeModuleStatementsFix.createFix(statement)) - .create(); - results.add(info); + .registerFix(factory().createDeleteFix(statement)); + + MergeModuleStatementsFix mergeModuleStatementsFix = MergeModuleStatementsFix.createFix(statement); + if (mergeModuleStatementsFix != null) { + hlBuilder.registerFix(mergeModuleStatementsFix); + } + results.add(hlBuilder.create()); } } }