New J2K: move all symbols definitions to symbols package
This commit is contained in:
@@ -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
|
||||
|
||||
+1
-1
@@ -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() {
|
||||
|
||||
|
||||
+2
@@ -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!!
|
||||
}
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user