New J2K: move all symbols definitions to symbols package

This commit is contained in:
Ilya Kirillov
2019-07-17 19:09:44 +03:00
parent f79b282c60
commit d7960caf89
35 changed files with 487 additions and 407 deletions
@@ -12,8 +12,8 @@ import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.nj2k.conversions.JKResolver
import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.psi.*
@@ -43,7 +43,7 @@ class JKSymbolProvider(project: Project, module: Module, contextElement: PsiElem
is KtParameter -> JKMultiversePropertySymbol(psi, this)
is PsiParameter -> JKMultiverseFieldSymbol(psi, this)
is PsiLocalVariable -> JKMultiverseFieldSymbol(psi, this)
is PsiPackage -> JKMultiversePackageSymbol(psi)
is PsiPackage -> JKMultiversePackageSymbol(psi, this)
else -> TODO(psi::class.toString())
}
@@ -89,7 +89,7 @@ class JKSymbolProvider(project: Project, module: Module, contextElement: PsiElem
fun transferSymbol(to: JKDeclaration, from: JKDeclaration) = symbolsByJK[from]?.also {
@Suppress("UNCHECKED_CAST")
it as JKUniverseSymbol<JKTreeElement>
it as JKUniverseSymbol<JKDeclaration>
it.target = to
symbolsByJK[to] = it
}
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
import org.jetbrains.kotlin.j2k.ReferenceSearcher
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression.LiteralType.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
@@ -356,16 +356,17 @@ class JavaToJKTreeBuilder constructor(
it.assignNonCodeElements(this)
}
}
fun PsiFunctionalExpression.functionalType(): JKTypeElement =
functionalInterfaceType?.toJK(symbolProvider)?.takeUnless { type ->
type.isKotlinFunctionType
}?.asTypeElement() ?: JKTypeElementImpl(JKNoTypeImpl)
fun PsiMethodReferenceExpression.toJK(): JKMethodReferenceExpression {
val symbol = symbolProvider.provideSymbolForReference<JKNamedSymbol>(this).let { symbol ->
val symbol = symbolProvider.provideSymbolForReference<JKSymbol>(this).let { symbol ->
when {
symbol.isUnresolved() && isConstructor -> JKUnresolvedClassSymbol(qualifier?.text ?: text)
symbol.isUnresolved() && !isConstructor -> JKUnresolvedMethod(referenceName ?: text)
symbol.isUnresolved && isConstructor -> JKUnresolvedClassSymbol(qualifier?.text ?: text)
symbol.isUnresolved && !isConstructor -> JKUnresolvedMethod(referenceName ?: text)
else -> symbol
}
}
@@ -19,6 +19,8 @@ package org.jetbrains.kotlin.nj2k
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.conversions.parentOfType
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.symbols.getDisplayName
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitorWithCommentsPrinting
@@ -173,7 +175,7 @@ class NewCodeBuilder(context: NewJ2kConverterContext) {
}
override fun visitFileRaw(file: JKFile) {
if (file.packageDeclaration.packageName.value.isNotEmpty()) {
if (file.packageDeclaration.name.value.isNotEmpty()) {
file.packageDeclaration.accept(this)
}
file.importList.accept(this)
@@ -183,8 +185,7 @@ class NewCodeBuilder(context: NewJ2kConverterContext) {
override fun visitPackageDeclarationRaw(packageDeclaration: JKPackageDeclaration) {
printer.printWithNoIndent("package ")
val packageNameEscaped =
packageDeclaration.packageName.value.escapedAsQualifiedName()
val packageNameEscaped = packageDeclaration.name.value.escapedAsQualifiedName()
printer.printlnWithNoIndent(packageNameEscaped)
}
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaMethodDescriptor
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
import org.jetbrains.kotlin.nj2k.*
import org.jetbrains.kotlin.nj2k.symbols.JKUniverseMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKUniverseMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.psi
class AddElementsInfoConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
@@ -11,9 +11,9 @@
package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.symbols.JKUniverseFieldSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKUniverseFieldSymbol
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -8,6 +8,9 @@ package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.nj2k.*
import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKUnresolvedField
import org.jetbrains.kotlin.nj2k.symbols.deepestFqName
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.utils.addToStdlib.cast
@@ -12,9 +12,9 @@ package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.symbols.JKSymbol
import org.jetbrains.kotlin.nj2k.symbols.fqNameToImport
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.fqNameToImport
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -6,9 +6,9 @@
package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.*
import org.jetbrains.kotlin.nj2k.symbols.JKUniverseMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKUniverseMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.psi
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -7,8 +7,12 @@ package org.jetbrains.kotlin.nj2k.conversions
import com.intellij.psi.PsiEnumConstant
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKClassAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtQualifierImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKQualifiedExpressionImpl
import org.jetbrains.kotlin.psi.psiUtil.containingClass
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.equalsExpression
import org.jetbrains.kotlin.nj2k.symbols.deepestFqName
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.deepestFqName
class EqualsOperatorConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.j2k.ReferenceSearcher
import org.jetbrains.kotlin.j2k.hasWriteAccesses
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.nj2k.*
import org.jetbrains.kotlin.nj2k.symbols.deepestFqName
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import kotlin.math.abs
@@ -5,9 +5,9 @@
package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKBlockStatementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKClassSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.JKLambdaExpressionImpl
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -9,6 +9,8 @@ import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.isEquals
import org.jetbrains.kotlin.nj2k.parenthesizeIfBinaryExpression
import org.jetbrains.kotlin.nj2k.symbols.isUnresolved
import org.jetbrains.kotlin.nj2k.symbols.parameterTypesWithUnfoldedVarargs
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
@@ -78,7 +80,7 @@ class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : Rec
private fun convertMethodCallExpression(expression: JKMethodCallExpression) {
if (expression.identifier.isUnresolved()) return
if (expression.identifier.isUnresolved) return
val parameterTypes = expression.identifier.parameterTypesWithUnfoldedVarargs() ?: return
val newArguments =
(expression.arguments.arguments.asSequence() zip parameterTypes)
@@ -7,8 +7,12 @@ package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.findUsages
import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKBooleanLiteral
import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaLiteralExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaPrimitiveTypeImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKNullLiteral
class ImplicitInitializerConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKUniverseClassSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.symbols.JKUnresolvedClassSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
@@ -9,6 +9,7 @@ import com.intellij.lang.jvm.JvmModifier
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.nullIfStubExpression
import org.jetbrains.kotlin.nj2k.qualified
import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
@@ -13,8 +13,12 @@ import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.asQualifierWithThisAsSelector
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.parentOfType
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKClassAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtQualifierImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKQualifiedExpressionImpl
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtObjectDeclaration
@@ -16,6 +16,8 @@ import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.kotlinTypeByName
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKUniverseClassSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.nj2k.conversions.RecursiveApplicableConversionBase
import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -0,0 +1,32 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.nj2k.symbols
import com.intellij.psi.PsiClass
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.tree.JKClass
import org.jetbrains.kotlin.psi.KtClassOrObject
sealed class JKClassSymbol : JKSymbol
class JKUniverseClassSymbol(override val symbolProvider: JKSymbolProvider) : JKClassSymbol(), JKUniverseSymbol<JKClass> {
override lateinit var target: JKClass
override val name: String
get() = target.name.value
}
class JKMultiverseClassSymbol(
override val target: PsiClass,
override val symbolProvider: JKSymbolProvider
) : JKClassSymbol(), JKMultiverseSymbol<PsiClass>
class JKMultiverseKtClassSymbol(
override val target: KtClassOrObject,
override val symbolProvider: JKSymbolProvider
) : JKClassSymbol(), JKMultiverseKtSymbol<KtClassOrObject>
class JKUnresolvedClassSymbol(override val target: String) : JKClassSymbol(), JKUnresolvedSymbol
@@ -0,0 +1,68 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.nj2k.symbols
import com.intellij.psi.PsiVariable
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.tree.JKType
import org.jetbrains.kotlin.nj2k.tree.JKVariable
import org.jetbrains.kotlin.nj2k.tree.impl.JKClassTypeImpl
import org.jetbrains.kotlin.nj2k.tree.toJK
import org.jetbrains.kotlin.psi.KtCallableDeclaration
import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.psi.psiUtil.containingClass
sealed class JKFieldSymbol : JKSymbol {
abstract val fieldType: JKType?
}
class JKUniverseFieldSymbol(override val symbolProvider: JKSymbolProvider) : JKFieldSymbol(), JKUniverseSymbol<JKVariable> {
override val fieldType: JKType
get() = target.type.type
override lateinit var target: JKVariable
}
class JKMultiverseFieldSymbol(
override val target: PsiVariable,
override val symbolProvider: JKSymbolProvider
) : JKFieldSymbol(), JKMultiverseSymbol<PsiVariable> {
override val fieldType: JKType
get() = target.type.toJK(symbolProvider)
}
class JKMultiversePropertySymbol(
override val target: KtCallableDeclaration,
override val symbolProvider: JKSymbolProvider
) : JKFieldSymbol(), JKMultiverseKtSymbol<KtCallableDeclaration> {
override val fieldType: JKType?
get() = target.typeReference?.toJK(symbolProvider)
}
class JKMultiverseKtEnumEntrySymbol(
override val target: KtEnumEntry,
override val symbolProvider: JKSymbolProvider
) : JKFieldSymbol(), JKMultiverseKtSymbol<KtEnumEntry> {
override val fieldType: JKType?
get() = JKClassTypeImpl(
symbolProvider.provideDirectSymbol(target.containingClass()!!) as JKClassSymbol,
emptyList(),
Nullability.NotNull
)
}
class JKUnresolvedField(
override val target: String,
private val symbolProvider: JKSymbolProvider
) : JKFieldSymbol(), JKUnresolvedSymbol {
override val fieldType: JKType
get() =
JKClassTypeImpl(symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.nothing.toSafe()), emptyList())
}
@@ -0,0 +1,97 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.nj2k.symbols
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiReference
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.tree.JKClass
import org.jetbrains.kotlin.nj2k.tree.JKMethod
import org.jetbrains.kotlin.nj2k.tree.JKType
import org.jetbrains.kotlin.nj2k.tree.impl.JKClassTypeImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKNoTypeImpl
import org.jetbrains.kotlin.nj2k.tree.toJK
import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
sealed class JKMethodSymbol : JKSymbol {
abstract val receiverType: JKType?
abstract val parameterTypes: List<JKType>?
abstract val returnType: JKType?
}
class JKUniverseMethodSymbol(override val symbolProvider: JKSymbolProvider) : JKMethodSymbol(), JKUniverseSymbol<JKMethod> {
override val receiverType: JKType?
get() = target.parent.safeAs<JKClass>()?.let {
JKClassTypeImpl(symbolProvider.provideUniverseSymbol(it), emptyList()/*TODO*/)
}
override val parameterTypes: List<JKType>
get() = target.parameters.map { it.type.type }
override val returnType: JKType
get() = target.returnType.type
override lateinit var target: JKMethod
}
class JKMultiverseMethodSymbol(
override val target: PsiMethod,
override val symbolProvider: JKSymbolProvider
) : JKMethodSymbol(), JKMultiverseSymbol<PsiMethod> {
override val receiverType: JKType?
get() = target.containingClass?.let {
JKClassTypeImpl(symbolProvider.provideDirectSymbol(it) as JKClassSymbol, emptyList()/*TODO*/)
}
override val parameterTypes: List<JKType>
get() = target.parameterList.parameters.map { it.type.toJK(symbolProvider) }
override val returnType: JKType
get() = target.returnType!!.toJK(symbolProvider)
override val fqName: String
get() {
val kotlinFqName = super.fqName
return if (target is KtLightMethod) "$kotlinFqName.$name" else kotlinFqName
}
}
class JKMultiverseFunctionSymbol(
override val target: KtFunction,
override val symbolProvider: JKSymbolProvider
) : JKMethodSymbol(), JKMultiverseKtSymbol<KtFunction> {
override val receiverType: JKType?
get() = target.receiverTypeReference?.toJK(symbolProvider)
@Suppress("UNCHECKED_CAST")
override val parameterTypes: List<JKType>?
get() = target.valueParameters.map { parameter ->
val type = parameter.typeReference?.toJK(symbolProvider)
type?.let {
if (parameter.isVarArg) {
JKClassTypeImpl(
symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.array.toSafe()),
listOf(it)
)
} else it
}
}.takeIf { parameters -> parameters.all { it != null } } as? List<JKType>
override val returnType: JKType?
get() = target.typeReference?.toJK(symbolProvider)
}
class JKUnresolvedMethod(
override val target: String,
override val returnType: JKType = JKNoTypeImpl
) : JKMethodSymbol(), JKUnresolvedSymbol {
constructor(target: PsiReference) : this(target.canonicalText)
override val receiverType: JKType?
get() = null
override val parameterTypes: List<JKType>
get() = emptyList()
}
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.nj2k.symbols
import com.intellij.psi.PsiPackage
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
sealed class JKPackageSymbol : JKSymbol {
abstract override val target: PsiPackage
}
class JKMultiversePackageSymbol(
override val target: PsiPackage,
override val symbolProvider: JKSymbolProvider
) : JKPackageSymbol(), JKMultiverseSymbol<PsiPackage>
@@ -0,0 +1,82 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.nj2k.symbols
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMember
import com.intellij.psi.PsiNamedElement
import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.conversions.parentOfType
import org.jetbrains.kotlin.nj2k.parentOfType
import org.jetbrains.kotlin.nj2k.tree.JKDeclaration
import org.jetbrains.kotlin.nj2k.tree.JKFile
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtNamedDeclaration
interface JKSymbol {
val target: Any
val declaredIn: JKSymbol?
val fqName: String
val name: String
}
interface JKUniverseSymbol<T : JKDeclaration> : JKSymbol {
val symbolProvider: JKSymbolProvider
override var target: T
override val fqName: String
get() {
val qualifier =
declaredIn?.fqName
?: target
.parentOfType<JKFile>()
?.packageDeclaration
?.name
?.value
return qualifier?.takeIf { it.isNotBlank() }?.let { "$it." }.orEmpty() + name
}
override val name: String
get() = target.name.value
override val declaredIn: JKSymbol?
get() = target.parentOfType<JKDeclaration>()?.let { symbolProvider.symbolsByJK[it] }
}
interface JKMultiverseSymbol<T> : JKSymbol where T : PsiNamedElement, T : PsiElement {
val symbolProvider: JKSymbolProvider
override val target: T
override val declaredIn: JKSymbol?
get() = target.parentOfType<PsiMember>()?.let { symbolProvider.provideDirectSymbol(it) }
override val fqName: String
get() = target.getKotlinFqName()?.asString() ?: name
override val name: String
get() = target.name!!
}
interface JKMultiverseKtSymbol<T : KtNamedDeclaration> : JKSymbol {
val symbolProvider: JKSymbolProvider
override val target: T
override val name: String
get() = target.name!!
override val declaredIn: JKSymbol?
get() = target.parentOfType<KtDeclaration>()?.let { symbolProvider.provideDirectSymbol(it) }
override val fqName: String
get() = target.fqName?.asString() ?: name
}
interface JKUnresolvedSymbol : JKSymbol {
override val target: String
override val declaredIn: JKSymbol?
get() = null
override val fqName: String
get() = target
override val name: String
get() = target.substringAfterLast(".")
}
@@ -0,0 +1,43 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.nj2k.symbols
import com.intellij.psi.PsiTypeParameter
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.tree.JKTypeParameter
import org.jetbrains.kotlin.nj2k.tree.JKTypeParameterListOwner
import org.jetbrains.kotlin.psi.KtTypeParameter
import org.jetbrains.kotlin.psi.KtTypeParameterListOwner
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
sealed class JKTypeParameterSymbol : JKSymbol {
abstract val index: Int
}
class JKMultiverseTypeParameterSymbol(
override val target: PsiTypeParameter,
override val symbolProvider: JKSymbolProvider
) : JKTypeParameterSymbol(), JKMultiverseSymbol<PsiTypeParameter> {
override val index: Int
get() = target.index
}
class JKUniverseTypeParameterSymbol(
override val symbolProvider: JKSymbolProvider
) : JKTypeParameterSymbol(), JKUniverseSymbol<JKTypeParameter> {
override val index: Int
get() = declaredIn?.safeAs<JKTypeParameterListOwner>()?.typeParameterList?.typeParameters?.indexOf(target) ?: -1
override lateinit var target: JKTypeParameter
}
class JKMultiverseKtTypeParameterSymbol(
override val target: KtTypeParameter,
override val symbolProvider: JKSymbolProvider
) : JKTypeParameterSymbol(), JKMultiverseKtSymbol<KtTypeParameter> {
override val index: Int
get() = target.getParentOfType<KtTypeParameterListOwner>(strict = false)?.typeParameters?.indexOf(target) ?: -1
}
@@ -0,0 +1,74 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.nj2k.symbols
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiModifier
import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
import org.jetbrains.kotlin.idea.search.declarationsSearch.findDeepestSuperMethodsNoWrapping
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.psi
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
val JKSymbol.isUnresolved
get() = this is JKUnresolvedSymbol
fun JKSymbol.getDisplayName(): String {
if (this !is JKUniverseSymbol<*>) return fqName
return generateSequence(declaredIn as? JKUniverseClassSymbol) { symbol ->
symbol.declaredIn.safeAs<JKUniverseClassSymbol>()?.takeIf { !it.target.hasOtherModifier(OtherModifier.INNER) }
}.fold(name) { acc, symbol -> "${symbol.name}.$acc" }
}
fun JKSymbol.fqNameToImport(): String? =
when {
this is JKClassSymbol && this !is JKUniverseClassSymbol -> fqName
else -> null
}
fun JKSymbol.deepestFqName(): String? {
fun Any.deepestFqNameForTarget(): String? =
when (this) {
is PsiMethod -> (findDeepestSuperMethods().firstOrNull() ?: this).getKotlinFqName()?.asString()
is KtNamedFunction -> findDeepestSuperMethodsNoWrapping(this).firstOrNull()?.getKotlinFqName()?.asString()
is JKMethod -> psi<PsiElement>()?.deepestFqNameForTarget()
else -> null
}
return target.deepestFqNameForTarget() ?: fqName
}
val JKMethodSymbol.parameterNames: List<String>?
get() {
return when (this) {
is JKMultiverseFunctionSymbol -> target.valueParameters.map { it.name ?: return null }
is JKMultiverseMethodSymbol -> target.parameters.map { it.name ?: return null }
is JKUniverseMethodSymbol -> target.parameters.map { it.name.value }
is JKUnresolvedMethod -> null
}
}
val JKMethodSymbol.isStatic: Boolean
get() = when (this) {
is JKMultiverseFunctionSymbol -> target.parent is KtObjectDeclaration
is JKMultiverseMethodSymbol -> target.hasModifierProperty(PsiModifier.STATIC)
is JKUniverseMethodSymbol -> target.parent?.parent?.safeAs<JKClass>()?.classKind == JKClass.ClassKind.COMPANION
is JKUnresolvedMethod -> false
}
fun JKMethodSymbol.parameterTypesWithUnfoldedVarargs(): Sequence<JKType>? {
val realParameterTypes = parameterTypes ?: return null
if (realParameterTypes.isEmpty()) return emptySequence()
val lastArrayType = realParameterTypes.last().arrayInnerType() ?: return realParameterTypes.asSequence()
return realParameterTypes.dropLast(1).asSequence() + generateSequence { lastArrayType }
}
@@ -21,6 +21,8 @@ import com.intellij.psi.impl.source.tree.ElementType.OPERATION_BIT_SET
import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression.LiteralType.*
import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitor
@@ -432,5 +434,6 @@ class JKKtAnnotationArrayInitializerExpressionImpl(initializers: List<JKAnnotati
class JKJavaStaticInitDeclarationImpl(block: JKBlock) : JKJavaStaticInitDeclaration() {
override var block: JKBlock by child(block)
override var name: JKNameIdentifier by child(JKNameIdentifierImpl("<init>"))
override fun accept(visitor: JKVisitor) = visitor.visitJavaStaticInitDeclaration(this)
}
@@ -16,18 +16,17 @@
package org.jetbrains.kotlin.nj2k.tree.impl
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression.LiteralType
import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression.LiteralType.BOOLEAN
import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression.LiteralType.NULL
import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.psi.KtClass
class JKTreeRootImpl(element: JKTreeElement) : JKTreeRoot, JKBranchElementBase() {
override var element by child(element)
@@ -527,8 +526,8 @@ fun JKStatement.isEmpty(): Boolean =
else -> false
}
class JKPackageDeclarationImpl(packageName: JKNameIdentifier) : JKPackageDeclaration() {
override var packageName: JKNameIdentifier by child(packageName)
class JKPackageDeclarationImpl(name: JKNameIdentifier) : JKPackageDeclaration() {
override var name: JKNameIdentifier by child(name)
override fun accept(visitor: JKVisitor) = visitor.visitPackageDeclaration(this)
}
@@ -636,7 +635,7 @@ class JKOtherModifierElementImpl(override var otherModifier: OtherModifier) : JK
class JKMethodReferenceExpressionImpl(
qualifier: JKExpression,
override val identifier: JKNamedSymbol,
override val identifier: JKSymbol,
functionalType: JKTypeElement,
override val isConstructorCall: Boolean
) : JKMethodReferenceExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.nj2k.tree.impl
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.types.expressions.OperatorConventions
@@ -259,6 +260,7 @@ class JKKtIsExpressionImpl(expression: JKExpression, type: JKTypeElement) : JKKt
class JKKtInitDeclarationImpl(block: JKBlock) : JKKtInitDeclaration() {
override var block: JKBlock by child(block)
override val name: JKNameIdentifier by child(JKNameIdentifierImpl("<name>"))
override fun accept(visitor: JKVisitor) = visitor.visitKtInitDeclaration(this)
}
@@ -1,365 +0,0 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.nj2k.tree.impl
import com.intellij.psi.*
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
import org.jetbrains.kotlin.idea.search.declarationsSearch.findDeepestSuperMethodsNoWrapping
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.conversions.parentOfType
import org.jetbrains.kotlin.nj2k.parentOfType
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClass
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
interface JKSymbol {
val target: Any
val declaredIn: JKSymbol?
val fqName: String
}
interface JKUnresolvedSymbol : JKSymbol
fun JKSymbol.isUnresolved() =
this is JKUnresolvedSymbol
interface JKNamedSymbol : JKSymbol {
val name: String
}
abstract class JKUniverseSymbol<T : JKTreeElement> : JKNamedSymbol {
abstract override var target: T
protected abstract val symbolProvider: JKSymbolProvider
override val declaredIn: JKSymbol?
get() = target.parentOfType<JKDeclaration>()?.let { symbolProvider.symbolsByJK[it] }
override val fqName: String
get() {
val qualifier =
declaredIn?.fqName
?: target
.parentOfType<JKFile>()
?.packageDeclaration
?.packageName
?.value
return qualifier?.takeIf { it.isNotBlank() }?.let { "$it." }.orEmpty() + name
}
}
fun JKSymbol.getDisplayName(): String {
if (this !is JKUniverseSymbol<*>) return fqName
return generateSequence(declaredIn as? JKUniverseClassSymbol) { symbol ->
symbol.declaredIn.safeAs<JKUniverseClassSymbol>()?.takeIf { !it.target.hasOtherModifier(OtherModifier.INNER) }
}.fold(name) { acc, symbol -> "${symbol.name}.$acc" }
}
fun JKSymbol.fqNameToImport(): String? =
when {
this is JKClassSymbol && this !is JKUniverseClassSymbol -> fqName
else -> null
}
interface JKClassSymbol : JKNamedSymbol
interface JKMethodSymbol : JKNamedSymbol {
override val fqName: String
val receiverType: JKType?
val parameterTypes: List<JKType>?
val returnType: JKType?
}
val JKMethodSymbol.parameterNames: List<String>?
get() {
return when (this) {
is JKMultiverseFunctionSymbol -> target.valueParameters.map { it.name ?: return null }
is JKMultiverseMethodSymbol -> target.parameters.map { it.name ?: return null }
is JKUniverseMethodSymbol -> target.parameters.map { it.name.value }
is JKUnresolvedSymbol -> null
else -> null
}
}
val JKMethodSymbol.isStatic: Boolean
get() = when (this) {
is JKMultiverseFunctionSymbol -> target.parent is KtObjectDeclaration
is JKMultiverseMethodSymbol -> target.hasModifierProperty(PsiModifier.STATIC)
is JKUniverseMethodSymbol -> target.parent?.parent?.safeAs<JKClass>()?.classKind == JKClass.ClassKind.COMPANION
is JKUnresolvedSymbol -> false
else -> false
}
fun JKMethodSymbol.parameterTypesWithUnfoldedVarargs(): Sequence<JKType>? {
val realParameterTypes = parameterTypes ?: return null
if (realParameterTypes.isEmpty()) return emptySequence()
val lastArrayType = realParameterTypes.last().arrayInnerType() ?: return realParameterTypes.asSequence()
return realParameterTypes.dropLast(1).asSequence() + generateSequence { lastArrayType }
}
interface JKFieldSymbol : JKNamedSymbol {
override val fqName: String
val fieldType: JKType?
}
class JKUniverseClassSymbol(override val symbolProvider: JKSymbolProvider) : JKClassSymbol, JKUniverseSymbol<JKClass>() {
override lateinit var target: JKClass
override val name: String
get() = target.name.value
}
class JKMultiverseClassSymbol(
override val target: PsiClass,
private val symbolProvider: JKSymbolProvider
) : JKClassSymbol {
override val declaredIn: JKSymbol?
get() = target.parentOfType<PsiMember>()?.let { symbolProvider.provideDirectSymbol(it) }
override val fqName: String
get() = target.getKotlinFqName()?.asString() ?: target.qualifiedName ?: name
override val name: String
get() = target.name!!
}
class JKMultiverseKtClassSymbol(
override val target: KtClassOrObject,
private val symbolProvider: JKSymbolProvider
) : JKClassSymbol {
override val name: String
get() = target.name!!
override val declaredIn: JKSymbol?
get() = target.parentOfType<KtDeclaration>()?.let { symbolProvider.provideDirectSymbol(it) }
override val fqName: String
get() = target.fqName?.asString() ?: name
}
class JKUniverseMethodSymbol(override val symbolProvider: JKSymbolProvider) : JKMethodSymbol, JKUniverseSymbol<JKMethod>() {
override val receiverType: JKType?
get() = (target.parent as? JKClass)?.let {
JKClassTypeImpl(symbolProvider.provideUniverseSymbol(it), emptyList()/*TODO*/)
}
override val parameterTypes: List<JKType>
get() = target.parameters.map { it.type.type }
override val returnType: JKType
get() = target.returnType.type
override val name: String
get() = target.name.value
override lateinit var target: JKMethod
}
class JKMultiverseMethodSymbol(override val target: PsiMethod, private val symbolProvider: JKSymbolProvider) : JKMethodSymbol {
override val receiverType: JKType?
get() = target.containingClass?.let {
JKClassTypeImpl(symbolProvider.provideDirectSymbol(it) as JKClassSymbol, emptyList()/*TODO*/)
}
override val parameterTypes: List<JKType>
get() = target.parameterList.parameters.map { it.type.toJK(symbolProvider) }
override val returnType: JKType
get() = target.returnType!!.toJK(symbolProvider)
override val name: String
get() = target.name
override val declaredIn: JKSymbol?
get() = target.containingClass?.let { symbolProvider.provideDirectSymbol(it) }
override val fqName: String
get() {
val kotlinFqName = target.getKotlinFqName()?.asString() ?: return name
return if (target is KtLightMethod) "$kotlinFqName.$name" else kotlinFqName
}
}
class JKMultiverseFunctionSymbol(override val target: KtFunction, private val symbolProvider: JKSymbolProvider) : JKMethodSymbol {
override val receiverType: JKType?
get() = target.receiverTypeReference?.toJK(symbolProvider)
@Suppress("UNCHECKED_CAST")
override val parameterTypes: List<JKType>?
get() = target.valueParameters.map { parameter ->
val type = parameter.typeReference?.toJK(symbolProvider)
type?.let {
if (parameter.isVarArg) {
JKClassTypeImpl(
symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.array.toSafe()),
listOf(it)
)
} else it
}
}.takeIf { parameters -> parameters.all { it != null } } as? List<JKType>
override val returnType: JKType?
get() = target.typeReference?.toJK(symbolProvider)
override val name: String
get() = target.name!!
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String
get() = target.fqName?.asString() ?: target.name!!
}
class JKUniverseFieldSymbol(override val symbolProvider: JKSymbolProvider) : JKFieldSymbol, JKUniverseSymbol<JKVariable>() {
override val fieldType: JKType
get() = target.type.type
override val name: String
get() = target.name.value
override lateinit var target: JKVariable
}
class JKMultiverseFieldSymbol(override val target: PsiVariable, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val fieldType: JKType
get() = target.type.toJK(symbolProvider)
override val name: String
get() = target.name!!
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String
get() = target.getKotlinFqName()?.asString() ?: target.name!!
}
class JKMultiversePropertySymbol(override val target: KtCallableDeclaration, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val fieldType: JKType?
get() = target.typeReference?.toJK(symbolProvider)
override val name: String
get() = target.name!!
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String
get() = target.fqName!!.asString()
}
class JKMultiverseKtEnumEntrySymbol(override val target: KtEnumEntry, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
override val fieldType: JKType?
get() = JKClassTypeImpl(
symbolProvider.provideDirectSymbol(target.containingClass()!!) as JKClassSymbol,
emptyList(),
Nullability.NotNull
)
override val name: String
get() = target.name!!
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String
get() = target.fqName!!.asString()
}
class JKUnresolvedField(override val target: String, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol, JKUnresolvedSymbol {
override val fieldType: JKType
get() {
val resolvedType = (target as? PsiReferenceExpressionImpl)?.type
if (resolvedType != null) return resolvedType.toJK(symbolProvider)
return JKClassTypeImpl(symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.nothing.toSafe()), emptyList())
}
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String = target
override val name: String
get() = target.substringAfterLast('.')
}
class JKUnresolvedMethod(
override val target: String,
override val returnType: JKType = JKNoTypeImpl
) : JKMethodSymbol, JKUnresolvedSymbol {
constructor(target: PsiReference) : this(target.canonicalText)
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String = target
override val receiverType: JKType?
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val parameterTypes: List<JKType>
get() = TODO(target) //To change initializer of created properties use File | Settings | File Templates.
override val name: String
get() = target.substringAfterLast('.')
}
class JKUnresolvedClassSymbol(override val target: String) : JKClassSymbol, JKUnresolvedSymbol {
override val declaredIn: JKSymbol
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
override val fqName: String
get() = target
override val name: String
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? =
when (this) {
is PsiMethod -> (findDeepestSuperMethods().firstOrNull() ?: this).getKotlinFqName()?.asString()
is KtNamedFunction -> findDeepestSuperMethodsNoWrapping(this).firstOrNull()?.getKotlinFqName()?.asString()
is JKMethod -> psi<PsiElement>()?.deepestFqNameForTarget()
else -> null
}
return target.deepestFqNameForTarget() ?: fqName
}
interface JKTypeParameterSymbol : JKSymbol {
val index: Int
val name: String
}
class JKMultiverseTypeParameterSymbol(
override val target: PsiTypeParameter,
private val symbolProvider: JKSymbolProvider
) : JKTypeParameterSymbol {
override val declaredIn: JKSymbol?
get() = target.owner?.let { symbolProvider.provideDirectSymbol(it) }
override val fqName: String
get() = target.getKotlinFqName()?.asString()!!
override val index: Int
get() = target.index
override val name: String
get() = target.name!!
}
class JKUniverseTypeParameterSymbol(
override val symbolProvider: JKSymbolProvider
) : JKTypeParameterSymbol, JKUniverseSymbol<JKTypeParameter>() {
override val index: Int
get() = declaredIn?.safeAs<JKTypeParameterListOwner>()?.typeParameterList?.typeParameters?.indexOf(target) ?: -1
override val name: String
get() = target.name.value
override lateinit var target: JKTypeParameter
}
class JKMultiverseKtTypeParameterSymbol(
override val target: KtTypeParameter,
private val symbolProvider: JKSymbolProvider
) : JKTypeParameterSymbol {
override val declaredIn: JKSymbol?
get() = target.getParentOfType<KtTypeParameterListOwner>(strict = false)
?.let { symbolProvider.provideDirectSymbol(it) }
override val fqName: String
get() = target.getKotlinFqName()?.asString()!!
override val index: Int
get() = target.getParentOfType<KtTypeParameterListOwner>(strict = false)?.typeParameters?.indexOf(target) ?: -1
override val name: String
get() = target.name!!
}
+5 -1
View File
@@ -16,7 +16,11 @@
package org.jetbrains.kotlin.nj2k.tree
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.JKBranchElementBase
import org.jetbrains.kotlin.nj2k.tree.impl.JKModalityModifierElementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKTokenElementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKVisibilityModifierElementImpl
abstract class JKField : JKVariable(), JKVisibilityOwner, JKMutabilityOwner, JKModalityOwner, JKOtherModifiersOwner, JKAnnotationListOwner
+7 -11
View File
@@ -17,7 +17,10 @@
package org.jetbrains.kotlin.nj2k.tree
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKBranchElementBase
import org.jetbrains.kotlin.nj2k.tree.impl.JKSpaceElementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKTokenElementImpl
import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitor
interface JKTreeElement : JKElement, JKNonCodeElementsListOwner {
@@ -36,6 +39,7 @@ interface PsiOwner {
abstract class JKDeclaration : JKTreeElement, JKBranchElementBase() {
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n"))
abstract val name: JKNameIdentifier
}
interface JKImportStatement : JKTreeElement {
@@ -55,10 +59,7 @@ interface JKFile : JKTreeElement, JKBranchElement {
abstract class JKClass : JKDeclaration(), JKVisibilityOwner, JKOtherModifiersOwner, JKModalityOwner, JKTypeParameterListOwner,
JKAnnotationListOwner,
JKBranchElement {
abstract val name: JKNameIdentifier
abstract val inheritance: JKInheritanceInfo
abstract var classBody: JKClassBody
abstract var classKind: ClassKind
@@ -105,7 +106,6 @@ interface JKAnnotationListOwner : JKTreeElement {
abstract class JKMethod : JKDeclaration(), JKVisibilityOwner, JKModalityOwner, JKOtherModifiersOwner, JKTypeParameterListOwner,
JKAnnotationListOwner {
abstract val name: JKNameIdentifier
abstract var parameters: List<JKParameter>
abstract var returnType: JKTypeElement
abstract var block: JKBlock
@@ -116,7 +116,6 @@ abstract class JKMethod : JKDeclaration(), JKVisibilityOwner, JKModalityOwner, J
abstract class JKVariable : JKDeclaration(), JKAnnotationListOwner {
abstract var type: JKTypeElement
abstract var name: JKNameIdentifier
abstract var initializer: JKExpression
}
@@ -285,7 +284,7 @@ interface JKExpression : JKTreeElement, JKAnnotationMemberValue
interface JKMethodReferenceExpression : JKExpression, PsiOwner {
val qualifier: JKExpression
val identifier: JKNamedSymbol
val identifier: JKSymbol
val functionalType: JKTypeElement
val isConstructorCall: Boolean
}
@@ -487,7 +486,6 @@ interface JKTypeParameterList : JKTreeElement {
}
abstract class JKTypeParameter : JKDeclaration() {
abstract var name: JKNameIdentifier
abstract var upperBounds: List<JKTypeElement>
}
@@ -506,9 +504,7 @@ abstract class JKForInStatement : JKStatement() {
abstract var body: JKStatement
}
abstract class JKPackageDeclaration : JKDeclaration() {
abstract var packageName: JKNameIdentifier
}
abstract class JKPackageDeclaration : JKDeclaration()
interface JKClassLiteralExpression : JKExpression {
val classType: JKTypeElement
@@ -17,9 +17,9 @@
package org.jetbrains.kotlin.nj2k.tree
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKTypeParameterSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.JKBranchElementBase
import org.jetbrains.kotlin.nj2k.tree.impl.JKClassSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.JKTypeParameterSymbol
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
import kotlin.jvm.internal.CallableReference
import kotlin.reflect.KProperty0
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.nj2k.tree
import com.intellij.psi.*
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.builtins.getFunctionalClassKind
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
@@ -17,9 +16,9 @@ import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.kotlinTypeByName
import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtTypeParameter