diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSemicolonInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSemicolonInspection.kt index 6e33e80f8ec..be9ee3845c0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSemicolonInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantSemicolonInspection.kt @@ -24,6 +24,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.kdoc.psi.api.KDoc +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* @@ -86,6 +87,11 @@ class RedundantSemicolonInspection : AbstractKotlinInspection(), CleanupLocalIns return false } + val prevNameReference = semicolon.getPrevSiblingIgnoringWhitespaceAndComments() as? KtNameReferenceExpression + if (prevNameReference != null && prevNameReference.text in softModifierKeywords + && semicolon.getNextSiblingIgnoringWhitespaceAndComments() is KtDeclaration + ) return false + return true } @@ -112,4 +118,6 @@ class RedundantSemicolonInspection : AbstractKotlinInspection(), CleanupLocalIns descriptor.psiElement.delete() } } + + private val softModifierKeywords = KtTokens.SOFT_KEYWORDS.types.mapNotNull { (it as? KtModifierKeywordToken)?.toString() } } diff --git a/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftKeywordAndDeclaration.kt b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftKeywordAndDeclaration.kt new file mode 100644 index 00000000000..3f9bd907eb7 --- /dev/null +++ b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftKeywordAndDeclaration.kt @@ -0,0 +1,4 @@ +fun test(import: Int) { + import; + val a = 1 +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftKeywordAndDeclaration.kt.after b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftKeywordAndDeclaration.kt.after new file mode 100644 index 00000000000..058612e8739 --- /dev/null +++ b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftKeywordAndDeclaration.kt.after @@ -0,0 +1,4 @@ +fun test(import: Int) { + import + val a = 1 +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration.kt b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration.kt new file mode 100644 index 00000000000..f65ff25528e --- /dev/null +++ b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration.kt @@ -0,0 +1,5 @@ +// PROBLEM: none +fun test(data: Int) { + data; + val a = 1 +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration2.kt b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration2.kt new file mode 100644 index 00000000000..57357ce0c58 --- /dev/null +++ b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration2.kt @@ -0,0 +1,6 @@ +// PROBLEM: none +fun test(inline: Int) { + inline; + fun a() { + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration3.kt b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration3.kt new file mode 100644 index 00000000000..c48993532c2 --- /dev/null +++ b/idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration3.kt @@ -0,0 +1,6 @@ +// PROBLEM: none +fun test(public: Int) { + public // comment1 + ; // comment2 + class A +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index e6109eace40..e15a0476d2e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -3973,6 +3973,26 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/redundantSemicolon/beforeKDocAndLambda.kt"); } + @TestMetadata("betweenSoftKeywordAndDeclaration.kt") + public void testBetweenSoftKeywordAndDeclaration() throws Exception { + runTest("idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftKeywordAndDeclaration.kt"); + } + + @TestMetadata("betweenSoftModifierKeywordAndDeclaration.kt") + public void testBetweenSoftModifierKeywordAndDeclaration() throws Exception { + runTest("idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration.kt"); + } + + @TestMetadata("betweenSoftModifierKeywordAndDeclaration2.kt") + public void testBetweenSoftModifierKeywordAndDeclaration2() throws Exception { + runTest("idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration2.kt"); + } + + @TestMetadata("betweenSoftModifierKeywordAndDeclaration3.kt") + public void testBetweenSoftModifierKeywordAndDeclaration3() throws Exception { + runTest("idea/testData/inspectionsLocal/redundantSemicolon/betweenSoftModifierKeywordAndDeclaration3.kt"); + } + @TestMetadata("companionBeforeFun.kt") public void testCompanionBeforeFun() throws Exception { runTest("idea/testData/inspectionsLocal/redundantSemicolon/companionBeforeFun.kt");