From 213aa9a86d043829c3838b99673615ceff340a1a Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 5 Dec 2018 15:28:09 +0300 Subject: [PATCH] New J2K: Add annotations for JKField --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 3 ++- .../kotlin/j2k/JavaToJKTreeBuilder.kt | 10 ++++++++++ .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 4 ++++ .../conversions/FieldToPropertyConversion.kt | 2 ++ .../conversions/JavaAnnotationsConversion.kt | 19 +++++++++++++++++++ .../org/jetbrains/kotlin/j2k/tree/impl/j.kt | 6 +++++- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 2 +- .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 2 ++ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt | 2 +- 9 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaAnnotationsConversion.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 27a00ded40e..13e33f3527e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -24,7 +24,8 @@ object ConversionsRunner { private fun createRootConversion(context: ConversionContext) = batchPipe { //Java --> Kotlin conversions - +JavaModifiersConversion() + +JavaModifiersConversion(context) + +JavaAnnotationsConversion() +InternalClassConversion(context) +ModalityConversion(context) +AssignmentAsExpressionToAlsoConversion(context) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index a2311ea5e1a..f5ec6f8be19 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -372,6 +372,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { with(expressionTreeMapper) { typeElement?.toJK() } ?: JKTypeElementImpl(JKNoTypeImpl), JKNameIdentifierImpl(name), with(expressionTreeMapper) { initializer.toJK() }, + JKAnnotationListImpl(annotations.map { it.toJK() }), modifiers(), visibility(), modality(), @@ -382,6 +383,15 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { } } + fun PsiAnnotation.toJK(): JKAnnotation = + JKAnnotationImpl( + symbolProvider.provideSymbol(nameReferenceElement!!), + with(expressionTreeMapper) { + JKExpressionListImpl(parameterList.attributes.map { (it.value as? PsiExpression).toJK() }) + } + ) + + fun PsiMethod.toJK(): JKJavaMethod { return JKJavaMethodImpl( with(expressionTreeMapper) { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 800dbbd77b3..6c635e7dd11 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -220,6 +220,10 @@ class NewCodeBuilder { override fun visitKtProperty(ktProperty: JKKtProperty) { + ktProperty.annotationList.accept(this) + if (ktProperty.annotationList.annotations.isNotEmpty()) { + printer.println() + } renderModifiersList(ktProperty) printer.printWithNoIndent(" ") diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt index 9586e7345c5..c4dbd3f14f5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt @@ -45,6 +45,7 @@ class FieldToPropertyConversion(private val context: ConversionContext) : Recurs JKTypeElementImpl(it.returnType.type), JKNameIdentifierImpl(propertyNameFromGet(it)!!), JKStubExpressionImpl(), + JKAnnotationListImpl(), emptyList(), Visibility.PRIVATE, Modality.OPEN, @@ -104,6 +105,7 @@ class FieldToPropertyConversion(private val context: ConversionContext) : Recurs propertyField.initializer, ktGetter, ktSetter, + propertyField.annotationList, propertyField.extraModifiers, visibility, propertyField.modality, diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaAnnotationsConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaAnnotationsConversion.kt new file mode 100644 index 00000000000..64df0dfbc7a --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaAnnotationsConversion.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.conversions + +import org.jetbrains.kotlin.j2k.tree.* +import org.jetbrains.kotlin.j2k.tree.impl.JKKtLiteralExpressionImpl + +class JavaAnnotationsConversion : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKAnnotation) return recurse(element) + if (element.classSymbol.name == "Deprecated" && element.arguments.expressions.isEmpty()) { + element.arguments.expressions += JKKtLiteralExpressionImpl("\"\"", JKLiteralExpression.LiteralType.STRING) + } + return recurse(element) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 6c81762eb2d..e9bc4cddcc4 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -28,7 +28,10 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType class JKJavaFieldImpl( - type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression, + type: JKTypeElement, + name: JKNameIdentifier, + initializer: JKExpression, + annotationList: JKAnnotationList, override var extraModifiers: List, override var visibility: Visibility, override var modality: Modality, @@ -37,6 +40,7 @@ class JKJavaFieldImpl( JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaField(this, data) + override var annotationList: JKAnnotationList by child(annotationList) override var initializer: JKExpression by child(initializer) override var type by child(type) override var name: JKNameIdentifier by child(name) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index 286e4e4396d..615ff820c8f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -501,7 +501,7 @@ class JKAnnotationListImpl(annotations: List = emptyList()) : JKAn class JKAnnotationImpl( override val classSymbol: JKClassSymbol, - arguments: JKExpressionList + arguments: JKExpressionList = JKExpressionListImpl() ) : JKAnnotation, JKBranchElementBase() { override var arguments: JKExpressionList by child(arguments) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitAnnotation(this, data) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index 2b04d01a188..7853c1c0ee5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -31,6 +31,7 @@ class JKKtPropertyImpl( initializer: JKExpression, getter: JKKtGetterOrSetter, setter: JKKtGetterOrSetter, + annotationList: JKAnnotationList, override var extraModifiers: List, override var visibility: Visibility, override var modality: Modality, @@ -38,6 +39,7 @@ class JKKtPropertyImpl( ) : JKBranchElementBase(), JKKtProperty { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtProperty(this, data) + override var annotationList: JKAnnotationList by child(annotationList) override var type by child(type) override var name: JKNameIdentifier by child(name) override var initializer: JKExpression by child(initializer) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index a23ab30523f..56801e3078f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.j2k.tree import org.jetbrains.kotlin.idea.search.usagesSearch.constructor import org.jetbrains.kotlin.j2k.tree.impl.* -interface JKField : JKVariable, JKVisibilityOwner, JKMutabilityOwner, JKModalityOwner, JKExtraModifiersOwner +interface JKField : JKVariable, JKVisibilityOwner, JKMutabilityOwner, JKModalityOwner, JKExtraModifiersOwner, JKAnnotationListOwner interface JKJavaField : JKField, JKBranchElement