New J2K: Split ModifiersList to visibilityModifier, modalityModifier, mutabilityModifier and extraModifiers & introduce JKVariable which may have any subset of modifiers

This commit is contained in:
Ilya Kirillov
2018-11-26 14:45:26 +03:00
committed by Ilya Kirillov
parent 5c6092c98c
commit 69633e7a0f
35 changed files with 475 additions and 555 deletions
@@ -23,15 +23,17 @@ object ConversionsRunner {
private fun createRootConversion(context: ConversionContext) = private fun createRootConversion(context: ConversionContext) =
batchPipe { batchPipe {
+JavaModifiersConversion()
+InternalClassConversion(context)
+ModalityConversion(context)
+OperatorExpressionConversion(context) +OperatorExpressionConversion(context)
+ThrowStatementConversion() +ThrowStatementConversion()
+ArrayInitializerConversion(context) +ArrayInitializerConversion(context)
+TryStatementConversion(context) +TryStatementConversion(context)
+ModalityConversion(context)
+ImplicitInitializerConversion() +ImplicitInitializerConversion()
+DefaultArgumentsConversion(context) +DefaultArgumentsConversion(context)
+TypeMappingConversion(context) +TypeMappingConversion(context)
+FieldToPropertyConversion() +FieldToPropertyConversion(context)
+PrintlnConversion(context) +PrintlnConversion(context)
+BlockToRunConversion(context) +BlockToRunConversion(context)
+AssignmentAsExpressionToAlsoConversion(context) +AssignmentAsExpressionToAlsoConversion(context)
@@ -43,12 +45,11 @@ object ConversionsRunner {
+PrimaryConstructorDetectConversion(context) +PrimaryConstructorDetectConversion(context)
+InsertDefaultPrimaryConstructorConversion(context) +InsertDefaultPrimaryConstructorConversion(context)
+FieldInitializersInPrimaryFromParamsConversion(context) +FieldInitializersInPrimaryFromParamsConversion(context)
+JavaMethodToKotlinFunctionConversion() +JavaMethodToKotlinFunctionConversion(context)
+MainFunctionConversion() +MainFunctionConversion(context)
+LiteralConversion() +LiteralConversion()
+AssertStatementConversion(context) +AssertStatementConversion(context)
+InnerClassConversion() +InnerClassConversion()
+ModifiersConversion(context)
+StaticsToCompanionExtractConversion() +StaticsToCompanionExtractConversion()
+ClassToObjectPromotionConversion(context) +ClassToObjectPromotionConversion(context)
+PolyadicExpressionConversion() +PolyadicExpressionConversion()
@@ -7,10 +7,7 @@ package org.jetbrains.kotlin.j2k
import com.intellij.psi.* import com.intellij.psi.*
import org.jetbrains.kotlin.j2k.conversions.resolveFqName import org.jetbrains.kotlin.j2k.conversions.resolveFqName
import org.jetbrains.kotlin.j2k.tree.JKClass import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKDeclaration
import org.jetbrains.kotlin.j2k.tree.JKField
import org.jetbrains.kotlin.j2k.tree.JKMethod
import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -53,7 +50,7 @@ class JKSymbolProvider {
fun provideUniverseSymbol(psi: PsiElement, jk: JKDeclaration): JKSymbol = provideUniverseSymbol(psi).also { fun provideUniverseSymbol(psi: PsiElement, jk: JKDeclaration): JKSymbol = provideUniverseSymbol(psi).also {
when (it) { when (it) {
is JKUniverseClassSymbol -> it.target = jk as JKClass is JKUniverseClassSymbol -> it.target = jk as JKClass
is JKUniverseFieldSymbol -> it.target = jk as JKField is JKUniverseFieldSymbol -> it.target = jk as JKVariable
is JKUniverseMethodSymbol -> it.target = jk as JKMethod is JKUniverseMethodSymbol -> it.target = jk as JKMethod
} }
symbolsByJK[jk] = it symbolsByJK[jk] = it
@@ -78,7 +75,7 @@ class JKSymbolProvider {
JKUniverseClassSymbol().also { it.target = jk } JKUniverseClassSymbol().also { it.target = jk }
} as JKClassSymbol } as JKClassSymbol
fun provideUniverseSymbol(jk: JKField): JKFieldSymbol = symbolsByJK.getOrPut(jk) { fun provideUniverseSymbol(jk: JKVariable): JKFieldSymbol = symbolsByJK.getOrPut(jk) {
JKUniverseFieldSymbol().also { it.target = jk } JKUniverseFieldSymbol().also { it.target = jk }
} as JKFieldSymbol } as JKFieldSymbol
@@ -21,11 +21,7 @@ import com.intellij.psi.*
import com.intellij.psi.JavaTokenType.SUPER_KEYWORD import com.intellij.psi.JavaTokenType.SUPER_KEYWORD
import com.intellij.psi.JavaTokenType.THIS_KEYWORD import com.intellij.psi.JavaTokenType.THIS_KEYWORD
import com.intellij.psi.impl.source.tree.ChildRole import com.intellij.psi.impl.source.tree.ChildRole
import com.intellij.psi.impl.source.tree.java.PsiLabeledStatementImpl import com.intellij.psi.impl.source.tree.java.*
import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiNewExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
import org.jetbrains.kotlin.j2k.ast.Mutability
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.* import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
@@ -39,8 +35,6 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
private val declarationMapper = DeclarationMapper(expressionTreeMapper) private val declarationMapper = DeclarationMapper(expressionTreeMapper)
private val modifierMapper = ModifierMapper()
private inner class ExpressionTreeMapper { private inner class ExpressionTreeMapper {
fun PsiExpression?.toJK(): JKExpression { fun PsiExpression?.toJK(): JKExpression {
return when (this) { return when (this) {
@@ -264,12 +258,14 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
val implTypes = this.implementsList?.mapTypes().orEmpty() val implTypes = this.implementsList?.mapTypes().orEmpty()
val extTypes = this.extendsList?.mapTypes().orEmpty() val extTypes = this.extendsList?.mapTypes().orEmpty()
return JKClassImpl( return JKClassImpl(
with(modifierMapper) { modifierList.toJK() },
JKNameIdentifierImpl(name!!), JKNameIdentifierImpl(name!!),
JKInheritanceInfoImpl(extTypes + implTypes), JKInheritanceInfoImpl(extTypes + implTypes),
classKind, classKind,
typeParameterList?.toJK() ?: JKTypeParameterListImpl(), typeParameterList?.toJK() ?: JKTypeParameterListImpl(),
createClassBody() createClassBody(),
modifiers(),
visibility(),
modality()
).also { jkClassImpl -> ).also { jkClassImpl ->
jkClassImpl.psi = this jkClassImpl.psi = this
symbolProvider.provideUniverseSymbol(this, jkClassImpl) symbolProvider.provideUniverseSymbol(this, jkClassImpl)
@@ -292,12 +288,58 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
with(modifierMapper) { modifierList.toJK() } with(modifierMapper) { modifierList.toJK() }
) )
fun PsiMember.modality() =
when {
modifierList == null -> Modality.OPEN
hasModifierProperty(PsiModifier.FINAL) -> Modality.FINAL
hasModifierProperty(PsiModifier.ABSTRACT) -> Modality.ABSTRACT
else -> Modality.OPEN
}
fun PsiMember.visibility() =
when {
modifierList == null -> Visibility.PACKAGE_PRIVATE
hasModifierProperty(PsiModifier.PACKAGE_LOCAL) -> Visibility.PACKAGE_PRIVATE
hasModifierProperty(PsiModifier.PRIVATE) -> Visibility.PRIVATE
hasModifierProperty(PsiModifier.PROTECTED) -> Visibility.PROTECTED
hasModifierProperty(PsiModifier.PUBLIC) -> Visibility.PUBLIC
else -> Visibility.PACKAGE_PRIVATE
}
fun PsiMember.modifiers() =
if (modifierList == null) emptyList()
else
PsiModifier.MODIFIERS
.filter { this.modifierList!!.hasExplicitModifier(it) }
.mapNotNull {
when (it) {
PsiModifier.NATIVE -> ExtraModifier.NATIVE
PsiModifier.STATIC -> ExtraModifier.STATIC
PsiModifier.STRICTFP -> ExtraModifier.STRICTFP
PsiModifier.SYNCHRONIZED -> ExtraModifier.SYNCHRONIZED
PsiModifier.TRANSIENT -> ExtraModifier.TRANSIENT
PsiModifier.VOLATILE -> ExtraModifier.VOLATILE
PsiModifier.PROTECTED -> null
PsiModifier.PUBLIC -> null
PsiModifier.PRIVATE -> null
PsiModifier.FINAL -> null
PsiModifier.ABSTRACT -> null
else -> TODO("Not yet supported")
}
}
fun PsiField.toJK(): JKJavaField { fun PsiField.toJK(): JKJavaField {
return JKJavaFieldImpl( return JKJavaFieldImpl(
with(modifierMapper) { modifierList.toJK(finalAsMutability = true) },
with(expressionTreeMapper) { typeElement?.toJK() } ?: JKTypeElementImpl(JKNoTypeImpl), with(expressionTreeMapper) { typeElement?.toJK() } ?: JKTypeElementImpl(JKNoTypeImpl),
JKNameIdentifierImpl(name), JKNameIdentifierImpl(name),
with(expressionTreeMapper) { initializer.toJK() } with(expressionTreeMapper) { initializer.toJK() },
modifiers(),
visibility(),
modality(),
Mutability.UNKNOWN
).also { ).also {
symbolProvider.provideUniverseSymbol(this, it) symbolProvider.provideUniverseSymbol(this, it)
it.psi = this it.psi = this
@@ -306,7 +348,6 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
fun PsiMethod.toJK(): JKJavaMethod { fun PsiMethod.toJK(): JKJavaMethod {
return JKJavaMethodImpl( return JKJavaMethodImpl(
with(modifierMapper) { modifierList.toJK() },
with(expressionTreeMapper) { with(expressionTreeMapper) {
returnTypeElement?.toJK() returnTypeElement?.toJK()
?: JKTypeElementImpl(JKJavaVoidType).takeIf { isConstructor } ?: JKTypeElementImpl(JKJavaVoidType).takeIf { isConstructor }
@@ -316,7 +357,11 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
parameterList.parameters.map { it.toJK() }, parameterList.parameters.map { it.toJK() },
body?.toJK() ?: JKBodyStub, body?.toJK() ?: JKBodyStub,
typeParameterList?.toJK() ?: JKTypeParameterListImpl(), typeParameterList?.toJK() ?: JKTypeParameterListImpl(),
JKAnnotationListImpl()//TODO get real annotations JKAnnotationListImpl(),//TODO get real annotations
throwsList.referencedTypes.map { JKTypeElementImpl(it.toJK(symbolProvider)) },
modifiers(),
visibility(),
modality()
).also { ).also {
it.psi = this it.psi = this
symbolProvider.provideUniverseSymbol(this, it) symbolProvider.provideUniverseSymbol(this, it)
@@ -331,9 +376,10 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
} }
fun PsiParameter.toJK(): JKParameter { fun PsiParameter.toJK(): JKParameter {
return JKParameterImpl(with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(), return JKParameterImpl(
JKNameIdentifierImpl(name!!), with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(),
with(modifierMapper) { modifierList.toJK() }).also { JKNameIdentifierImpl(name!!)
).also {
symbolProvider.provideUniverseSymbol(this, it) symbolProvider.provideUniverseSymbol(this, it)
it.psi = this it.psi = this
} }
@@ -353,10 +399,10 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
fun PsiLocalVariable.toJK(): JKLocalVariable = fun PsiLocalVariable.toJK(): JKLocalVariable =
JKLocalVariableImpl( JKLocalVariableImpl(
with(modifierMapper) { modifierList.toJK() },
with(expressionTreeMapper) { typeElement.toJK() }, with(expressionTreeMapper) { typeElement.toJK() },
JKNameIdentifierImpl(this.name ?: TODO()), JKNameIdentifierImpl(this.name ?: TODO()),
with(expressionTreeMapper) { initializer.toJK() } with(expressionTreeMapper) { initializer.toJK() },
Mutability.UNKNOWN
).also { i -> ).also { i ->
symbolProvider.provideUniverseSymbol(this, i) symbolProvider.provideUniverseSymbol(this, i)
i.psi = this i.psi = this
@@ -456,64 +502,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
}.last() }.last()
private inner class ModifierMapper { private inner class ElementVisitor : JavaElementVisitor() {
fun PsiModifierList?.toJK(finalAsMutability: Boolean = false): JKModifierList {
val modifiers = if (this == null) mutableListOf()
else PsiModifier.MODIFIERS.filter { hasExplicitModifier(it) }.mapNotNull { modifierToJK(it, finalAsMutability) }.toMutableList()
modifiers += extractAccess()
modifiers += extractModality()
return JKModifierListImpl(
modifiers
)
}
fun PsiModifierList?.extractModality(): JKModalityModifier {
val modality = when {
this == null -> JKModalityModifier.Modality.OPEN
hasModifierProperty(PsiModifier.FINAL) -> JKModalityModifier.Modality.FINAL
hasModifierProperty(PsiModifier.ABSTRACT) -> JKModalityModifier.Modality.ABSTRACT
else -> JKModalityModifier.Modality.OPEN
}
return JKModalityModifierImpl(modality)
}
fun PsiModifierList?.extractAccess(): JKAccessModifier {
val visibility = when {
this == null -> JKAccessModifier.Visibility.PACKAGE_PRIVATE
hasModifierProperty(PsiModifier.PACKAGE_LOCAL) -> JKAccessModifier.Visibility.PACKAGE_PRIVATE
hasModifierProperty(PsiModifier.PRIVATE) -> JKAccessModifier.Visibility.PRIVATE
hasModifierProperty(PsiModifier.PROTECTED) -> JKAccessModifier.Visibility.PROTECTED
hasModifierProperty(PsiModifier.PUBLIC) -> JKAccessModifier.Visibility.PUBLIC
else -> JKAccessModifier.Visibility.PACKAGE_PRIVATE
}
return JKAccessModifierImpl(visibility)
}
fun modifierToJK(name: String, finalAsMutability: Boolean): JKModifier? = when (name) {
PsiModifier.NATIVE -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.NATIVE)
PsiModifier.STATIC -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STATIC)
PsiModifier.STRICTFP -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.STRICTFP)
PsiModifier.SYNCHRONIZED -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.SYNCHRONIZED)
PsiModifier.TRANSIENT -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.TRANSIENT)
PsiModifier.VOLATILE -> JKJavaModifierImpl(JKJavaModifier.JavaModifierType.VOLATILE)
PsiModifier.PROTECTED -> null
PsiModifier.PUBLIC -> null
PsiModifier.PRIVATE -> null
PsiModifier.FINAL -> if (finalAsMutability) JKMutabilityModifierImpl(Mutability.NonMutable) else null
PsiModifier.ABSTRACT -> null
else -> TODO("Not yet supported")
}
}
private inner class ElementVisitor : JavaElementVisitor() {
var resultElement: JKTreeElement? = null var resultElement: JKTreeElement? = null
@@ -149,62 +149,12 @@ class NewCodeBuilder {
breakWithLabelStatement.label.accept(this) breakWithLabelStatement.label.accept(this)
} }
override fun visitModifierList(modifierList: JKModifierList) { private fun renderModifiersList(modifiersList: JKModifiersListOwner) {
modifierList.modifiers.firstOrNull()?.accept(this) renderList(modifiersList.modifiers(), " ") {
for (i in 1..modifierList.modifiers.lastIndex) { printer.printWithNoIndent(it.text)
printer.printWithNoIndent(" ")
modifierList.modifiers[i].accept(this)
} }
} }
override fun visitAccessModifier(accessModifier: JKAccessModifier) {
printer.printWithNoIndent(
when (accessModifier.visibility) {
JKAccessModifier.Visibility.PUBLIC -> "public"
JKAccessModifier.Visibility.INTERNAL -> "internal"
JKAccessModifier.Visibility.PACKAGE_PRIVATE -> ""
// JKAccessModifier.Visibility.PACKAGE_PRIVATE -> "internal /* package_local! */"
JKAccessModifier.Visibility.PROTECTED -> "protected"
JKAccessModifier.Visibility.PRIVATE -> "private"
}
)
}
override fun visitModalityModifier(modalityModifier: JKModalityModifier) {
val containingDeclaration = modalityModifier.parent?.parent
//TODO: merge with bottom one
if (modalityModifier.modality == JKModalityModifier.Modality.ABSTRACT && containingDeclaration is JKClass) {
if (containingDeclaration.classKind != JKClass.ClassKind.CLASS) return
}
printer.printWithNoIndent(
when (modalityModifier.modality) {
JKModalityModifier.Modality.OPEN -> "open"
JKModalityModifier.Modality.FINAL -> "final"
JKModalityModifier.Modality.ABSTRACT -> "abstract"
JKModalityModifier.Modality.OVERRIDE -> "override"
}
)
}
override fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier) {
if (mutabilityModifier.mutability == Mutability.NonMutable) printer.print("val")
else printer.print("var")
}
override fun visitKtModifier(ktModifier: JKKtModifier) {
printer.printWithNoIndent(
when (ktModifier.type) {
JKKtModifier.KtModifierType.ABSTRACT -> "abstract"
JKKtModifier.KtModifierType.INNER -> "inner"
JKKtModifier.KtModifierType.OPEN -> "open"
JKKtModifier.KtModifierType.PRIVATE -> "private"
JKKtModifier.KtModifierType.PROTECTED -> "protected"
else -> ktModifier.type.toString()
}
)
}
private inline fun <T> renderList(list: List<T>, separator: String = ", ", renderElement: (T) -> Unit) = private inline fun <T> renderList(list: List<T>, separator: String = ", ", renderElement: (T) -> Unit) =
renderList(list, { printer.printWithNoIndent(separator) }, renderElement) renderList(list, { printer.printWithNoIndent(separator) }, renderElement)
@@ -218,7 +168,7 @@ class NewCodeBuilder {
} }
override fun visitClass(klass: JKClass) { override fun visitClass(klass: JKClass) {
klass.modifierList.accept(this) renderModifiersList(klass)
builder.append(" ") builder.append(" ")
printer.print(classKindString(klass.classKind)) printer.print(classKindString(klass.classKind))
builder.append(" ") builder.append(" ")
@@ -264,7 +214,7 @@ class NewCodeBuilder {
override fun visitKtProperty(ktProperty: JKKtProperty) { override fun visitKtProperty(ktProperty: JKKtProperty) {
ktProperty.modifierList.accept(this) renderModifiersList(ktProperty)
printer.printWithNoIndent(" ") printer.printWithNoIndent(" ")
ktProperty.name.accept(this) ktProperty.name.accept(this)
@@ -310,9 +260,8 @@ class NewCodeBuilder {
ktIsExpression.type.accept(this) ktIsExpression.type.accept(this)
} }
override fun visitParameter(parameter: JKParameter) { override fun visitParameter(parameter: JKParameter) {
parameter.modifierList.accept(this) renderModifiersList(parameter)
printer.printWithNoIndent(" ") printer.printWithNoIndent(" ")
parameter.name.accept(this) parameter.name.accept(this)
if (parameter.type.present() && parameter.type.type !is JKContextType) { if (parameter.type.present() && parameter.type.type !is JKContextType) {
@@ -325,13 +274,21 @@ class NewCodeBuilder {
} }
} }
override fun visitForLoopVariable(forLoopVariable: JKForLoopVariable) {
forLoopVariable.name.accept(this)
if (forLoopVariable.type.present() && forLoopVariable.type.type !is JKContextType) {
printer.printWithNoIndent(": ")
forLoopVariable.type.accept(this)
}
}
override fun visitKtFunction(ktFunction: JKKtFunction) { override fun visitKtFunction(ktFunction: JKKtFunction) {
printer.printIndent() printer.printIndent()
if (ktFunction.annotationList.annotations.isNotEmpty()) { if (ktFunction.annotationList.annotations.isNotEmpty()) {
ktFunction.annotationList.accept(this) ktFunction.annotationList.accept(this)
printer.printlnWithNoIndent(" ") printer.printlnWithNoIndent(" ")
} }
ktFunction.modifierList.accept(this) renderModifiersList(ktFunction)
printer.printWithNoIndent(" fun ") printer.printWithNoIndent(" fun ")
ktFunction.typeParameterList.accept(this) ktFunction.typeParameterList.accept(this)
ktFunction.name.accept(this) ktFunction.name.accept(this)
@@ -391,7 +348,7 @@ class NewCodeBuilder {
override fun visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter) { override fun visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter) {
printer.indented { printer.indented {
ktGetterOrSetter.modifierList.accept(this) renderModifiersList(ktGetterOrSetter)
printer.printWithNoIndent(" ") printer.printWithNoIndent(" ")
when (ktGetterOrSetter.kind) { when (ktGetterOrSetter.kind) {
JKKtGetterOrSetter.Kind.GETTER -> printer.printWithNoIndent("get") JKKtGetterOrSetter.Kind.GETTER -> printer.printWithNoIndent("get")
@@ -554,14 +511,14 @@ class NewCodeBuilder {
} }
override fun visitLocalVariable(localVariable: JKLocalVariable) { override fun visitLocalVariable(localVariable: JKLocalVariable) {
if (localVariable.parent !is JKForInStatement) { // if (localVariable.parent !is JKForInStatement) {
if (localVariable.modifierList.modality == JKModalityModifier.Modality.FINAL) { // if (localVariable.modifierList.modality == JKModifierTokens.FINAL) {
printer.print("val") // printer.print("val")
} else { // } else {
printer.print("var") // printer.print("var")
} // }
} // }
renderModifiersList(localVariable)
printer.printWithNoIndent(" ") printer.printWithNoIndent(" ")
localVariable.name.accept(this) localVariable.name.accept(this)
if (localVariable.type.present() && localVariable.type.type != JKContextType) { if (localVariable.type.present() && localVariable.type.type != JKContextType) {
@@ -692,7 +649,7 @@ class NewCodeBuilder {
} }
override fun visitKtConstructor(ktConstructor: JKKtConstructor) { override fun visitKtConstructor(ktConstructor: JKKtConstructor) {
ktConstructor.modifierList.accept(this) renderModifiersList(ktConstructor)
printer.print(" constructor") printer.print(" constructor")
renderParameterList(ktConstructor.parameters) renderParameterList(ktConstructor.parameters)
if (ktConstructor.delegationCall !is JKStubExpression) { if (ktConstructor.delegationCall !is JKStubExpression) {
@@ -707,14 +664,8 @@ class NewCodeBuilder {
} }
override fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor) { override fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor) {
val hasInitDeclaration = renderModifiersList(ktPrimaryConstructor)
(ktPrimaryConstructor.parent as JKClassBody).declarations.any { it is JKKtInitDeclaration } printer.printWithNoIndent(" constructor ")
val hasAccessModifier =
ktPrimaryConstructor.modifierList.modifiers.any { it is JKAccessModifier }
if (hasAccessModifier && hasInitDeclaration && ktPrimaryConstructor.parameters.isNotEmpty()) {
ktPrimaryConstructor.modifierList.accept(this)
printer.printWithNoIndent(" constructor ")
}
if (ktPrimaryConstructor.parameters.isNotEmpty()) { if (ktPrimaryConstructor.parameters.isNotEmpty()) {
renderParameterList(ktPrimaryConstructor.parameters) renderParameterList(ktPrimaryConstructor.parameters)
} }
@@ -24,17 +24,17 @@ class AssignmentStatementValCreationConversion(val context: ConversionContext) :
JKDeclarationStatementImpl( JKDeclarationStatementImpl(
listOf( listOf(
JKLocalVariableImpl( JKLocalVariableImpl(
JKModifierListImpl(JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)),
JKTypeElementImpl(JKJavaVoidType/*TODO*/), JKTypeElementImpl(JKJavaVoidType/*TODO*/),
JKNameIdentifierImpl("arr"), JKNameIdentifierImpl("arr"),
ex1 ex1,
Mutability.IMMUTABLE
).also { ).also {
assignableExpr.expression = JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it)) assignableExpr.expression = JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it))
}, JKLocalVariableImpl( }, JKLocalVariableImpl(
JKModifierListImpl(JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)),
JKTypeElementImpl(JKJavaVoidType/*TODO*/), JKTypeElementImpl(JKJavaVoidType/*TODO*/),
JKNameIdentifierImpl("i"), JKNameIdentifierImpl("i"),
ex2 ex2,
Mutability.UNKNOWN
).also { ).also {
assignableExpr.indexExpression = assignableExpr.indexExpression =
JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it)) JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it))
@@ -50,10 +50,10 @@ class AssignmentStatementValCreationConversion(val context: ConversionContext) :
JKDeclarationStatementImpl( JKDeclarationStatementImpl(
listOf( listOf(
JKLocalVariableImpl( JKLocalVariableImpl(
JKModifierListImpl(JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)),
JKTypeElementImpl(JKJavaVoidType/*TODO*/), JKTypeElementImpl(JKJavaVoidType/*TODO*/),
JKNameIdentifierImpl("arg"), JKNameIdentifierImpl("arg"),
ex ex,
Mutability.UNKNOWN
).also { ).also {
assignableExpr.receiver = JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it)) assignableExpr.receiver = JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it))
} }
@@ -6,12 +6,8 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.JKClass import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKKtPrimaryConstructor import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.declarationList
import org.jetbrains.kotlin.j2k.tree.impl.JKClassImpl
import org.jetbrains.kotlin.j2k.tree.impl.psi
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
class ClassToObjectPromotionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ClassToObjectPromotionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
@@ -35,12 +31,16 @@ class ClassToObjectPromotionConversion(private val context: ConversionContext) :
element.invalidate() element.invalidate()
return recurse( return recurse(
JKClassImpl( JKClassImpl(
element.modifierList,
element.name, element.name,
element.inheritance, element.inheritance,
JKClass.ClassKind.OBJECT, JKClass.ClassKind.OBJECT,
element.typeParameterList, element.typeParameterList,
companion.classBody companion.classBody.also {
it.handleDeclarationsModifiers()
},
element.extraModifiers,
element.visibility,
Modality.FINAL
) )
) )
} }
@@ -49,6 +49,16 @@ class ClassToObjectPromotionConversion(private val context: ConversionContext) :
return recurse(element) return recurse(element)
} }
private fun JKClassBody.handleDeclarationsModifiers() {
for (declaration in declarations) {
if (declaration !is JKVisibilityOwner) continue
if (declaration.visibility == Visibility.PROTECTED) {
//in old j2k it is internal. should it be private instead?
declaration.visibility = Visibility.INTERNAL
}
}
}
private fun JKClass.hasInheritors() = private fun JKClass.hasInheritors() =
context.converter.converterServices.oldServices.referenceSearcher.hasInheritors(psi()!!) context.converter.converterServices.oldServices.referenceSearcher.hasInheritors(psi()!!)
} }
@@ -18,10 +18,17 @@ class ConstructorConversion(private val context: ConversionContext) : RecursiveA
element.invalidate() element.invalidate()
val delegationCall = lookupDelegationCall(element.block) ?: JKStubExpressionImpl() val delegationCall = lookupDelegationCall(element.block) ?: JKStubExpressionImpl()
return JKKtConstructorImpl(element.name, element.parameters, element.block, element.modifierList, delegationCall) return JKKtConstructorImpl(
.also { element.name,
context.symbolProvider.transferSymbol(it, element) element.parameters,
} element.block,
delegationCall,
element.extraModifiers,
element.visibility,
element.modality
).also {
context.symbolProvider.transferSymbol(it, element)
}
} }
private fun lookupDelegationCall(block: JKBlock): JKDelegationConstructorCall? { private fun lookupDelegationCall(block: JKBlock): JKDelegationConstructorCall? {
@@ -40,10 +40,10 @@ class FieldInitializersInPrimaryFromParamsConversion(private val context: Conver
(assignmentExpression.expression as? JKFieldAccessExpression)?.identifier?.target as? JKParameter ?: continue (assignmentExpression.expression as? JKFieldAccessExpression)?.identifier?.target as? JKParameter ?: continue
if (element.parameters.contains(parameter)) { if (element.parameters.contains(parameter)) {
val fieldDeclaration = containingClass.declarationList.find { val fieldDeclaration = containingClass.declarationList.find {
(it as? JKField)?.name?.value == fieldTarget.name.value (it as? JKVariable)?.name?.value == fieldTarget.name.value
} as? JKField ?: continue } as? JKVariable ?: continue
if (!fieldDeclaration.type.type.equalsByName(parameter.type.type)) continue//TODO better way to compare types?? if (!fieldDeclaration.type.type.equalsByName(parameter.type.type)) continue//TODO better way to compare types??
parameter.modifierList = fieldDeclaration::modifierList.detached() // parameter.modifierList = fieldDeclaration::modifierList.detached()
declarationsToRemove += fieldDeclaration declarationsToRemove += fieldDeclaration
if (parameter.name.value != fieldTarget.name.value) { if (parameter.name.value != fieldTarget.name.value) {
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.ast.Mutability
import org.jetbrains.kotlin.j2k.copyTreeAndDetach
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
@@ -44,10 +42,13 @@ class FieldToPropertyConversion(private val context: ConversionContext) : Recurs
?.takeIf { propertyNameFromGet(it) != null } ?.takeIf { propertyNameFromGet(it) != null }
?.let { ?.let {
JKJavaFieldImpl( JKJavaFieldImpl(
JKModifierListImpl(),
JKTypeElementImpl(it.returnType.type), JKTypeElementImpl(it.returnType.type),
JKNameIdentifierImpl(propertyNameFromGet(it)!!), JKNameIdentifierImpl(propertyNameFromGet(it)!!),
JKStubExpressionImpl() JKStubExpressionImpl(),
emptyList(),
Visibility.PRIVATE,
Modality.OPEN,
Mutability.UNKNOWN
) )
} }
?: return null ?: return null
@@ -58,13 +59,13 @@ class FieldToPropertyConversion(private val context: ConversionContext) : Recurs
JKKtGetterOrSetterImpl( JKKtGetterOrSetterImpl(
JKBlockStatementImpl(block) JKBlockStatementImpl(block)
.renamed(propertyField.name.value, "field", propertyField.type.type, RenameType.RENAME_FIELD_ACCESS), .renamed(propertyField.name.value, "field", propertyField.type.type, RenameType.RENAME_FIELD_ACCESS),
JKModifierListImpl(JKAccessModifierImpl(method.modifierList.visibility)), JKKtGetterOrSetter.Kind.GETTER,
JKKtGetterOrSetter.Kind.GETTER method.visibility
) )
} ?: JKKtGetterOrSetterImpl( } ?: JKKtGetterOrSetterImpl(
JKBlockStatementImpl(JKBodyStub), JKBlockStatementImpl(JKBodyStub),
JKModifierListImpl(JKAccessModifierImpl(propertyField.modifierList.visibility)), JKKtGetterOrSetter.Kind.GETTER,
JKKtGetterOrSetter.Kind.GETTER propertyField.visibility
) )
val ktSetter = setter?.let { val ktSetter = setter?.let {
@@ -79,32 +80,35 @@ class FieldToPropertyConversion(private val context: ConversionContext) : Recurs
RenameType.RENAME_PARAMETER_ACCESS RenameType.RENAME_PARAMETER_ACCESS
) )
.renamed(propertyField.name.value, "field", propertyField.type.type, RenameType.RENAME_FIELD_ACCESS), .renamed(propertyField.name.value, "field", propertyField.type.type, RenameType.RENAME_FIELD_ACCESS),
JKModifierListImpl(JKAccessModifierImpl(method.modifierList.visibility)), JKKtGetterOrSetter.Kind.SETTER,
JKKtGetterOrSetter.Kind.SETTER method.visibility
) )
} ?: JKKtEmptyGetterOrSetterImpl() } ?: JKKtEmptyGetterOrSetterImpl()
propertyField.invalidate() propertyField.invalidate()
val mutability =
if (propertyField.modality == Modality.FINAL) Mutability.IMMUTABLE
else if (propertyField.visibility == Visibility.PRIVATE && ktSetter is JKKtEmptyGetterOrSetter)
Mutability.IMMUTABLE
else Mutability.MUTABLE
val visibility =
listOf(
ktGetter.visibility,
ktGetter.visibility
).min() ?: Visibility.PUBLIC
return JKKtPropertyImpl( return JKKtPropertyImpl(
propertyField.modifierList,
propertyField.type, propertyField.type,
propertyField.name, propertyField.name,
propertyField.initializer, propertyField.initializer,
ktGetter, ktGetter,
ktSetter ktSetter,
).also { propertyField.extraModifiers,
it.modifierList.mutability = visibility,
if (it.modifierList.isFinal()) Mutability.NonMutable propertyField.modality,
else if (it.modifierList.visibilityOrNull() == JKAccessModifier.Visibility.PRIVATE && ktSetter is JKKtEmptyGetterOrSetter) mutability
Mutability.NonMutable )
else Mutability.Mutable
it.modifierList.visibility =
listOf(
ktGetter.modifierList.visibility,
ktGetter.modifierList.visibility
).min() ?: JKAccessModifier.Visibility.PUBLIC
}
} }
private fun JKJavaMethod.isGetterOrSetter() = private fun JKJavaMethod.isGetterOrSetter() =
@@ -120,8 +120,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
// JKJavaPrimitiveTypeImpl.INT // JKJavaPrimitiveTypeImpl.INT
// else null // else null
val loopVarDeclaration = val loopVarDeclaration =
JKLocalVariableImpl( JKForLoopVariableImpl(
JKModifierListImpl(JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)),
JKTypeElementImpl(JKNoTypeImpl), JKTypeElementImpl(JKNoTypeImpl),
loopVar::name.detached(), loopVar::name.detached(),
JKStubExpressionImpl() JKStubExpressionImpl()
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKKtModifier.KtModifierType.INNER
import org.jetbrains.kotlin.j2k.tree.impl.JKKtModifierImpl
class InnerClassConversion : RecursiveApplicableConversionBase() { class InnerClassConversion : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
@@ -22,13 +20,15 @@ class InnerClassConversion : RecursiveApplicableConversionBase() {
private fun applyArmed(element: JKTreeElement, outer: JKClass): JKTreeElement { private fun applyArmed(element: JKTreeElement, outer: JKClass): JKTreeElement {
if (element !is JKClass) return recurseArmed(element, outer) if (element !is JKClass) return recurseArmed(element, outer)
val static = element.modifierList.modifiers.find { it is JKJavaModifier && it.type == JKJavaModifier.JavaModifierType.STATIC } val static = element.extraModifiers.find { it == ExtraModifier.STATIC }
if (static != null) { if (static != null) {
element.modifierList.modifiers -= static element.extraModifiers -= static
} else if (element.classKind != JKClass.ClassKind.INTERFACE && outer.classKind != JKClass.ClassKind.INTERFACE) { } else if (element.classKind != JKClass.ClassKind.INTERFACE &&
element.modifierList.modifiers += JKKtModifierImpl(INNER) outer.classKind != JKClass.ClassKind.INTERFACE &&
element.classKind != JKClass.ClassKind.ENUM
) {
element.extraModifiers += ExtraModifier.INNER
} }
return recurseArmed(element, element) return recurseArmed(element, element)
} }
} }
@@ -7,22 +7,24 @@ package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKModalityModifier.Modality.*
import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.j2k.tree.impl.*
class InsertDefaultPrimaryConstructorConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class InsertDefaultPrimaryConstructorConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
if (element.classKind != JKClass.ClassKind.CLASS && element.declarationList.any { it is JKKtConstructor }) return recurse(element) if (element.classKind != JKClass.ClassKind.CLASS) return recurse(element)
if (element.declarationList.any { it is JKKtConstructor }) return recurse(element)
val constructor = JKKtPrimaryConstructorImpl( val constructor = JKKtPrimaryConstructorImpl(
JKNameIdentifierImpl(element.name.value), emptyList(), JKBodyStub, JKNameIdentifierImpl(element.name.value),
JKModifierListImpl().also { emptyList(),
it.modality = FINAL JKBodyStub,
it.visibility = JKAccessModifier.Visibility.PUBLIC JKStubExpressionImpl(),
}, emptyList(),
JKStubExpressionImpl() Visibility.PUBLIC,
Modality.FINAL
) )
element.classBody.declarations += constructor element.classBody.declarations += constructor
@@ -0,0 +1,30 @@
/*
* 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.ConversionContext
import org.jetbrains.kotlin.j2k.tree.*
class InternalClassConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element)
return recurseArmed(element, element.visibility == Visibility.INTERNAL)
}
private fun recurseArmed(element: JKTreeElement, parentIsInternal: Boolean): JKTreeElement {
return applyRecursive(element, parentIsInternal, ::applyArmed)
}
private fun applyArmed(element: JKTreeElement, parentIsInternal: Boolean): JKTreeElement {
if (element is JKClass) return recurseArmed(element, parentIsInternal)
if (element !is JKVisibilityOwner) return recurseArmed(element, parentIsInternal)
val isInternal = element.visibility == Visibility.INTERNAL
if (isInternal && parentIsInternal && context.converter.settings.noInternalForMembersOfInternal) {
element.visibility = Visibility.PUBLIC
}
return recurseArmed(element, isInternal)
}
}
@@ -16,33 +16,44 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.tree.JKClass import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.JKClassBody import org.jetbrains.kotlin.j2k.throwAnnotation
import org.jetbrains.kotlin.j2k.tree.JKJavaMethod import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.impl.JKKtFunctionImpl import org.jetbrains.kotlin.j2k.tree.impl.JKKtFunctionImpl
class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() { class JavaMethodToKotlinFunctionConversion(private val context: ConversionContext) : TransformerBasedConversion() {
override fun visitTreeElement(element: JKTreeElement) { override fun visitTreeElement(element: JKTreeElement) {
element.acceptChildren(this, null) element.acceptChildren(this, null)
} }
override fun visitClassBody(classBody: JKClassBody) { override fun visitClassBody(classBody: JKClassBody) {
somethingChanged = true somethingChanged = true
classBody.declarations = classBody.declarations.map {
if (it is JKJavaMethod) { classBody.declarations = classBody.declarations.map { declaration ->
it.invalidate() if (declaration is JKJavaMethod) {
declaration.invalidate()
JKKtFunctionImpl( JKKtFunctionImpl(
it.returnType, declaration.returnType,
it.name, declaration.name,
it.parameters, declaration.parameters,
it.block, declaration.block,
it.modifierList, declaration.typeParameterList,
it.typeParameterList, declaration.annotationList.also {
it.annotationList if (declaration.throwsList.isNotEmpty()) {
it.annotations +=
throwAnnotation(
declaration.throwsList.map { it.type },
context.symbolProvider
)
}
},
declaration.extraModifiers,
declaration.visibility,
declaration.modality
) )
} else { } else {
it declaration
} }
} }
classBody.acceptChildren(this) classBody.acceptChildren(this)
@@ -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.*
class JavaModifiersConversion: RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKVisibilityOwner) {
if (element.visibility == Visibility.PACKAGE_PRIVATE) {
element.visibility = Visibility.INTERNAL
}
}
return recurse(element)
}
}
@@ -5,16 +5,15 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.JKAnnotationImpl import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.j2k.tree.impl.JKClassTypeImpl import org.jetbrains.kotlin.util.collectionUtils.concatInOrder
import org.jetbrains.kotlin.j2k.tree.impl.JKNameIdentifierImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKTypeElementImpl
//TODO temporary //TODO temporary
class MainFunctionConversion : RecursiveApplicableConversionBase() { class MainFunctionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKKtFunction) return recurse(element) if (element !is JKKtFunction) return recurse(element)
if (element.isMainFunctionDeclaration()) { if (element.isMainFunctionDeclaration()) {
@@ -29,7 +28,11 @@ class MainFunctionConversion : RecursiveApplicableConversionBase() {
) )
type = JKTypeElementImpl(newType) type = JKTypeElementImpl(newType)
} }
element.annotationList.annotations += JKAnnotationImpl(JKNameIdentifierImpl("JvmStatic")) element.annotationList.annotations +=
JKAnnotationImpl(
context.symbolProvider.provideByFqName("kotlin.jvm.JvmStatic"),
JKExpressionListImpl()
)
} }
return recurse(element) return recurse(element)
} }
@@ -9,12 +9,9 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.modality
import org.jetbrains.kotlin.j2k.tree.impl.psi import org.jetbrains.kotlin.j2k.tree.impl.psi
class ModalityConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ModalityConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKClass -> processClass(element) is JKClass -> processClass(element)
@@ -25,16 +22,22 @@ class ModalityConversion(private val context: ConversionContext) : RecursiveAppl
private fun processClass(klass: JKClass) { private fun processClass(klass: JKClass) {
if (klass.classKind != JKClass.ClassKind.CLASS) return if (klass.classKind != JKClass.ClassKind.CLASS) return
if (klass.modifierList.modality != JKModalityModifier.Modality.OPEN) return if (klass.modality != Modality.OPEN) return
if (context.converter.settings.openByDefault) return if (context.converter.settings.openByDefault) return
if (!context.converter.converterServices.oldServices.referenceSearcher.hasInheritors(klass.psi as PsiClass)) { if (!context.converter.converterServices.oldServices.referenceSearcher.hasInheritors(klass.psi as PsiClass)) {
klass.modifierList.modality = JKModalityModifier.Modality.FINAL klass.modality = Modality.FINAL
} }
} }
private fun processMethod(method: JKJavaMethod) { private fun processMethod(method: JKJavaMethod) {
val psi = method.psi<PsiMethod>()!!
if (method.modality == Modality.OPEN
&& !context.converter.converterServices.oldServices.referenceSearcher.hasOverrides(psi)
) {
method.modality = Modality.FINAL
}
if ((method.psi!! as PsiMethod).findSuperMethods().isNotEmpty()) { if ((method.psi!! as PsiMethod).findSuperMethods().isNotEmpty()) {
method.modifierList.modality = JKModalityModifier.Modality.OVERRIDE method.modality = Modality.OVERRIDE
} }
} }
@@ -1,108 +0,0 @@
/*
* 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.ConversionContext
import org.jetbrains.kotlin.j2k.ast.Mutability
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.*
class ModifiersConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKModifierListOwner && element !is JKLocalVariable) {
var modifiers = element.modifierList.modifiers
if (element !is JKField) {
modifiers = mapOtherModifiers(modifiers)
}
element.modifierList.modifiers = modifiers
// Is declared inside some class
// TODO: Cleanup
if (context.converter.settings.noInternalForMembersOfInternal) {
relaxVisibility(element)
}
if (element is JKParameter) {
convertParameterModifiers(element)
}
if (element is JKKtConstructor) {
convertConstructorModifiers(element)
}
if (element is JKClass) {
convertClassModifiers(element)
}
element.sortModifiers()
}
return recurse(element)
}
private fun convertClassModifiers(klass: JKClass) {
val isPackagePrivate = klass.modifierList.visibility == JKAccessModifier.Visibility.PACKAGE_PRIVATE
val parentClassIsInternal =
(klass.parent as? JKClass)?.modifierList?.visibility == JKAccessModifier.Visibility.INTERNAL
if (isPackagePrivate || parentClassIsInternal) {
klass.modifierList.visibility = JKAccessModifier.Visibility.INTERNAL
}
}
private fun convertConstructorModifiers(constructor: JKKtConstructor) {
constructor.filterModifiers { it !is JKModalityModifier }
}
private fun convertParameterModifiers(jkParameter: JKParameter) {
if (jkParameter.modifierList.mutability == Mutability.Default) {
jkParameter.modifierList.modifiers = emptyList()
}
}
private fun relaxVisibility(element: JKTreeElement) {
if (element is JKParameter) return
element as JKModifierListOwner // TODO: Assert
val modifierList = element.modifierList
val parent = element.parent as? JKClass
if (parent == null
|| modifierList.visibility != JKAccessModifier.Visibility.PACKAGE_PRIVATE
|| parent.modifierList.visibility != JKAccessModifier.Visibility.PACKAGE_PRIVATE
) return
modifierList.visibility = JKAccessModifier.Visibility.PUBLIC
}
private fun mapOtherModifiers(modifiers: List<JKModifier>): List<JKModifier> {
return modifiers.map {
when (it) {
is JKJavaModifier -> when (it.type) {
JKJavaModifier.JavaModifierType.NATIVE -> JKKtModifierImpl(JKKtModifier.KtModifierType.EXTERNAL)
else -> it
}
else -> it
}
}
}
private fun JKModifierListOwner.sortModifiers() {
modifierList.modifiers = modifierList.modifiers.sortedBy { it.priority }
}
private val JKModifier.priority: Int
get() =
when (this) {
is JKAccessModifier -> 0
is JKModalityModifier ->
when (this.modality) {
JKModalityModifier.Modality.FINAL, JKModalityModifier.Modality.OPEN, JKModalityModifier.Modality.ABSTRACT -> 1
JKModalityModifier.Modality.OVERRIDE -> 2
}
is JKJavaModifier -> 3
is JKKtModifier -> 4
is JKMutabilityModifier -> 5
else -> 6
}
private fun JKModifierListOwner.filterModifiers(filter: (JKModifier) -> Boolean) {
modifierList.modifiers = modifierList.modifiers.filter(filter)
}
}
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.j2k.tree.impl.JKKtPrimaryConstructorImpl
class PrimaryConstructorDetectConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class PrimaryConstructorDetectConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKClass) { if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) {
processClass(element) processClass(element)
} }
return recurse(element) return recurse(element)
@@ -33,8 +33,10 @@ class PrimaryConstructorDetectConversion(private val context: ConversionContext)
primaryConstructorCandidate.name, primaryConstructorCandidate.name,
primaryConstructorCandidate.parameters, primaryConstructorCandidate.parameters,
primaryConstructorCandidate.block, primaryConstructorCandidate.block,
primaryConstructorCandidate.modifierList, primaryConstructorCandidate.delegationCall,
primaryConstructorCandidate.delegationCall primaryConstructorCandidate.extraModifiers,
primaryConstructorCandidate.visibility,
primaryConstructorCandidate.modality
) )
context.symbolProvider.transferSymbol(primaryConstructor, primaryConstructorCandidate) context.symbolProvider.transferSymbol(primaryConstructor, primaryConstructorCandidate)
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ast.EnumConstant
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
//TODO temporary //TODO temporary
@@ -13,7 +12,7 @@ class SortClassMembersConversion : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
element.classBody.declarations = element.declarationList element.classBody.declarations = element.declarationList
.sortedByDescending { it is JKField } .sortedByDescending { it is JKVariable }
return recurse(element) return recurse(element)
} }
} }
@@ -13,8 +13,8 @@ class StaticsToCompanionExtractConversion : RecursiveApplicableConversionBase()
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
if (element.classKind == JKClass.ClassKind.COMPANION || element.classKind == JKClass.ClassKind.OBJECT) return element if (element.classKind == JKClass.ClassKind.COMPANION || element.classKind == JKClass.ClassKind.OBJECT) return element
val statics = element.declarationList.filter { declaration -> val statics = element.declarationList.filter { declaration ->
declaration is JKModifierListOwner && declaration is JKExtraModifiersOwner &&
declaration.modifierList.modifiers.any { it is JKJavaModifier && it.type == JKJavaModifier.JavaModifierType.STATIC } declaration.extraModifiers.any { it == ExtraModifier.STATIC }
} }
if (statics.isEmpty()) return recurse(element) if (statics.isEmpty()) return recurse(element)
@@ -23,9 +23,8 @@ class StaticsToCompanionExtractConversion : RecursiveApplicableConversionBase()
element.classBody.declarations -= statics element.classBody.declarations -= statics
companion.classBody.declarations += statics.onEach { declaration -> companion.classBody.declarations += statics.onEach { declaration ->
(declaration as JKModifierListOwner) (declaration as JKExtraModifiersOwner)
declaration.modifierList.modifiers = declaration.extraModifiers -= ExtraModifier.STATIC
declaration.modifierList.modifiers.filterNot { it is JKJavaModifier && it.type == JKJavaModifier.JavaModifierType.STATIC }
} }
return recurse(element) return recurse(element)
@@ -40,17 +39,14 @@ class StaticsToCompanionExtractConversion : RecursiveApplicableConversionBase()
if (companion != null) return companion if (companion != null) return companion
return JKClassImpl( return JKClassImpl(
JKModifierListImpl(
listOf(
JKAccessModifierImpl(JKAccessModifier.Visibility.PUBLIC),
JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)
)
),
JKNameIdentifierImpl(""), JKNameIdentifierImpl(""),
JKInheritanceInfoImpl(emptyList()), JKInheritanceInfoImpl(emptyList()),
JKClass.ClassKind.COMPANION, JKClass.ClassKind.COMPANION,
JKTypeParameterListImpl(), JKTypeParameterListImpl(),
JKClassBodyImpl() JKClassBodyImpl(),
emptyList(),
Visibility.PUBLIC,
Modality.FINAL
).also { element.classBody.declarations += it } ).also { element.classBody.declarations += it }
} }
} }
@@ -5,13 +5,10 @@
package org.jetbrains.kotlin.j2k.conversions package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.j2k.* import org.jetbrains.kotlin.j2k.*
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.name.ClassId
import java.util.*
class TryStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class TryStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
@@ -72,8 +69,7 @@ class TryStatementConversion(private val context: ConversionContext) : Recursive
}.map { }.map {
val parameter = JKParameterImpl( val parameter = JKParameterImpl(
JKTypeElementImpl(it.updateNullability(Nullability.NotNull)), JKTypeElementImpl(it.updateNullability(Nullability.NotNull)),
javaCatchSection.parameter.name.copyTreeAndDetach(), javaCatchSection.parameter.name.copyTreeAndDetach()
JKModifierListImpl()
) )
JKKtTryCatchSectionImpl( JKKtTryCatchSectionImpl(
parameter, parameter,
@@ -24,7 +24,7 @@ internal fun resolveFqName(classId: ClassId, contextElement: JKTreeElement, cont
return resolveFqName(classId, element) return resolveFqName(classId, element)
} }
internal fun resolveFqName(classId: ClassId, element: PsiElement): PsiElement? { fun resolveFqName(classId: ClassId, element: PsiElement): PsiElement? {
return constructImportDirectiveWithContext(classId, element) return constructImportDirectiveWithContext(classId, element)
.getChildOfType<KtDotQualifiedExpression>() .getChildOfType<KtDotQualifiedExpression>()
?.selectorExpression ?.selectorExpression
@@ -157,7 +157,7 @@ fun useExpression(
)!! )!!
) as JKMethodSymbol ) as JKMethodSymbol
val lambdaParameter = val lambdaParameter =
JKParameterImpl(JKTypeElementImpl(JKNoTypeImpl), variableIdentifier, JKModifierListImpl()) JKParameterImpl(JKTypeElementImpl(JKNoTypeImpl), variableIdentifier)
val lambda = JKLambdaExpressionImpl( val lambda = JKLambdaExpressionImpl(
listOf(lambdaParameter), listOf(lambdaParameter),
@@ -36,15 +36,11 @@ private class DebugTreePrinter : JKVisitorVoid {
printer.println(nameIdentifier.describe(), "(\"", nameIdentifier.value, "\")") printer.println(nameIdentifier.describe(), "(\"", nameIdentifier.value, "\")")
} }
override fun visitJavaModifier(javaModifier: JKJavaModifier) {
printer.println(javaModifier.describe(), "(", javaModifier.type, ")")
}
override fun visitJavaMethod(javaMethod: JKJavaMethod) { override fun visitJavaMethod(javaMethod: JKJavaMethod) {
printer.print(javaMethod.modifiers().joinToString(" ") { it.text })
printer.println(javaMethod.describe(), " [") printer.println(javaMethod.describe(), " [")
printer.indented { printer.indented {
javaMethod.block.accept(this, null) javaMethod.block.accept(this, null)
javaMethod.modifierList.accept(this, null)
javaMethod.parameters.forEach { it.accept(this, null) } javaMethod.parameters.forEach { it.accept(this, null) }
} }
printer.println("]") printer.println("]")
@@ -27,28 +27,35 @@ import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
class JKJavaFieldImpl(modifierList: JKModifierList, type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression) : JKJavaField, class JKJavaFieldImpl(
type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression,
override var extraModifiers: List<ExtraModifier>,
override var visibility: Visibility,
override var modality: Modality,
override var mutability: Mutability
) : JKJavaField,
JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaField(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaField(this, data)
override var initializer: JKExpression by child(initializer) override var initializer: JKExpression by child(initializer)
override var modifierList: JKModifierList by child(modifierList)
override var type by child(type) override var type by child(type)
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
} }
class JKJavaMethodImpl( class JKJavaMethodImpl(
modifierList: JKModifierList,
returnType: JKTypeElement, returnType: JKTypeElement,
name: JKNameIdentifier, name: JKNameIdentifier,
parameters: List<JKParameter>, parameters: List<JKParameter>,
block: JKBlock, block: JKBlock,
typeParameterList: JKTypeParameterList, typeParameterList: JKTypeParameterList,
annotationList: JKAnnotationList annotationList: JKAnnotationList,
throwsList: List<JKTypeElement>,
override var extraModifiers: List<ExtraModifier>,
override var visibility: Visibility,
override var modality: Modality
) : JKJavaMethod, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { ) : JKJavaMethod, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethod(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethod(this, data)
override var modifierList: JKModifierList by child(modifierList)
override var returnType: JKTypeElement by child(returnType) override var returnType: JKTypeElement by child(returnType)
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override var parameters: List<JKParameter> by children(parameters) override var parameters: List<JKParameter> by children(parameters)
@@ -68,9 +75,6 @@ class JKJavaLiteralExpressionImpl(
} }
} }
class JKJavaModifierImpl(override val type: JKJavaModifier.JavaModifierType) : JKJavaModifier, JKElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaModifier(this, data)
}
class JKJavaOperatorToken(val psiToken: IElementType) : JKOperatorToken { class JKJavaOperatorToken(val psiToken: IElementType) : JKOperatorToken {
override val text: String override val text: String
@@ -19,9 +19,7 @@ package org.jetbrains.kotlin.j2k.tree.impl
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.JKSymbolProvider import org.jetbrains.kotlin.j2k.JKSymbolProvider
import org.jetbrains.kotlin.j2k.ast.Mutability
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.conversions.resolveFqName import org.jetbrains.kotlin.j2k.conversions.resolveFqName
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
@@ -40,17 +38,18 @@ class JKFileImpl : JKFile, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
} }
class JKClassImpl( class JKClassImpl(
modifierList: JKModifierList,
name: JKNameIdentifier, name: JKNameIdentifier,
inheritance: JKInheritanceInfo, inheritance: JKInheritanceInfo,
override var classKind: JKClass.ClassKind, override var classKind: JKClass.ClassKind,
typeParameterList: JKTypeParameterList, typeParameterList: JKTypeParameterList,
classBody: JKClassBody classBody: JKClassBody,
override var extraModifiers: List<ExtraModifier>,
override var visibility: Visibility,
override var modality: Modality
) : JKClass, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { ) : JKClass, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitClass(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitClass(this, data)
override var name by child(name) override var name by child(name)
override var modifierList by child(modifierList)
override val inheritance by child(inheritance) override val inheritance by child(inheritance)
override var typeParameterList: JKTypeParameterList by child(typeParameterList) override var typeParameterList: JKTypeParameterList by child(typeParameterList)
override var classBody: JKClassBody by child(classBody) override var classBody: JKClassBody by child(classBody)
@@ -60,46 +59,26 @@ class JKNameIdentifierImpl(override val value: String) : JKNameIdentifier, JKEle
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitNameIdentifier(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitNameIdentifier(this, data)
} }
class JKModifierListImpl( class JKForLoopVariableImpl(
modifiers: List<JKModifier> = emptyList() type: JKTypeElement,
) : JKModifierList, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { name: JKNameIdentifier,
constructor(vararg modifiers: JKModifier) : this(modifiers.asList()) initializer: JKExpression
) : JKForLoopVariable, JKBranchElementBase() {
override var initializer by child(initializer)
override var name by child(name)
override var type by child(type)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitModifierList(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitForLoopVariable(this, data)
override var modifiers: List<JKModifier> by children(modifiers)
} }
var JKModifierList.modality
get() = modifiers.filterIsInstance<JKModalityModifier>().first().modality
set(value) {
modifiers = modifiers.filterNot { it is JKModalityModifier } + JKModalityModifierImpl(value)
}
var JKModifierList.visibility
get() = modifiers.filterIsInstance<JKAccessModifier>().first().visibility
set(value) {
modifiers = modifiers.filterNot { it is JKAccessModifier } + JKAccessModifierImpl(value)
}
var JKModifierList.mutability
get() = modifiers.filterIsInstance<JKMutabilityModifier>().firstOrNull()?.mutability ?: Mutability.Default
set(value) {
modifiers = modifiers.filterNot { it is JKMutabilityModifier } +
listOfNotNull(if (value != Mutability.Default) JKMutabilityModifierImpl(value) else null)
}
class JKParameterImpl( class JKParameterImpl(
type: JKTypeElement, type: JKTypeElement,
name: JKNameIdentifier, name: JKNameIdentifier,
modifierList: JKModifierList,
initializer: JKExpression = JKStubExpressionImpl() initializer: JKExpression = JKStubExpressionImpl()
) : JKParameter, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { ) : JKParameter, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitParameter(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitParameter(this, data)
override var modifierList by child(modifierList)
override var initializer by child(initializer) override var initializer by child(initializer)
override var name by child(name) override var name by child(name)
override var type by child(type) override var type by child(type)
@@ -269,9 +248,12 @@ fun JKLiteralExpression.LiteralType.toJkType(symbolProvider: JKSymbolProvider):
} }
} }
class JKLocalVariableImpl(modifierList: JKModifierList, type: JKTypeElement, name: JKNameIdentifier, initializer: JKExpression) : class JKLocalVariableImpl(
JKLocalVariable, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { type: JKTypeElement,
override var modifierList by child(modifierList) name: JKNameIdentifier,
initializer: JKExpression,
override var mutability: Mutability
) : JKLocalVariable, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override var initializer by child(initializer) override var initializer by child(initializer)
override var name by child(name) override var name by child(name)
override var type by child(type) override var type by child(type)
@@ -368,21 +350,9 @@ class JKClassAccessExpressionImpl(override var identifier: JKClassSymbol) : JKCl
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitClassAccessExpression(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitClassAccessExpression(this, data)
} }
class JKModalityModifierImpl(override val modality: JKModalityModifier.Modality) : JKModalityModifier, JKElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitModalityModifier(this, data)
}
class JKAccessModifierImpl(override val visibility: JKAccessModifier.Visibility) : JKAccessModifier, JKElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitAccessModifier(this, data)
}
class JKMutabilityModifierImpl(override val mutability: Mutability) : JKMutabilityModifier, JKElementBase(), PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitMutabilityModifier(this, data)
}
class JKLambdaExpressionImpl( class JKLambdaExpressionImpl(
parameters: List<JKParameter> = listOf( parameters: List<JKParameter> = listOf(
JKParameterImpl(JKTypeElementImpl(JKJavaVoidType), JKNameIdentifierImpl("it"), JKModifierListImpl()) JKParameterImpl(JKTypeElementImpl(JKJavaVoidType), JKNameIdentifierImpl("it"))
), statement: JKStatement, returnType: JKTypeElement = JKTypeElementImpl(JKContextType) ), statement: JKStatement, returnType: JKTypeElement = JKTypeElementImpl(JKContextType)
) : JKLambdaExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { ) : JKLambdaExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override var statement by child(statement) override var statement by child(statement)
@@ -475,14 +445,13 @@ class JKTypeParameterTypeImpl(
class JKEnumConstantImpl( class JKEnumConstantImpl(
name: JKNameIdentifier, name: JKNameIdentifier,
arguments: JKExpressionList, arguments: JKExpressionList,
type: JKTypeElement, type: JKTypeElement
modifierList: JKModifierList
) : JKEnumConstant, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { ) : JKEnumConstant, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override val arguments: JKExpressionList by child(arguments) override val arguments: JKExpressionList by child(arguments)
override var type: JKTypeElement by child(type) override var type: JKTypeElement by child(type)
override var initializer: JKExpression by child(JKStubExpressionImpl()) override var initializer: JKExpression by child(JKStubExpressionImpl())
override var modifierList: JKModifierList by child(modifierList)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitEnumConstant(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitEnumConstant(this, data)
} }
@@ -26,16 +26,18 @@ import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.cast
class JKKtPropertyImpl( class JKKtPropertyImpl(
modifierList: JKModifierList,
type: JKTypeElement, type: JKTypeElement,
name: JKNameIdentifier, name: JKNameIdentifier,
initializer: JKExpression, initializer: JKExpression,
getter: JKKtGetterOrSetter, getter: JKKtGetterOrSetter,
setter: JKKtGetterOrSetter setter: JKKtGetterOrSetter,
override var extraModifiers: List<ExtraModifier>,
override var visibility: Visibility,
override var modality: Modality,
override var mutability: Mutability
) : JKBranchElementBase(), JKKtProperty { ) : JKBranchElementBase(), JKKtProperty {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtProperty(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtProperty(this, data)
override var modifierList: JKModifierList by child(modifierList)
override var type by child(type) override var type by child(type)
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override var initializer: JKExpression by child(initializer) override var initializer: JKExpression by child(initializer)
@@ -48,9 +50,11 @@ class JKKtFunctionImpl(
name: JKNameIdentifier, name: JKNameIdentifier,
parameters: List<JKParameter>, parameters: List<JKParameter>,
block: JKBlock, block: JKBlock,
modifierList: JKModifierList,
typeParameterList: JKTypeParameterList, typeParameterList: JKTypeParameterList,
annotationList: JKAnnotationList annotationList: JKAnnotationList,
override var extraModifiers: List<ExtraModifier>,
override var visibility: Visibility,
override var modality: Modality
) : JKBranchElementBase(), JKKtFunction { ) : JKBranchElementBase(), JKKtFunction {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtFunction(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtFunction(this, data)
@@ -58,7 +62,6 @@ class JKKtFunctionImpl(
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override var parameters: List<JKParameter> by children(parameters) override var parameters: List<JKParameter> by children(parameters)
override var block: JKBlock by child(block) override var block: JKBlock by child(block)
override var modifierList: JKModifierList by child(modifierList)
override var typeParameterList: JKTypeParameterList by child(typeParameterList) override var typeParameterList: JKTypeParameterList by child(typeParameterList)
override var annotationList: JKAnnotationList by child(annotationList) override var annotationList: JKAnnotationList by child(annotationList)
} }
@@ -110,10 +113,6 @@ class JKKtOperatorImpl(override val token: JKKtOperatorToken, val methodSymbol:
} }
class JKKtModifierImpl(override val type: JKKtModifier.KtModifierType) : JKKtModifier, JKElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtModifier(this, data)
}
class JKKtAlsoCallExpressionImpl( class JKKtAlsoCallExpressionImpl(
statement: JKStatement, statement: JKStatement,
override val identifier: JKMethodSymbol, override val identifier: JKMethodSymbol,
@@ -135,8 +134,7 @@ class JKKtAlsoCallExpressionImpl(
listOf( listOf(
JKParameterImpl( JKParameterImpl(
JKTypeElementImpl(JKJavaVoidType), JKTypeElementImpl(JKJavaVoidType),
JKNameIdentifierImpl(parameterName), JKNameIdentifierImpl(parameterName)
JKModifierListImpl()
) )
), statement ), statement
) )
@@ -163,15 +161,16 @@ class JKKtConstructorImpl(
name: JKNameIdentifier, name: JKNameIdentifier,
parameters: List<JKParameter>, parameters: List<JKParameter>,
block: JKBlock, block: JKBlock,
modifierList: JKModifierList, delegationCall: JKExpression,
delegationCall: JKExpression override var extraModifiers: List<ExtraModifier>,
override var visibility: Visibility,
override var modality: Modality
) : JKBranchElementBase(), JKKtConstructor { ) : JKBranchElementBase(), JKKtConstructor {
override val returnType: JKTypeElement get() = TODO("!") override val returnType: JKTypeElement get() = TODO("!")
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override var parameters: List<JKParameter> by children(parameters) override var parameters: List<JKParameter> by children(parameters)
override var block: JKBlock by child(block) override var block: JKBlock by child(block)
override var modifierList: JKModifierList by child(modifierList)
override var delegationCall: JKExpression by child(delegationCall) override var delegationCall: JKExpression by child(delegationCall)
override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl()) override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl())
override var annotationList: JKAnnotationList by child(JKAnnotationListImpl()) override var annotationList: JKAnnotationList by child(JKAnnotationListImpl())
@@ -182,16 +181,16 @@ class JKKtConstructorImpl(
class JKKtPrimaryConstructorImpl( class JKKtPrimaryConstructorImpl(
name: JKNameIdentifier, name: JKNameIdentifier,
parameters: List<JKParameter>, parameters: List<JKParameter>,
block: JKBlock, delegationCall: JKExpression,
modifierList: JKModifierList, override var extraModifiers: List<ExtraModifier>,
delegationCall: JKExpression override var visibility: Visibility,
override var modality: Modality
) : JKBranchElementBase(), JKKtPrimaryConstructor { ) : JKBranchElementBase(), JKKtPrimaryConstructor {
override val returnType: JKTypeElement get() = TODO("!") override val returnType: JKTypeElement get() = TODO("!")
override var name: JKNameIdentifier by child(name) override var name: JKNameIdentifier by child(name)
override var parameters: List<JKParameter> by children(parameters) override var parameters: List<JKParameter> by children(parameters)
override var block: JKBlock by child(block) override var block: JKBlock by child(block)
override var modifierList: JKModifierList by child(modifierList)
override var delegationCall: JKExpression by child(delegationCall) override var delegationCall: JKExpression by child(delegationCall)
override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl()) override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl())
override var annotationList: JKAnnotationList by child(JKAnnotationListImpl()) override var annotationList: JKAnnotationList by child(JKAnnotationListImpl())
@@ -292,18 +291,18 @@ class JKKtTryCatchSectionImpl(
class JKKtGetterOrSetterImpl( class JKKtGetterOrSetterImpl(
body: JKStatement, body: JKStatement,
modifierList: JKModifierList, override val kind: JKKtGetterOrSetter.Kind,
override val kind: JKKtGetterOrSetter.Kind override var visibility: Visibility
) : JKKtGetterOrSetter, JKBranchElementBase() { ) : JKKtGetterOrSetter, JKBranchElementBase() {
override var body: JKStatement by child(body) override var body: JKStatement by child(body)
override var modifierList: JKModifierList by child(modifierList)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtGetterOrSetter(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtGetterOrSetter(this, data)
} }
class JKKtEmptyGetterOrSetterImpl : JKKtEmptyGetterOrSetter, JKBranchElementBase() { class JKKtEmptyGetterOrSetterImpl : JKKtEmptyGetterOrSetter, JKBranchElementBase() {
override var visibility: Visibility = Visibility.PUBLIC
override var body: JKStatement by child(JKEmptyStatementImpl()) override var body: JKStatement by child(JKEmptyStatementImpl())
override var modifierList: JKModifierList by child(JKModifierListImpl())
override val kind: JKKtGetterOrSetter.Kind override val kind: JKKtGetterOrSetter.Kind
get() = error("Cannot get kind of JKKtEmptyGetterOrSetter") get() = error("Cannot get kind of JKKtEmptyGetterOrSetter")
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtEmptyGetterOrSetter(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtEmptyGetterOrSetter(this, data)
} }
@@ -129,12 +129,12 @@ class JKMultiverseFunctionSymbol(override val target: KtNamedFunction, private v
get() = target.name!! // TODO("Fix this") get() = target.name!! // TODO("Fix this")
} }
class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> { class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKVariable> {
override val fieldType: JKType override val fieldType: JKType
get() = target.type.type get() = target.type.type
override val name: String override val name: String
get() = target.name.value get() = target.name.value
override lateinit var target: JKField override lateinit var target: JKVariable
override val declaredIn: JKSymbol override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String override val fqName: String
@@ -18,7 +18,8 @@ package org.jetbrains.kotlin.j2k.tree
import org.jetbrains.kotlin.idea.search.usagesSearch.constructor import org.jetbrains.kotlin.idea.search.usagesSearch.constructor
import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
interface JKField : JKVariable, JKVisibilityOwner, JKMutabilityOwner, JKModalityOwner, JKExtraModifiersOwner
interface JKJavaField : JKField, JKBranchElement interface JKJavaField : JKField, JKBranchElement
@@ -58,13 +59,6 @@ interface JKJavaDefaultNewExpression : JKExpression {
val classSymbol: JKClassSymbol val classSymbol: JKClassSymbol
} }
interface JKJavaModifier : JKModifier {
val type: JavaModifierType
enum class JavaModifierType {
NATIVE, STATIC, STRICTFP, SYNCHRONIZED, TRANSIENT, VOLATILE
}
}
interface JKJavaNewEmptyArray : JKExpression { interface JKJavaNewEmptyArray : JKExpression {
val type: JKTypeElement val type: JKTypeElement
+80 -25
View File
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.j2k.tree package org.jetbrains.kotlin.j2k.tree
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.j2k.ast.Mutability
import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol import org.jetbrains.kotlin.j2k.tree.impl.JKClassSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKFieldSymbol import org.jetbrains.kotlin.j2k.tree.impl.JKFieldSymbol
import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol
@@ -45,7 +44,7 @@ interface JKFile : JKTreeElement, JKBranchElement {
var declarationList: List<JKDeclaration> var declarationList: List<JKDeclaration>
} }
interface JKClass : JKDeclaration, JKModifierListOwner, JKTypeParameterListOwner, JKBranchElement { interface JKClass : JKDeclaration, JKVisibilityOwner, JKExtraModifiersOwner, JKModalityOwner, JKTypeParameterListOwner, JKBranchElement {
val name: JKNameIdentifier val name: JKNameIdentifier
val inheritance: JKInheritanceInfo val inheritance: JKInheritanceInfo
@@ -78,47 +77,105 @@ interface JKAnnotationListOwner : JKTreeElement {
var annotationList: JKAnnotationList var annotationList: JKAnnotationList
} }
interface JKMethod : JKDeclaration, JKModifierListOwner, JKTypeParameterListOwner, JKAnnotationListOwner { interface JKMethod : JKDeclaration, JKVisibilityOwner, JKModalityOwner, JKExtraModifiersOwner, JKTypeParameterListOwner,
JKAnnotationListOwner {
val name: JKNameIdentifier val name: JKNameIdentifier
var parameters: List<JKParameter> var parameters: List<JKParameter>
val returnType: JKTypeElement val returnType: JKTypeElement
var block: JKBlock var block: JKBlock
} }
interface JKField : JKDeclaration, JKModifierListOwner { interface JKVariable : JKDeclaration {
var type: JKTypeElement var type: JKTypeElement
var name: JKNameIdentifier var name: JKNameIdentifier
var initializer: JKExpression var initializer: JKExpression
} }
interface JKLocalVariable : JKField interface JKForLoopVariable : JKVariable
interface JKModifier : JKTreeElement interface JKLocalVariable : JKVariable, JKMutabilityOwner
interface JKModifierList : JKTreeElement { interface JKExtraModifiersOwner : JKModifiersListOwner {
var modifiers: List<JKModifier> var extraModifiers: List<ExtraModifier>
} }
interface JKAccessModifier : JKModifier { interface Modifier {
enum class Visibility { val text: String
PUBLIC, INTERNAL, PACKAGE_PRIVATE, PROTECTED, PRIVATE
}
val visibility: Visibility
} }
interface JKModalityModifier : JKModifier { enum class ExtraModifier(override val text: String) : Modifier {
enum class Modality { ACTUAL("actual"),
OPEN, FINAL, ABSTRACT, OVERRIDE ANNOTATION("annotation"),
} COMPANION("companion"),
CONST("const"),
CROSSINLINE("crossinline"),
DATA("data"),
EXPECT("expect"),
EXTERNAL("external"),
INFIX("infix"),
INLINE("inline"),
INNER("inner"),
LATEINIT("lateinit"),
NOINLINE("noinline"),
OPERATOR("operator"),
OUT("out"),
REIFIED("reified"),
SEALED("sealed"),
SUSPEND("suspend"),
TAILREC("tailrec"),
VARARG("vararg"),
val modality: Modality NATIVE("native"),
STATIC("static"),
STRICTFP("strictfp"),
SYNCHRONIZED("synchronized"),
TRANSIENT("transient"),
VOLATILE("volatile")
} }
interface JKMutabilityModifier : JKModifier { interface JKVisibilityOwner : JKModifiersListOwner{
val mutability: Mutability var visibility: Visibility
} }
enum class Visibility(override val text: String) : Modifier {
PUBLIC("public"),
INTERNAL("internal"),
PACKAGE_PRIVATE(""),
PROTECTED("protected"),
PRIVATE("private")
}
interface JKModalityOwner : JKModifiersListOwner {
var modality: Modality
}
enum class Modality(override val text: String) : Modifier {
OPEN("open"),
FINAL("final"),
ABSTRACT("abstract"),
OVERRIDE("override")
}
interface JKMutabilityOwner : JKModifiersListOwner {
var mutability: Mutability
}
enum class Mutability(override val text: String) : Modifier {
MUTABLE("var"),
IMMUTABLE("val"),
UNKNOWN("var")//TODO ???
}
interface JKModifiersListOwner : JKTreeElement
fun JKModifiersListOwner.modifiers(): List<Modifier> =
listOfNotNull((this as? JKVisibilityOwner)?.visibility) +
(this as? JKExtraModifiersOwner)?.extraModifiers.orEmpty() +
listOfNotNull((this as? JKModalityOwner)?.modality) +
listOfNotNull((this as? JKMutabilityOwner)?.mutability)
interface JKTypeElement : JKTreeElement { interface JKTypeElement : JKTreeElement {
val type: JKType val type: JKType
} }
@@ -216,9 +273,7 @@ interface JKLiteralExpression : JKExpression {
} }
} }
interface JKParameter : JKField { interface JKParameter : JKVariable, JKModifiersListOwner
}
interface JKStringLiteralExpression : JKLiteralExpression { interface JKStringLiteralExpression : JKLiteralExpression {
val text: String val text: String
@@ -315,7 +370,7 @@ interface JKTypeParameterListOwner : JKTreeElement {
var typeParameterList: JKTypeParameterList var typeParameterList: JKTypeParameterList
} }
interface JKEnumConstant : JKField { interface JKEnumConstant : JKVariable {
val arguments: JKExpressionList val arguments: JKExpressionList
} }
+4 -11
View File
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.j2k.tree
import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol
interface JKKtGetterOrSetter : JKTreeElement, JKModifierListOwner, JKBranchElement { interface JKKtGetterOrSetter : JKTreeElement, JKVisibilityOwner, JKBranchElement {
var body: JKStatement var body: JKStatement
val kind: Kind val kind: Kind
@@ -34,10 +34,12 @@ interface JKKtProperty : JKField {
var setter: JKKtGetterOrSetter var setter: JKKtGetterOrSetter
} }
interface JKKtFunction : JKMethod { interface JKKtFunction : JKMethod {
} }
interface JKKtConstructor : JKDeclaration, JKModifierListOwner, JKMethod, JKBranchElement { interface JKKtConstructor : JKDeclaration, JKExtraModifiersOwner, JKMethod, JKBranchElement {
override var name: JKNameIdentifier override var name: JKNameIdentifier
override var parameters: List<JKParameter> override var parameters: List<JKParameter>
var delegationCall: JKExpression var delegationCall: JKExpression
@@ -53,15 +55,6 @@ interface JKKtAssignmentStatement : JKStatement {
interface JKKtCall : JKMethodCallExpression interface JKKtCall : JKMethodCallExpression
interface JKKtModifier : JKModifier {
val type: KtModifierType
enum class KtModifierType {
ACTUAL, ABSTRACT, ANNOTATION, COMPANION, CONST, CROSSINLINE, DATA, ENUM, EXPECT, EXTERNAL, FINAL, INFIX, INLINE, INNER,
LATEINIT, NOINLINE, OPEN, OPERATOR, OUT, OVERRIDE, REIFIED, SEALED, SUSPEND, TAILREC, VARARG, PRIVATE, PROTECTED
}
}
interface JKKtMethodCallExpression : JKMethodCallExpression interface JKKtMethodCallExpression : JKMethodCallExpression
interface JKKtAlsoCallExpression : JKKtMethodCallExpression { interface JKKtAlsoCallExpression : JKKtMethodCallExpression {
@@ -52,10 +52,6 @@ interface JKBranchElement : JKElement {
fun invalidate() fun invalidate()
} }
interface JKModifierListOwner {
var modifierList: JKModifierList
}
interface JKType { interface JKType {
val nullability: Nullability val nullability: Nullability
} }
@@ -12,13 +12,14 @@ interface JKVisitor<out R, in D> {
fun visitAnnotation(annotation: JKAnnotation, data: D): R = visitTreeElement(annotation, data) fun visitAnnotation(annotation: JKAnnotation, data: D): R = visitTreeElement(annotation, data)
fun visitAnnotationListOwner(annotationListOwner: JKAnnotationListOwner, data: D): R = visitTreeElement(annotationListOwner, data) fun visitAnnotationListOwner(annotationListOwner: JKAnnotationListOwner, data: D): R = visitTreeElement(annotationListOwner, data)
fun visitMethod(method: JKMethod, data: D): R = visitDeclaration(method, data) fun visitMethod(method: JKMethod, data: D): R = visitDeclaration(method, data)
fun visitField(field: JKField, data: D): R = visitDeclaration(field, data) fun visitVariable(variable: JKVariable, data: D): R = visitDeclaration(variable, data)
fun visitLocalVariable(localVariable: JKLocalVariable, data: D): R = visitField(localVariable, data) fun visitForLoopVariable(forLoopVariable: JKForLoopVariable, data: D): R = visitVariable(forLoopVariable, data)
fun visitModifier(modifier: JKModifier, data: D): R = visitTreeElement(modifier, data) fun visitLocalVariable(localVariable: JKLocalVariable, data: D): R = visitVariable(localVariable, data)
fun visitModifierList(modifierList: JKModifierList, data: D): R = visitTreeElement(modifierList, data) fun visitExtraModifiersOwner(extraModifiersOwner: JKExtraModifiersOwner, data: D): R = visitModifiersListOwner(extraModifiersOwner, data)
fun visitAccessModifier(accessModifier: JKAccessModifier, data: D): R = visitModifier(accessModifier, data) fun visitVisibilityOwner(visibilityOwner: JKVisibilityOwner, data: D): R = visitModifiersListOwner(visibilityOwner, data)
fun visitModalityModifier(modalityModifier: JKModalityModifier, data: D): R = visitModifier(modalityModifier, data) fun visitModalityOwner(modalityOwner: JKModalityOwner, data: D): R = visitModifiersListOwner(modalityOwner, data)
fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier, data: D): R = visitModifier(mutabilityModifier, data) fun visitMutabilityOwner(mutabilityOwner: JKMutabilityOwner, data: D): R = visitModifiersListOwner(mutabilityOwner, data)
fun visitModifiersListOwner(modifiersListOwner: JKModifiersListOwner, data: D): R = visitTreeElement(modifiersListOwner, data)
fun visitTypeElement(typeElement: JKTypeElement, data: D): R = visitTreeElement(typeElement, data) fun visitTypeElement(typeElement: JKTypeElement, data: D): R = visitTreeElement(typeElement, data)
fun visitStatement(statement: JKStatement, data: D): R = visitTreeElement(statement, data) fun visitStatement(statement: JKStatement, data: D): R = visitTreeElement(statement, data)
fun visitBlock(block: JKBlock, data: D): R = visitTreeElement(block, data) fun visitBlock(block: JKBlock, data: D): R = visitTreeElement(block, data)
@@ -43,7 +44,7 @@ interface JKVisitor<out R, in D> {
fun visitTypeCastExpression(typeCastExpression: JKTypeCastExpression, data: D): R = visitExpression(typeCastExpression, data) fun visitTypeCastExpression(typeCastExpression: JKTypeCastExpression, data: D): R = visitExpression(typeCastExpression, data)
fun visitExpressionList(expressionList: JKExpressionList, data: D): R = visitTreeElement(expressionList, data) fun visitExpressionList(expressionList: JKExpressionList, data: D): R = visitTreeElement(expressionList, data)
fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: D): R = visitExpression(literalExpression, data) fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: D): R = visitExpression(literalExpression, data)
fun visitParameter(parameter: JKParameter, data: D): R = visitField(parameter, data) fun visitParameter(parameter: JKParameter, data: D): R = visitVariable(parameter, data)
fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: D): R = visitLiteralExpression(stringLiteralExpression, data) fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: D): R = visitLiteralExpression(stringLiteralExpression, data)
fun visitStubExpression(stubExpression: JKStubExpression, data: D): R = visitExpression(stubExpression, data) fun visitStubExpression(stubExpression: JKStubExpression, data: D): R = visitExpression(stubExpression, data)
fun visitLoopStatement(loopStatement: JKLoopStatement, data: D): R = visitStatement(loopStatement, data) fun visitLoopStatement(loopStatement: JKLoopStatement, data: D): R = visitStatement(loopStatement, data)
@@ -69,9 +70,11 @@ interface JKVisitor<out R, in D> {
fun visitTypeParameterList(typeParameterList: JKTypeParameterList, data: D): R = visitTreeElement(typeParameterList, data) fun visitTypeParameterList(typeParameterList: JKTypeParameterList, data: D): R = visitTreeElement(typeParameterList, data)
fun visitTypeParameter(typeParameter: JKTypeParameter, data: D): R = visitTreeElement(typeParameter, data) fun visitTypeParameter(typeParameter: JKTypeParameter, data: D): R = visitTreeElement(typeParameter, data)
fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner, data: D): R = visitTreeElement(typeParameterListOwner, data) fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner, data: D): R = visitTreeElement(typeParameterListOwner, data)
fun visitEnumConstant(enumConstant: JKEnumConstant, data: D): R = visitField(enumConstant, data) fun visitEnumConstant(enumConstant: JKEnumConstant, data: D): R = visitVariable(enumConstant, data)
fun visitForInStatement(forInStatement: JKForInStatement, data: D): R = visitStatement(forInStatement, data) fun visitForInStatement(forInStatement: JKForInStatement, data: D): R = visitStatement(forInStatement, data)
fun visitPackageDeclaration(packageDeclaration: JKPackageDeclaration, data: D): R = visitDeclaration(packageDeclaration, data) fun visitPackageDeclaration(packageDeclaration: JKPackageDeclaration, data: D): R = visitDeclaration(packageDeclaration, data)
fun visitClassLiteralExpression(classLiteralExpression: JKClassLiteralExpression, data: D): R = visitExpression(classLiteralExpression, data)
fun visitField(field: JKField, data: D): R = visitVariable(field, data)
fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data) fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data)
fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data) fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data)
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data) fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data)
@@ -79,7 +82,6 @@ interface JKVisitor<out R, in D> {
fun visitEmptyClassBody(emptyClassBody: JKEmptyClassBody, data: D): R = visitClassBody(emptyClassBody, data) fun visitEmptyClassBody(emptyClassBody: JKEmptyClassBody, data: D): R = visitClassBody(emptyClassBody, data)
fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: D): R = visitExpression(javaNewExpression, data) fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: D): R = visitExpression(javaNewExpression, data)
fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: D): R = visitExpression(javaDefaultNewExpression, data) fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: D): R = visitExpression(javaDefaultNewExpression, data)
fun visitJavaModifier(javaModifier: JKJavaModifier, data: D): R = visitModifier(javaModifier, data)
fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: D): R = visitExpression(javaNewEmptyArray, data) fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: D): R = visitExpression(javaNewEmptyArray, data)
fun visitJavaNewArray(javaNewArray: JKJavaNewArray, data: D): R = visitExpression(javaNewArray, data) fun visitJavaNewArray(javaNewArray: JKJavaNewArray, data: D): R = visitExpression(javaNewArray, data)
fun visitJavaLiteralExpression(javaLiteralExpression: JKJavaLiteralExpression, data: D): R = visitLiteralExpression(javaLiteralExpression, data) fun visitJavaLiteralExpression(javaLiteralExpression: JKJavaLiteralExpression, data: D): R = visitLiteralExpression(javaLiteralExpression, data)
@@ -105,7 +107,6 @@ interface JKVisitor<out R, in D> {
fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): R = visitKtConstructor(ktPrimaryConstructor, data) fun visitKtPrimaryConstructor(ktPrimaryConstructor: JKKtPrimaryConstructor, data: D): R = visitKtConstructor(ktPrimaryConstructor, data)
fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): R = visitStatement(ktAssignmentStatement, data) fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: D): R = visitStatement(ktAssignmentStatement, data)
fun visitKtCall(ktCall: JKKtCall, data: D): R = visitMethodCallExpression(ktCall, data) fun visitKtCall(ktCall: JKKtCall, data: D): R = visitMethodCallExpression(ktCall, data)
fun visitKtModifier(ktModifier: JKKtModifier, data: D): R = visitModifier(ktModifier, data)
fun visitKtMethodCallExpression(ktMethodCallExpression: JKKtMethodCallExpression, data: D): R = visitMethodCallExpression(ktMethodCallExpression, data) fun visitKtMethodCallExpression(ktMethodCallExpression: JKKtMethodCallExpression, data: D): R = visitMethodCallExpression(ktMethodCallExpression, data)
fun visitKtAlsoCallExpression(ktAlsoCallExpression: JKKtAlsoCallExpression, data: D): R = visitKtMethodCallExpression(ktAlsoCallExpression, data) fun visitKtAlsoCallExpression(ktAlsoCallExpression: JKKtAlsoCallExpression, data: D): R = visitKtMethodCallExpression(ktAlsoCallExpression, data)
fun visitKtLiteralExpression(ktLiteralExpression: JKKtLiteralExpression, data: D): R = visitLiteralExpression(ktLiteralExpression, data) fun visitKtLiteralExpression(ktLiteralExpression: JKKtLiteralExpression, data: D): R = visitLiteralExpression(ktLiteralExpression, data)
@@ -21,20 +21,22 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitAnnotationListOwner(annotationListOwner: JKAnnotationListOwner, data: Nothing?) = visitAnnotationListOwner(annotationListOwner) override fun visitAnnotationListOwner(annotationListOwner: JKAnnotationListOwner, data: Nothing?) = visitAnnotationListOwner(annotationListOwner)
fun visitMethod(method: JKMethod) = visitDeclaration(method, null) fun visitMethod(method: JKMethod) = visitDeclaration(method, null)
override fun visitMethod(method: JKMethod, data: Nothing?) = visitMethod(method) override fun visitMethod(method: JKMethod, data: Nothing?) = visitMethod(method)
fun visitField(field: JKField) = visitDeclaration(field, null) fun visitVariable(variable: JKVariable) = visitDeclaration(variable, null)
override fun visitField(field: JKField, data: Nothing?) = visitField(field) override fun visitVariable(variable: JKVariable, data: Nothing?) = visitVariable(variable)
fun visitLocalVariable(localVariable: JKLocalVariable) = visitField(localVariable, null) fun visitForLoopVariable(forLoopVariable: JKForLoopVariable) = visitVariable(forLoopVariable, null)
override fun visitForLoopVariable(forLoopVariable: JKForLoopVariable, data: Nothing?) = visitForLoopVariable(forLoopVariable)
fun visitLocalVariable(localVariable: JKLocalVariable) = visitVariable(localVariable, null)
override fun visitLocalVariable(localVariable: JKLocalVariable, data: Nothing?) = visitLocalVariable(localVariable) override fun visitLocalVariable(localVariable: JKLocalVariable, data: Nothing?) = visitLocalVariable(localVariable)
fun visitModifier(modifier: JKModifier) = visitTreeElement(modifier, null) fun visitExtraModifiersOwner(extraModifiersOwner: JKExtraModifiersOwner) = visitModifiersListOwner(extraModifiersOwner, null)
override fun visitModifier(modifier: JKModifier, data: Nothing?) = visitModifier(modifier) override fun visitExtraModifiersOwner(extraModifiersOwner: JKExtraModifiersOwner, data: Nothing?) = visitExtraModifiersOwner(extraModifiersOwner)
fun visitModifierList(modifierList: JKModifierList) = visitTreeElement(modifierList, null) fun visitVisibilityOwner(visibilityOwner: JKVisibilityOwner) = visitModifiersListOwner(visibilityOwner, null)
override fun visitModifierList(modifierList: JKModifierList, data: Nothing?) = visitModifierList(modifierList) override fun visitVisibilityOwner(visibilityOwner: JKVisibilityOwner, data: Nothing?) = visitVisibilityOwner(visibilityOwner)
fun visitAccessModifier(accessModifier: JKAccessModifier) = visitModifier(accessModifier, null) fun visitModalityOwner(modalityOwner: JKModalityOwner) = visitModifiersListOwner(modalityOwner, null)
override fun visitAccessModifier(accessModifier: JKAccessModifier, data: Nothing?) = visitAccessModifier(accessModifier) override fun visitModalityOwner(modalityOwner: JKModalityOwner, data: Nothing?) = visitModalityOwner(modalityOwner)
fun visitModalityModifier(modalityModifier: JKModalityModifier) = visitModifier(modalityModifier, null) fun visitMutabilityOwner(mutabilityOwner: JKMutabilityOwner) = visitModifiersListOwner(mutabilityOwner, null)
override fun visitModalityModifier(modalityModifier: JKModalityModifier, data: Nothing?) = visitModalityModifier(modalityModifier) override fun visitMutabilityOwner(mutabilityOwner: JKMutabilityOwner, data: Nothing?) = visitMutabilityOwner(mutabilityOwner)
fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier) = visitModifier(mutabilityModifier, null) fun visitModifiersListOwner(modifiersListOwner: JKModifiersListOwner) = visitTreeElement(modifiersListOwner, null)
override fun visitMutabilityModifier(mutabilityModifier: JKMutabilityModifier, data: Nothing?) = visitMutabilityModifier(mutabilityModifier) override fun visitModifiersListOwner(modifiersListOwner: JKModifiersListOwner, data: Nothing?) = visitModifiersListOwner(modifiersListOwner)
fun visitTypeElement(typeElement: JKTypeElement) = visitTreeElement(typeElement, null) fun visitTypeElement(typeElement: JKTypeElement) = visitTreeElement(typeElement, null)
override fun visitTypeElement(typeElement: JKTypeElement, data: Nothing?) = visitTypeElement(typeElement) override fun visitTypeElement(typeElement: JKTypeElement, data: Nothing?) = visitTypeElement(typeElement)
fun visitStatement(statement: JKStatement) = visitTreeElement(statement, null) fun visitStatement(statement: JKStatement) = visitTreeElement(statement, null)
@@ -83,7 +85,7 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitExpressionList(expressionList: JKExpressionList, data: Nothing?) = visitExpressionList(expressionList) override fun visitExpressionList(expressionList: JKExpressionList, data: Nothing?) = visitExpressionList(expressionList)
fun visitLiteralExpression(literalExpression: JKLiteralExpression) = visitExpression(literalExpression, null) fun visitLiteralExpression(literalExpression: JKLiteralExpression) = visitExpression(literalExpression, null)
override fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: Nothing?) = visitLiteralExpression(literalExpression) override fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: Nothing?) = visitLiteralExpression(literalExpression)
fun visitParameter(parameter: JKParameter) = visitField(parameter, null) fun visitParameter(parameter: JKParameter) = visitVariable(parameter, null)
override fun visitParameter(parameter: JKParameter, data: Nothing?) = visitParameter(parameter) override fun visitParameter(parameter: JKParameter, data: Nothing?) = visitParameter(parameter)
fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression) = visitLiteralExpression(stringLiteralExpression, null) fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression) = visitLiteralExpression(stringLiteralExpression, null)
override fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: Nothing?) = visitStringLiteralExpression(stringLiteralExpression) override fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: Nothing?) = visitStringLiteralExpression(stringLiteralExpression)
@@ -135,12 +137,16 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitTypeParameter(typeParameter: JKTypeParameter, data: Nothing?) = visitTypeParameter(typeParameter) override fun visitTypeParameter(typeParameter: JKTypeParameter, data: Nothing?) = visitTypeParameter(typeParameter)
fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner) = visitTreeElement(typeParameterListOwner, null) fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner) = visitTreeElement(typeParameterListOwner, null)
override fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner, data: Nothing?) = visitTypeParameterListOwner(typeParameterListOwner) override fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner, data: Nothing?) = visitTypeParameterListOwner(typeParameterListOwner)
fun visitEnumConstant(enumConstant: JKEnumConstant) = visitField(enumConstant, null) fun visitEnumConstant(enumConstant: JKEnumConstant) = visitVariable(enumConstant, null)
override fun visitEnumConstant(enumConstant: JKEnumConstant, data: Nothing?) = visitEnumConstant(enumConstant) override fun visitEnumConstant(enumConstant: JKEnumConstant, data: Nothing?) = visitEnumConstant(enumConstant)
fun visitForInStatement(forInStatement: JKForInStatement) = visitStatement(forInStatement, null) fun visitForInStatement(forInStatement: JKForInStatement) = visitStatement(forInStatement, null)
override fun visitForInStatement(forInStatement: JKForInStatement, data: Nothing?) = visitForInStatement(forInStatement) override fun visitForInStatement(forInStatement: JKForInStatement, data: Nothing?) = visitForInStatement(forInStatement)
fun visitPackageDeclaration(packageDeclaration: JKPackageDeclaration) = visitDeclaration(packageDeclaration, null) fun visitPackageDeclaration(packageDeclaration: JKPackageDeclaration) = visitDeclaration(packageDeclaration, null)
override fun visitPackageDeclaration(packageDeclaration: JKPackageDeclaration, data: Nothing?) = visitPackageDeclaration(packageDeclaration) override fun visitPackageDeclaration(packageDeclaration: JKPackageDeclaration, data: Nothing?) = visitPackageDeclaration(packageDeclaration)
fun visitClassLiteralExpression(classLiteralExpression: JKClassLiteralExpression) = visitExpression(classLiteralExpression, null)
override fun visitClassLiteralExpression(classLiteralExpression: JKClassLiteralExpression, data: Nothing?) = visitClassLiteralExpression(classLiteralExpression)
fun visitField(field: JKField) = visitVariable(field, null)
override fun visitField(field: JKField, data: Nothing?) = visitField(field)
fun visitJavaField(javaField: JKJavaField) = visitField(javaField, null) fun visitJavaField(javaField: JKJavaField) = visitField(javaField, null)
override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField) override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField)
fun visitJavaMethod(javaMethod: JKJavaMethod) = visitMethod(javaMethod, null) fun visitJavaMethod(javaMethod: JKJavaMethod) = visitMethod(javaMethod, null)
@@ -155,8 +161,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: Nothing?) = visitJavaNewExpression(javaNewExpression) override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression, data: Nothing?) = visitJavaNewExpression(javaNewExpression)
fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression) = visitExpression(javaDefaultNewExpression, null) fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression) = visitExpression(javaDefaultNewExpression, null)
override fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: Nothing?) = visitJavaDefaultNewExpression(javaDefaultNewExpression) override fun visitJavaDefaultNewExpression(javaDefaultNewExpression: JKJavaDefaultNewExpression, data: Nothing?) = visitJavaDefaultNewExpression(javaDefaultNewExpression)
fun visitJavaModifier(javaModifier: JKJavaModifier) = visitModifier(javaModifier, null)
override fun visitJavaModifier(javaModifier: JKJavaModifier, data: Nothing?) = visitJavaModifier(javaModifier)
fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray) = visitExpression(javaNewEmptyArray, null) fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray) = visitExpression(javaNewEmptyArray, null)
override fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: Nothing?) = visitJavaNewEmptyArray(javaNewEmptyArray) override fun visitJavaNewEmptyArray(javaNewEmptyArray: JKJavaNewEmptyArray, data: Nothing?) = visitJavaNewEmptyArray(javaNewEmptyArray)
fun visitJavaNewArray(javaNewArray: JKJavaNewArray) = visitExpression(javaNewArray, null) fun visitJavaNewArray(javaNewArray: JKJavaNewArray) = visitExpression(javaNewArray, null)
@@ -207,8 +211,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?) = visitKtAssignmentStatement(ktAssignmentStatement) override fun visitKtAssignmentStatement(ktAssignmentStatement: JKKtAssignmentStatement, data: Nothing?) = visitKtAssignmentStatement(ktAssignmentStatement)
fun visitKtCall(ktCall: JKKtCall) = visitMethodCallExpression(ktCall, null) fun visitKtCall(ktCall: JKKtCall) = visitMethodCallExpression(ktCall, null)
override fun visitKtCall(ktCall: JKKtCall, data: Nothing?) = visitKtCall(ktCall) override fun visitKtCall(ktCall: JKKtCall, data: Nothing?) = visitKtCall(ktCall)
fun visitKtModifier(ktModifier: JKKtModifier) = visitModifier(ktModifier, null)
override fun visitKtModifier(ktModifier: JKKtModifier, data: Nothing?) = visitKtModifier(ktModifier)
fun visitKtMethodCallExpression(ktMethodCallExpression: JKKtMethodCallExpression) = visitMethodCallExpression(ktMethodCallExpression, null) fun visitKtMethodCallExpression(ktMethodCallExpression: JKKtMethodCallExpression) = visitMethodCallExpression(ktMethodCallExpression, null)
override fun visitKtMethodCallExpression(ktMethodCallExpression: JKKtMethodCallExpression, data: Nothing?) = visitKtMethodCallExpression(ktMethodCallExpression) override fun visitKtMethodCallExpression(ktMethodCallExpression: JKKtMethodCallExpression, data: Nothing?) = visitKtMethodCallExpression(ktMethodCallExpression)
fun visitKtAlsoCallExpression(ktAlsoCallExpression: JKKtAlsoCallExpression) = visitKtMethodCallExpression(ktAlsoCallExpression, null) fun visitKtAlsoCallExpression(ktAlsoCallExpression: JKKtAlsoCallExpression) = visitKtMethodCallExpression(ktAlsoCallExpression, null)