Add separate FirJava elements (class, method, parameter, type reference)
Related to KT-29218
This commit is contained in:
@@ -9,11 +9,16 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
|
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall
|
import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.*
|
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||||
|
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||||
|
import org.jetbrains.kotlin.fir.java.declarations.FirJavaMethod
|
||||||
|
import org.jetbrains.kotlin.fir.java.declarations.FirJavaValueParameter
|
||||||
|
import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef
|
||||||
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl
|
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
||||||
@@ -91,8 +96,7 @@ class JavaSymbolProvider(
|
|||||||
// TODO: this.name
|
// TODO: this.name
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is JavaLiteralAnnotationArgument -> {
|
is JavaLiteralAnnotationArgument -> {
|
||||||
val value = value
|
when (val value = value) {
|
||||||
when (value) {
|
|
||||||
is ByteArray -> value.toList().createArrayOfCall(IrConstKind.Byte)
|
is ByteArray -> value.toList().createArrayOfCall(IrConstKind.Byte)
|
||||||
is ShortArray -> value.toList().createArrayOfCall(IrConstKind.Short)
|
is ShortArray -> value.toList().createArrayOfCall(IrConstKind.Short)
|
||||||
is IntArray -> value.toList().createArrayOfCall(IrConstKind.Int)
|
is IntArray -> value.toList().createArrayOfCall(IrConstKind.Int)
|
||||||
@@ -136,23 +140,17 @@ class JavaSymbolProvider(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun flexibleType(create: (isNullable: Boolean) -> ConeLookupTagBasedType): ConeFlexibleType {
|
|
||||||
return ConeFlexibleType(create(false), create(true))
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun JavaClassifierType.toFirResolvedTypeRef(): FirResolvedTypeRef {
|
private fun JavaClassifierType.toFirResolvedTypeRef(): FirResolvedTypeRef {
|
||||||
val coneType = when (val classifier = classifier) {
|
val coneType = when (val classifier = classifier) {
|
||||||
is JavaClass -> {
|
is JavaClass -> {
|
||||||
val symbol = ConeClassLikeLookupTagImpl(classifier.classId!!)
|
val lookupTag = ConeClassLikeLookupTagImpl(classifier.classId!!)
|
||||||
flexibleType { isNullable ->
|
ConeClassTypeImpl(lookupTag, typeArguments.map { it.toConeProjection() }.toTypedArray(), isNullable = false)
|
||||||
ConeClassTypeImpl(symbol, typeArguments.map { it.toConeProjection() }.toTypedArray(), isNullable)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
is JavaTypeParameter -> {
|
is JavaTypeParameter -> {
|
||||||
// TODO: it's unclear how to identify type parameter by the symbol
|
// TODO: it's unclear how to identify type parameter by the symbol
|
||||||
// TODO: some type parameter cache (provider?)
|
// TODO: some type parameter cache (provider?)
|
||||||
val symbol = createTypeParameterSymbol(classifier.name)
|
val symbol = createTypeParameterSymbol(classifier.name)
|
||||||
flexibleType { isNullable -> ConeTypeParameterTypeImpl(symbol, isNullable) }
|
ConeTypeParameterTypeImpl(symbol, isNullable = false)
|
||||||
}
|
}
|
||||||
else -> ConeClassErrorType(reason = "Unexpected classifier: $classifier")
|
else -> ConeClassErrorType(reason = "Unexpected classifier: $classifier")
|
||||||
}
|
}
|
||||||
@@ -162,6 +160,11 @@ class JavaSymbolProvider(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun JavaType.toFirJavaTypeRef(): FirJavaTypeRef {
|
||||||
|
val annotations = (this as? JavaClassifierType)?.annotations.orEmpty()
|
||||||
|
return FirJavaTypeRef(session, annotations = annotations.map { it.toFirAnnotationCall() }, type = this)
|
||||||
|
}
|
||||||
|
|
||||||
private fun JavaType.toFirResolvedTypeRef(): FirResolvedTypeRef {
|
private fun JavaType.toFirResolvedTypeRef(): FirResolvedTypeRef {
|
||||||
if (this is JavaClassifierType) return toFirResolvedTypeRef()
|
if (this is JavaClassifierType) return toFirResolvedTypeRef()
|
||||||
return FirResolvedTypeRefImpl(
|
return FirResolvedTypeRefImpl(
|
||||||
@@ -204,23 +207,19 @@ class JavaSymbolProvider(
|
|||||||
val methodName = javaMethod.name
|
val methodName = javaMethod.name
|
||||||
val methodId = CallableId(callableId.packageName, callableId.className, methodName)
|
val methodId = CallableId(callableId.packageName, callableId.className, methodName)
|
||||||
val methodSymbol = FirFunctionSymbol(methodId)
|
val methodSymbol = FirFunctionSymbol(methodId)
|
||||||
val memberFunction = FirMemberFunctionImpl(
|
val memberFunction = FirJavaMethod(
|
||||||
session, null, methodSymbol, methodName,
|
session, methodSymbol, methodName,
|
||||||
javaMethod.visibility, javaMethod.modality,
|
javaMethod.visibility, javaMethod.modality,
|
||||||
isExpect = false, isActual = false, isOverride = false,
|
returnTypeRef = javaMethod.returnType.toFirJavaTypeRef()
|
||||||
isOperator = true, isInfix = false, isInline = false,
|
|
||||||
isTailRec = false, isExternal = false, isSuspend = false,
|
|
||||||
receiverTypeRef = null, returnTypeRef = javaMethod.returnType.toFirResolvedTypeRef()
|
|
||||||
).apply {
|
).apply {
|
||||||
for (typeParameter in javaMethod.typeParameters) {
|
for (typeParameter in javaMethod.typeParameters) {
|
||||||
typeParameters += createTypeParameterSymbol(typeParameter.name).fir
|
typeParameters += createTypeParameterSymbol(typeParameter.name).fir
|
||||||
}
|
}
|
||||||
addAnnotationsFrom(javaMethod)
|
addAnnotationsFrom(javaMethod)
|
||||||
for (valueParameter in javaMethod.valueParameters) {
|
for (valueParameter in javaMethod.valueParameters) {
|
||||||
valueParameters += FirValueParameterImpl(
|
valueParameters += FirJavaValueParameter(
|
||||||
session, null, valueParameter.name ?: Name.special("<anonymous Java parameter>"),
|
session, valueParameter.name ?: Name.special("<anonymous Java parameter>"),
|
||||||
returnTypeRef = valueParameter.type.toFirResolvedTypeRef(),
|
returnTypeRef = valueParameter.type.toFirJavaTypeRef(),
|
||||||
defaultValue = null, isCrossinline = false, isNoinline = false,
|
|
||||||
isVararg = valueParameter.isVararg
|
isVararg = valueParameter.isVararg
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -252,13 +251,10 @@ class JavaSymbolProvider(
|
|||||||
}
|
}
|
||||||
}) { firSymbol, foundClass ->
|
}) { firSymbol, foundClass ->
|
||||||
foundClass?.let { javaClass ->
|
foundClass?.let { javaClass ->
|
||||||
FirClassImpl(
|
FirJavaClass(
|
||||||
session, null, firSymbol as FirClassSymbol, javaClass.name,
|
session, firSymbol as FirClassSymbol, javaClass.name,
|
||||||
javaClass.visibility, javaClass.modality,
|
javaClass.visibility, javaClass.modality,
|
||||||
isExpect = false, isActual = false,
|
javaClass.classKind, javaClass.isStatic
|
||||||
classKind = javaClass.classKind,
|
|
||||||
isInner = !javaClass.isStatic, isCompanion = false,
|
|
||||||
isData = false, isInline = false
|
|
||||||
).apply {
|
).apply {
|
||||||
for (typeParameter in javaClass.typeParameters) {
|
for (typeParameter in javaClass.typeParameters) {
|
||||||
typeParameters += createTypeParameterSymbol(typeParameter.name).fir
|
typeParameters += createTypeParameterSymbol(typeParameter.name).fir
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.java.declarations
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class FirJavaClass(
|
||||||
|
session: FirSession,
|
||||||
|
symbol: FirClassSymbol,
|
||||||
|
name: Name,
|
||||||
|
visibility: Visibility,
|
||||||
|
modality: Modality?,
|
||||||
|
classKind: ClassKind,
|
||||||
|
isStatic: Boolean
|
||||||
|
) : FirClassImpl(
|
||||||
|
session, psi = null, symbol = symbol, name = name,
|
||||||
|
visibility = visibility, modality = modality,
|
||||||
|
isExpect = false, isActual = false, classKind = classKind, isInner = !isStatic,
|
||||||
|
isCompanion = false, isData = false, isInline = false
|
||||||
|
)
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.java.declarations
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberFunctionImpl
|
||||||
|
import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class FirJavaMethod(
|
||||||
|
session: FirSession,
|
||||||
|
symbol: FirFunctionSymbol,
|
||||||
|
name: Name,
|
||||||
|
visibility: Visibility,
|
||||||
|
modality: Modality?,
|
||||||
|
returnTypeRef: FirJavaTypeRef
|
||||||
|
) : FirMemberFunctionImpl(
|
||||||
|
session, null, symbol, name,
|
||||||
|
visibility, modality,
|
||||||
|
false, isActual = false,
|
||||||
|
isOverride = false, // TODO: really it's unknown whether Java methods are overrides or not
|
||||||
|
isOperator = true, // All Java methods with name that allows to use it in operator form are considered operators
|
||||||
|
isInfix = false, isInline = false, isTailRec = false, isExternal = false, isSuspend = false,
|
||||||
|
receiverTypeRef = null, returnTypeRef = returnTypeRef
|
||||||
|
)
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.java.declarations
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||||
|
import org.jetbrains.kotlin.fir.java.types.FirJavaTypeRef
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class FirJavaValueParameter(
|
||||||
|
session: FirSession,
|
||||||
|
name: Name,
|
||||||
|
returnTypeRef: FirJavaTypeRef,
|
||||||
|
isVararg: Boolean
|
||||||
|
) : FirValueParameterImpl(
|
||||||
|
session, psi = null, name = name, returnTypeRef = returnTypeRef,
|
||||||
|
defaultValue = null, isCrossinline = false, isNoinline = false, isVararg = isVararg
|
||||||
|
)
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.java.types
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
|
||||||
|
import org.jetbrains.kotlin.load.java.structure.JavaType
|
||||||
|
|
||||||
|
class FirJavaTypeRef(
|
||||||
|
session: FirSession,
|
||||||
|
annotations: List<FirAnnotationCall>,
|
||||||
|
val type: JavaType
|
||||||
|
) : FirUserTypeRefImpl(session, psi = null,isMarkedNullable = false) {
|
||||||
|
init {
|
||||||
|
this.annotations += annotations
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -397,7 +397,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun KtClassOrObject.toDelegatedSelfType(): FirTypeRef =
|
private fun KtClassOrObject.toDelegatedSelfType(): FirTypeRef =
|
||||||
FirUserTypeRefImpl(session, this, isNullable = false).apply {
|
FirUserTypeRefImpl(session, this, isMarkedNullable = false).apply {
|
||||||
qualifier.add(FirQualifierPartImpl(nameAsSafeName))
|
qualifier.add(FirQualifierPartImpl(nameAsSafeName))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
|
|||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction, FirModifiableFunction {
|
open class FirMemberFunctionImpl : FirAbstractCallableMember, FirNamedFunction, FirModifiableFunction {
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
|
|
||||||
class FirValueParameterImpl(
|
open class FirValueParameterImpl(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
psi: PsiElement?,
|
psi: PsiElement?,
|
||||||
name: Name,
|
name: Name,
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
|||||||
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
|
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
|
|
||||||
class FirUserTypeRefImpl(
|
open class FirUserTypeRefImpl(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
psi: PsiElement?,
|
psi: PsiElement?,
|
||||||
isNullable: Boolean
|
isMarkedNullable: Boolean
|
||||||
) : FirAbstractAnnotatedTypeRef(session, psi, isNullable), FirUserTypeRef {
|
) : FirAbstractAnnotatedTypeRef(session, psi, isMarkedNullable), FirUserTypeRef {
|
||||||
override val qualifier = mutableListOf<FirQualifierPart>()
|
override val qualifier = mutableListOf<FirQualifierPart>()
|
||||||
|
|
||||||
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
|
||||||
|
|||||||
Reference in New Issue
Block a user