From 155cfcb1f89a62b046eb9a4985bed8628bd9a27a Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Wed, 12 Oct 2016 17:49:32 +0300 Subject: [PATCH] Fix for KT-6424 Remove "SuppressWarnings" and "//noinspection" on java to kotlin conversion --- .../kotlin/j2k/AnnotationConverter.kt | 4 ++-- .../org/jetbrains/kotlin/j2k/CodeBuilder.kt | 24 +++++++++++-------- .../annotations/suppressWarnings.java | 16 +++++++++++++ .../annotations/suppressWarnings.kt | 8 +++++++ .../comments/removeNoInspectionComment.java | 6 +++++ .../comments/removeNoInspectionComment.kt | 6 +++++ .../fieldsInitializedFromParamsAnnotations.kt | 4 +--- ...otlinConverterForWebDemoTestGenerated.java | 12 ++++++++++ ...otlinConverterSingleFileTestGenerated.java | 12 ++++++++++ 9 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 j2k/testData/fileOrElement/annotations/suppressWarnings.java create mode 100644 j2k/testData/fileOrElement/annotations/suppressWarnings.kt create mode 100644 j2k/testData/fileOrElement/comments/removeNoInspectionComment.java create mode 100644 j2k/testData/fileOrElement/comments/removeNoInspectionComment.kt diff --git a/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt index 4bbd734f02b..c7f9865ef12 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/AnnotationConverter.kt @@ -29,8 +29,8 @@ import java.lang.annotation.Target class AnnotationConverter(private val converter: Converter) { private val annotationsToRemove: Set = (NullableNotNullManager.getInstance(converter.project).notNulls - + NullableNotNullManager.getInstance(converter.project).nullables - + listOf(CommonClassNames.JAVA_LANG_OVERRIDE, ElementType::class.java.name)).toSet() + + NullableNotNullManager.getInstance(converter.project).nullables + + listOf(CommonClassNames.JAVA_LANG_OVERRIDE, ElementType::class.java.name, SuppressWarnings::class.java.name)).toSet() fun isImportNotRequired(fqName: FqName): Boolean { val nameAsString = fqName.asString() diff --git a/j2k/src/org/jetbrains/kotlin/j2k/CodeBuilder.kt b/j2k/src/org/jetbrains/kotlin/j2k/CodeBuilder.kt index 2f6e8e59c2c..b15054ff9d2 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/CodeBuilder.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/CodeBuilder.kt @@ -27,7 +27,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.psiUtil.isAncestor import java.util.* -fun CodeBuilder.buildList(generators: Collection<() -> T>, separator: String, prefix: String = "", suffix: String = ""): CodeBuilder { +fun CodeBuilder.buildList(generators: Collection<() -> T>, separator: String, prefix: String = "", suffix: String = ""): CodeBuilder { if (generators.isNotEmpty()) { append(prefix) var first = true @@ -51,6 +51,8 @@ fun CodeBuilder.append(elements: Collection, separator: String, prefix: class ElementCreationStackTraceRequiredException : RuntimeException() class CodeBuilder(private val topElement: PsiElement?, private var docConverter: DocCommentConverter) { + private val commentPatternsToDrop = listOf("^//[ ]*noinspection[ ]+[A-Za-z][A-Za-z0-9_]*([ ].*?)?$".toRegex()) + private val builder = StringBuilder() private var endOfLineCommentAtEnd = false @@ -78,7 +80,9 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: append(docConverter.convertDocComment(element)) } else { - append(element.text!!, CommentInfo(element, postInsert)) + if (element !is PsiComment || !commentPatternsToDrop.any { it.matches(element.text) }) { + append(element.text!!, CommentInfo(element, postInsert)) + } } } @@ -98,7 +102,7 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: if (commentInfo.isComment) { // Original comment was first in line, but there's no line break before the current one if (!commentInfo.isPostInsert && commentInfo.isFirstNonWhitespaceElementInLine && - !builder.takeLastWhile { it.isWhitespace() }.contains('\n')) { + !builder.takeLastWhile { it.isWhitespace() }.contains('\n')) { builder.append('\n') } @@ -165,7 +169,7 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: // scan for all comments inside which are not yet used in the text and put them here to not loose any comment from code for ((prototype, inheritance) in element.prototypes!!) { if (inheritance.commentsInside) { - prototype.accept(object : JavaRecursiveElementVisitor(){ + prototype.accept(object : JavaRecursiveElementVisitor() { override fun visitComment(comment: PsiComment) { if (comment !in notInsideElements && commentsAndSpacesUsed.add(comment)) { appendCommentOrWhiteSpace(comment, true) @@ -272,7 +276,7 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: collectCommentsAndSpacesBefore(prev) } } - else if (prev.isEmptyElement()){ + else if (prev.isEmptyElement()) { collectCommentsAndSpacesBefore(prev) } } @@ -294,7 +298,7 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: collectCommentsAndSpacesAfter(next) } } - else if (next.isEmptyElement()){ + else if (next.isEmptyElement()) { collectCommentsAndSpacesAfter(next) } } @@ -306,7 +310,7 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: private fun MutableList.collectCommentsAndSpacesAtStart(element: PsiElement): MutableList { var child = element.firstChild - while(child != null) { + while (child != null) { if (child.isCommentOrSpace()) { if (child !in commentsAndSpacesUsed) add(child) else break } @@ -321,7 +325,7 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: private fun MutableList.collectCommentsAndSpacesAtEnd(element: PsiElement): MutableList { var child = element.lastChild - while(child != null) { + while (child != null) { if (child.isCommentOrSpace()) { if (child !in commentsAndSpacesUsed) add(child) else break } @@ -335,7 +339,7 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: } private companion object { - operator fun List.plus(other: List): List { + operator fun List.plus(other: List): List { when { isEmpty() -> return other @@ -350,7 +354,7 @@ class CodeBuilder(private val topElement: PsiElement?, private var docConverter: } } - fun List.reversed(): List { + fun List.reversed(): List { return if (size <= 1) this else diff --git a/j2k/testData/fileOrElement/annotations/suppressWarnings.java b/j2k/testData/fileOrElement/annotations/suppressWarnings.java new file mode 100644 index 00000000000..dfa209ccf19 --- /dev/null +++ b/j2k/testData/fileOrElement/annotations/suppressWarnings.java @@ -0,0 +1,16 @@ +@SuppressWarnings("ALL") +public class A{ + + @SuppressWarnings("ALL") + public A(){ + + } + + @SuppressWarnings("ALL") + public int b = 0; + + @SuppressWarnings("ALL") + public void a(@SuppressWarnings("ALL") int i){ + + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/annotations/suppressWarnings.kt b/j2k/testData/fileOrElement/annotations/suppressWarnings.kt new file mode 100644 index 00000000000..b13499802ec --- /dev/null +++ b/j2k/testData/fileOrElement/annotations/suppressWarnings.kt @@ -0,0 +1,8 @@ +class A { + + var b = 0 + + fun a(i: Int) { + + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/comments/removeNoInspectionComment.java b/j2k/testData/fileOrElement/comments/removeNoInspectionComment.java new file mode 100644 index 00000000000..04cbc4223e5 --- /dev/null +++ b/j2k/testData/fileOrElement/comments/removeNoInspectionComment.java @@ -0,0 +1,6 @@ +public class Check { + public void a() { + //noinspection RedundantStringConstructorCall + Integer d = (Integer) (Object)(new String()); + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/comments/removeNoInspectionComment.kt b/j2k/testData/fileOrElement/comments/removeNoInspectionComment.kt new file mode 100644 index 00000000000..c83ebf5e314 --- /dev/null +++ b/j2k/testData/fileOrElement/comments/removeNoInspectionComment.kt @@ -0,0 +1,6 @@ +class Check { + fun a() { + + val d = String() as Int + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParamsAnnotations.kt b/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParamsAnnotations.kt index e8cce015662..29341fe0a63 100644 --- a/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParamsAnnotations.kt +++ b/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParamsAnnotations.kt @@ -1,3 +1 @@ -import java.lang.SuppressWarnings - -internal class C(@Deprecated("") private val p1: Int, @Deprecated("") private val myP2: Int, @Deprecated("") @SuppressWarnings("x") var p3: Int) +internal class C(@Deprecated("") private val p1: Int, @Deprecated("") private val myP2: Int, @Deprecated("") var p3: Int) diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index e990c3f6299..a8103154d58 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -126,6 +126,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/annotations/serialVersionUID.java"); doTest(fileName); } + + @TestMetadata("suppressWarnings.java") + public void testSuppressWarnings() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/annotations/suppressWarnings.java"); + doTest(fileName); + } } @TestMetadata("j2k/testData/fileOrElement/anonymousBlock") @@ -1047,6 +1053,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/comments/fieldsInitializedFromParams.java"); doTest(fileName); } + + @TestMetadata("removeNoInspectionComment.java") + public void testRemoveNoInspectionComment() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/comments/removeNoInspectionComment.java"); + doTest(fileName); + } } @TestMetadata("j2k/testData/fileOrElement/conditionalExpression") diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index c8b8bd8053c..a22e98f7731 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -126,6 +126,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/annotations/serialVersionUID.java"); doTest(fileName); } + + @TestMetadata("suppressWarnings.java") + public void testSuppressWarnings() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/annotations/suppressWarnings.java"); + doTest(fileName); + } } @TestMetadata("j2k/testData/fileOrElement/anonymousBlock") @@ -1047,6 +1053,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/comments/fieldsInitializedFromParams.java"); doTest(fileName); } + + @TestMetadata("removeNoInspectionComment.java") + public void testRemoveNoInspectionComment() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/comments/removeNoInspectionComment.java"); + doTest(fileName); + } } @TestMetadata("j2k/testData/fileOrElement/conditionalExpression")