From 295ce7b01bf9221055c18bc7ce477a9ff535a0c8 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 18 Sep 2023 16:51:43 +0200 Subject: [PATCH] Java: add fix to remove extra semicolon between import statements GitOrigin-RevId: 3d390b9bbca1432e1a320201870e2c61edd07b23 --- .../daemon/impl/analysis/HighlightUtil.java | 14 +++++++------- .../daemon/impl/analysis/HighlightVisitorImpl.java | 2 +- .../ig/style/UnnecessarySemicolonInspection.java | 4 ++-- .../resources/messages/JavaPsiBundle.properties | 1 + .../ig/jdk/ForwardCompatibilityInspection.java | 5 +++-- .../src/com/intellij/psi/util/JavaElementKind.java | 6 +++++- 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index c1d95324be48..b7df1176a388 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -3209,14 +3209,14 @@ public final class HighlightUtil { return null; } - static HighlightInfo.Builder checkLoneSemicolonBetweenPackageStatements(@NotNull PsiJavaToken token, IElementType type, @NotNull LanguageLevel level) { - if (type == JavaTokenType.SEMICOLON - && level.isAtLeast(LanguageLevel.JDK_21) - && token.getParent() instanceof PsiImportList - && PsiUtil.isFollowedByImport(token)) { + static HighlightInfo.Builder checkExtraSemicolonBetweenImportStatements(@NotNull PsiJavaToken token, + IElementType type, + @NotNull LanguageLevel level) { + if (type == JavaTokenType.SEMICOLON && level.isAtLeast(LanguageLevel.JDK_21) && PsiUtil.isFollowedByImport(token)) { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) - .range(token.getTextRange()) - .descriptionAndTooltip(JavaErrorBundle.message("error.extra.semicolons.between.import.statements.not.allowed")); + .range(token) + .registerFix(QuickFixFactory.getInstance().createDeleteFix(token), null, null, null, null) + .descriptionAndTooltip(JavaErrorBundle.message("error.extra.semicolons.between.import.statements.not.allowed")); } return null; } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 645e0c5cdf64..f5d3b6e97fbd 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -613,7 +613,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } if (!hasErrorResults()) { - add(HighlightUtil.checkLoneSemicolonBetweenPackageStatements(token, type, myLanguageLevel)); + add(HighlightUtil.checkExtraSemicolonBetweenImportStatements(token, type, myLanguageLevel)); } } diff --git a/java/java-analysis-impl/src/com/siyeh/ig/style/UnnecessarySemicolonInspection.java b/java/java-analysis-impl/src/com/siyeh/ig/style/UnnecessarySemicolonInspection.java index 931537a8f110..4ddae1df3299 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/style/UnnecessarySemicolonInspection.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/style/UnnecessarySemicolonInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2021 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2023 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -118,7 +118,7 @@ public class UnnecessarySemicolonInspection extends BaseInspection implements Cl private void checkTopLevelSemicolons(PsiElement element) { for (PsiElement sibling = element.getFirstChild(); sibling != null; sibling = PsiTreeUtil.skipWhitespacesAndCommentsForward(sibling)) { if (sibling instanceof PsiErrorElement) return; - if (PsiUtil.isJavaToken(sibling, JavaTokenType.SEMICOLON) && !(sibling.getParent() instanceof PsiImportList && PsiUtil.isFollowedByImport(sibling))) { + if (PsiUtil.isJavaToken(sibling, JavaTokenType.SEMICOLON) && !PsiUtil.isFollowedByImport(sibling)) { registerError(sibling); } } diff --git a/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties b/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties index 774664caa1f6..4c04d4e3cbbb 100644 --- a/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties +++ b/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties @@ -45,6 +45,7 @@ element.variable=variable element.throws.list=throws list element.extends.list=extends list element.type.arguments=type arguments +element.type.semicolon=semicolon element.receiver.parameter=receiver parameter element.method.call=method call diff --git a/java/java-impl/src/com/siyeh/ig/jdk/ForwardCompatibilityInspection.java b/java/java-impl/src/com/siyeh/ig/jdk/ForwardCompatibilityInspection.java index 6a50fae0badd..9b266372aaa6 100644 --- a/java/java-impl/src/com/siyeh/ig/jdk/ForwardCompatibilityInspection.java +++ b/java/java-impl/src/com/siyeh/ig/jdk/ForwardCompatibilityInspection.java @@ -111,8 +111,9 @@ public class ForwardCompatibilityInspection extends AbstractBaseJavaLocalInspect @Override public void visitJavaToken(@NotNull PsiJavaToken token) { super.visitJavaToken(token); - if (languageLevel.isLessThan(LanguageLevel.JDK_21) && token.getParent() instanceof PsiImportList - && token.getTokenType() == JavaTokenType.SEMICOLON && PsiUtil.isFollowedByImport(token)) { + if (languageLevel.isLessThan(LanguageLevel.JDK_21) && + token.getTokenType() == JavaTokenType.SEMICOLON && + PsiUtil.isFollowedByImport(token)) { String message = JavaErrorBundle.message("redundant.semicolon.warn"); holder.registerProblem(token, message, new UnnecessarySemicolonInspection.UnnecessarySemicolonFix()); } diff --git a/java/java-psi-api/src/com/intellij/psi/util/JavaElementKind.java b/java/java-psi-api/src/com/intellij/psi/util/JavaElementKind.java index b81852ed8cd9..f0d0aeaac8e9 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/JavaElementKind.java +++ b/java/java-psi-api/src/com/intellij/psi/util/JavaElementKind.java @@ -43,7 +43,8 @@ public enum JavaElementKind { EXTENDS_LIST("element.extends.list"), RECEIVER_PARAMETER("element.receiver.parameter"), METHOD_CALL("element.method.call"), - TYPE_ARGUMENTS("element.type.arguments"); + TYPE_ARGUMENTS("element.type.arguments"), + SEMICOLON("element.type.semicolon"); private final @PropertyKey(resourceBundle = JavaPsiBundle.BUNDLE) String propertyKey; @@ -191,6 +192,9 @@ public enum JavaElementKind { if (element instanceof PsiSnippetDocTagBody) { return SNIPPET_BODY; } + if (PsiUtil.isJavaToken(element, JavaTokenType.SEMICOLON)) { + return SEMICOLON; + } return UNKNOWN; } }