diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/JKSymbolProvider.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/JKSymbolProvider.kt index 0248051e471..8ed2ec71693 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/JKSymbolProvider.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/JKSymbolProvider.kt @@ -41,6 +41,7 @@ class JKSymbolProvider { is KtParameter -> JKMultiversePropertySymbol(psi, this) is PsiParameter -> JKMultiverseFieldSymbol(psi, this) is PsiLocalVariable -> JKMultiverseFieldSymbol(psi, this) + is PsiPackage -> JKMultiversePackageSymbol(psi) else -> TODO(psi::class.toString()) } diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt index 9636227b72f..1d6d1705546 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt @@ -377,6 +377,7 @@ class JavaToJKTreeBuilder constructor( return when (symbol) { is JKClassSymbol -> JKClassAccessExpressionImpl(symbol) is JKFieldSymbol -> JKFieldAccessExpressionImpl(symbol) + is JKPackageSymbol -> JKPackageAccessExpressionImpl(symbol) else -> TODO() }.qualified(qualifierExpression?.toJK()).also { it.assignNonCodeElements(this) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/NewCodeBuilder.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/NewCodeBuilder.kt index af6cd5091d7..6bc95876b7e 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/NewCodeBuilder.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/NewCodeBuilder.kt @@ -745,6 +745,10 @@ class NewCodeBuilder { printer.par(SQUARE) { arrayAccessExpression.indexExpression.accept(this) } } + override fun visitPackageAccessExpressionRaw(packageAccessExpression: JKPackageAccessExpression) { + printer.printWithNoIndent(packageAccessExpression.identifier.name.escaped()) + } + override fun visitDelegationConstructorCallRaw(delegationConstructorCall: JKDelegationConstructorCall) { delegationConstructorCall.expression.accept(this) printer.par { diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/jk.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/jk.kt index 352caecb56c..652944c503d 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/jk.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/jk.kt @@ -422,6 +422,11 @@ class JKFieldAccessExpressionImpl(override var identifier: JKFieldSymbol) : JKFi PsiOwner by PsiOwnerImpl() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitFieldAccessExpression(this, data) } +class JKPackageAccessExpressionImpl(override var identifier: JKPackageSymbol) : JKPackageAccessExpression, JKElementBase(), + PsiOwner by PsiOwnerImpl() { + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitPackageAccessExpression(this, data) +} + val JKStatement.statements: List get() = diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/symbols.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/symbols.kt index 6f10b480fff..9e3b97cc3d1 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/symbols.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/impl/symbols.kt @@ -274,6 +274,21 @@ class JKUnresolvedClassSymbol(override val target: String) : JKClassSymbol, JKUn get() = target.substringAfterLast('.') } +interface JKPackageSymbol : JKNamedSymbol { + override val target: PsiPackage +} + +class JKMultiversePackageSymbol(override val target: PsiPackage) : JKPackageSymbol { + override val declaredIn + get() = TODO("not implemented") + + override val name: String + get() = target.name.orEmpty() + + override val fqName: String + get() = target.qualifiedName +} + fun JKSymbol.deepestFqName(): String? { fun Any.deepestFqNameForTarget(): String? = diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt index f7e86aa3a85..d505cbb0769 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/jk.kt @@ -333,6 +333,10 @@ interface JKFieldAccessExpression : JKAssignableExpression { val identifier: JKFieldSymbol } +interface JKPackageAccessExpression : JKAssignableExpression { + val identifier: JKPackageSymbol +} + interface JKClassAccessExpression : JKExpression { val identifier: JKClassSymbol } diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt index 71ad9e5aad5..e8516684909 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt @@ -47,6 +47,7 @@ interface JKVisitor { fun visitTypeArgumentListOwner(typeArgumentListOwner: JKTypeArgumentListOwner, data: D): R = visitTreeElement(typeArgumentListOwner, data) fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression, data: D): R = visitExpression(methodCallExpression, data) fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression, data: D): R = visitAssignableExpression(fieldAccessExpression, data) + fun visitPackageAccessExpression(packageAccessExpression: JKPackageAccessExpression, data: D): R = visitAssignableExpression(packageAccessExpression, data) fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression, data: D): R = visitExpression(classAccessExpression, data) fun visitArrayAccessExpression(arrayAccessExpression: JKArrayAccessExpression, data: D): R = visitAssignableExpression(arrayAccessExpression, data) fun visitParenthesizedExpression(parenthesizedExpression: JKParenthesizedExpression, data: D): R = visitExpression(parenthesizedExpression, data) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorVoid.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorVoid.kt index d84aa8a39da..a67de1c0af0 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorVoid.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorVoid.kt @@ -91,6 +91,8 @@ interface JKVisitorVoid : JKVisitor { override fun visitMethodCallExpression(methodCallExpression: JKMethodCallExpression, data: Nothing?) = visitMethodCallExpression(methodCallExpression) fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression) = visitAssignableExpression(fieldAccessExpression, null) override fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression, data: Nothing?) = visitFieldAccessExpression(fieldAccessExpression) + fun visitPackageAccessExpression(packageAccessExpression: JKPackageAccessExpression) = visitAssignableExpression(packageAccessExpression, null) + override fun visitPackageAccessExpression(packageAccessExpression: JKPackageAccessExpression, data: Nothing?) = visitPackageAccessExpression(packageAccessExpression) fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression) = visitExpression(classAccessExpression, null) override fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression, data: Nothing?) = visitClassAccessExpression(classAccessExpression) fun visitArrayAccessExpression(arrayAccessExpression: JKArrayAccessExpression) = visitAssignableExpression(arrayAccessExpression, null) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt index 174c9ac78ee..983784faaf2 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt @@ -358,6 +358,14 @@ interface JKVisitorWithCommentsPrinting : JKVisitorVoid { fun visitFieldAccessExpressionRaw(fieldAccessExpression: JKFieldAccessExpression) = visitAssignableExpressionRaw(fieldAccessExpression) + override fun visitPackageAccessExpression(packageAccessExpression: JKPackageAccessExpression) { + printLeftNonCodeElements(packageAccessExpression) + visitPackageAccessExpressionRaw(packageAccessExpression) + printRightNonCodeElements(packageAccessExpression) + } + + fun visitPackageAccessExpressionRaw(packageAccessExpression: JKPackageAccessExpression) = visitAssignableExpressionRaw(packageAccessExpression) + override fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression) { printLeftNonCodeElements(classAccessExpression) visitClassAccessExpressionRaw(classAccessExpression)