FIR: set PSI elements in JavaSymbolProvider / enhancement scope

Related to KT-24351
This commit is contained in:
Mikhail Glukhikh
2019-07-29 18:00:11 +03:00
parent 0c4134bef4
commit 10e42a55c9
9 changed files with 39 additions and 16 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.backend package org.jetbrains.kotlin.fir.backend
import com.intellij.psi.PsiCompiledElement
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
@@ -23,6 +24,7 @@ import org.jetbrains.kotlin.types.Variance
internal fun <T : IrElement> FirElement.convertWithOffsets( internal fun <T : IrElement> FirElement.convertWithOffsets(
f: (startOffset: Int, endOffset: Int) -> T f: (startOffset: Int, endOffset: Int) -> T
): T { ): T {
if (psi is PsiCompiledElement) return f(-1, -1)
val startOffset = psi?.startOffsetSkippingComments ?: -1 val startOffset = psi?.startOffsetSkippingComments ?: -1
val endOffset = psi?.endOffset ?: -1 val endOffset = psi?.endOffset ?: -1
return f(startOffset, endOffset) return f(startOffset, endOffset)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.java package org.jetbrains.kotlin.fir.java
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
@@ -32,6 +33,7 @@ import org.jetbrains.kotlin.load.java.JavaClassFinder
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter import org.jetbrains.kotlin.load.java.structure.JavaTypeParameter
import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -157,7 +159,8 @@ class JavaSymbolProvider(
} }
} }
FirJavaClass( FirJavaClass(
session, firSymbol as FirClassSymbol, javaClass.name, session, (javaClass as? JavaElementImpl<*>)?.psi,
firSymbol as FirClassSymbol, javaClass.name,
javaClass.visibility, javaClass.modality, javaClass.visibility, javaClass.modality,
javaClass.classKind, isTopLevel = isTopLevel, javaClass.classKind, isTopLevel = isTopLevel,
isStatic = javaClass.isStatic, isStatic = javaClass.isStatic,
@@ -176,7 +179,8 @@ class JavaSymbolProvider(
val fieldSymbol = FirFieldSymbol(fieldId) val fieldSymbol = FirFieldSymbol(fieldId)
val returnType = javaField.type val returnType = javaField.type
val firJavaField = FirJavaField( val firJavaField = FirJavaField(
this@JavaSymbolProvider.session, fieldSymbol, fieldName, this@JavaSymbolProvider.session, (javaField as? JavaElementImpl<*>)?.psi,
fieldSymbol, fieldName,
javaField.visibility, javaField.modality, javaField.visibility, javaField.modality,
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack), returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack),
isVar = !javaField.isFinal, isVar = !javaField.isFinal,
@@ -192,7 +196,8 @@ class JavaSymbolProvider(
val methodSymbol = FirNamedFunctionSymbol(methodId) val methodSymbol = FirNamedFunctionSymbol(methodId)
val returnType = javaMethod.returnType val returnType = javaMethod.returnType
val firJavaMethod = FirJavaMethod( val firJavaMethod = FirJavaMethod(
this@JavaSymbolProvider.session, methodSymbol, methodName, this@JavaSymbolProvider.session, (javaMethod as? JavaElementImpl<*>)?.psi,
methodSymbol, methodName,
javaMethod.visibility, javaMethod.modality, javaMethod.visibility, javaMethod.modality,
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack), returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack),
isStatic = javaMethod.isStatic isStatic = javaMethod.isStatic
@@ -212,12 +217,14 @@ class JavaSymbolProvider(
fun addJavaConstructor( fun addJavaConstructor(
visibility: Visibility = this.visibility, visibility: Visibility = this.visibility,
psi: PsiElement? = null,
isPrimary: Boolean = false isPrimary: Boolean = false
): FirJavaConstructor { ): FirJavaConstructor {
val constructorSymbol = FirConstructorSymbol(constructorId) val constructorSymbol = FirConstructorSymbol(constructorId)
val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack) val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack)
val firJavaConstructor = FirJavaConstructor( val firJavaConstructor = FirJavaConstructor(
this@JavaSymbolProvider.session, constructorSymbol, visibility, isPrimary, this@JavaSymbolProvider.session, psi,
constructorSymbol, visibility, isPrimary,
FirResolvedTypeRefImpl( FirResolvedTypeRefImpl(
null, null,
firSymbol.constructType( firSymbol.constructType(
@@ -236,7 +243,9 @@ class JavaSymbolProvider(
addJavaConstructor(isPrimary = true) addJavaConstructor(isPrimary = true)
} }
for (javaConstructor in javaClassDeclaredConstructors) { for (javaConstructor in javaClassDeclaredConstructors) {
addJavaConstructor(javaConstructor.visibility).apply { addJavaConstructor(
visibility = javaConstructor.visibility, psi = (javaConstructor as? JavaElementImpl<*>)?.psi
).apply {
this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack) this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack)
addAnnotationsFrom(this@JavaSymbolProvider.session, javaConstructor, javaTypeParameterStack) addAnnotationsFrom(this@JavaSymbolProvider.session, javaConstructor, javaTypeParameterStack)
for (valueParameter in javaConstructor.valueParameters) { for (valueParameter in javaConstructor.valueParameters) {
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.ir.expressions.IrConstKind
import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance.* import org.jetbrains.kotlin.types.Variance.*
@@ -195,7 +196,7 @@ internal fun JavaValueParameter.toFirValueParameters(
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
): FirValueParameter { ): FirValueParameter {
return FirJavaValueParameter( return FirJavaValueParameter(
session, name ?: Name.special("<anonymous Java parameter>"), session, (this as? JavaElementImpl<*>)?.psi, name ?: Name.special("<anonymous Java parameter>"),
returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack), returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack),
isVararg = isVararg isVararg = isVararg
).apply { ).apply {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.java.declarations package org.jetbrains.kotlin.fir.java.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.name.Name
class FirJavaClass internal constructor( class FirJavaClass internal constructor(
session: FirSession, session: FirSession,
psi: PsiElement?,
override val symbol: FirClassSymbol, override val symbol: FirClassSymbol,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
@@ -30,8 +32,8 @@ class FirJavaClass internal constructor(
isStatic: Boolean, isStatic: Boolean,
internal val javaTypeParameterStack: JavaTypeParameterStack internal val javaTypeParameterStack: JavaTypeParameterStack
) : FirAbstractMemberDeclaration( ) : FirAbstractMemberDeclaration(
session, psi = null, name = name, session, psi, name,
visibility = visibility, modality = modality, visibility, modality,
isExpect = false, isActual = false isExpect = false, isActual = false
), FirRegularClass, FirModifiableClass { ), FirRegularClass, FirModifiableClass {
init { init {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.java.declarations package org.jetbrains.kotlin.fir.java.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
@@ -20,13 +21,14 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
class FirJavaConstructor( class FirJavaConstructor(
session: FirSession, session: FirSession,
psi: PsiElement?,
override val symbol: FirConstructorSymbol, override val symbol: FirConstructorSymbol,
visibility: Visibility, visibility: Visibility,
override val isPrimary: Boolean, override val isPrimary: Boolean,
delegatedSelfTypeRef: FirTypeRef delegatedSelfTypeRef: FirTypeRef
) : FirAbstractCallableMember<FirConstructor>( ) : FirAbstractCallableMember<FirConstructor>(
session, session,
psi = null, psi,
name = NAME, name = NAME,
visibility = visibility, visibility = visibility,
modality = Modality.FINAL, modality = Modality.FINAL,
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.java.declarations package org.jetbrains.kotlin.fir.java.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
@@ -20,6 +21,7 @@ import org.jetbrains.kotlin.name.Name
class FirJavaField( class FirJavaField(
session: FirSession, session: FirSession,
psi: PsiElement?,
override val symbol: FirFieldSymbol, override val symbol: FirFieldSymbol,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
@@ -28,8 +30,8 @@ class FirJavaField(
override val isVar: Boolean, override val isVar: Boolean,
isStatic: Boolean isStatic: Boolean
) : FirAbstractCallableMember<FirField>( ) : FirAbstractCallableMember<FirField>(
session, psi = null, name = name, session, psi, name,
visibility = visibility, modality = modality, visibility, modality,
isExpect = false, isActual = false, isOverride = false, isExpect = false, isActual = false, isOverride = false,
receiverTypeRef = null, returnTypeRef = returnTypeRef receiverTypeRef = null, returnTypeRef = returnTypeRef
), FirField { ), FirField {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.java.declarations package org.jetbrains.kotlin.fir.java.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
@@ -16,6 +17,7 @@ import org.jetbrains.kotlin.name.Name
class FirJavaMethod( class FirJavaMethod(
session: FirSession, session: FirSession,
psi: PsiElement?,
symbol: FirNamedFunctionSymbol, symbol: FirNamedFunctionSymbol,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
@@ -23,7 +25,7 @@ class FirJavaMethod(
returnTypeRef: FirJavaTypeRef, returnTypeRef: FirJavaTypeRef,
isStatic: Boolean isStatic: Boolean
) : FirMemberFunctionImpl( ) : FirMemberFunctionImpl(
session, null, symbol, name, session, psi, symbol, name,
visibility, modality, visibility, modality,
false, isActual = false, false, isActual = false,
isOverride = false, isOverride = false,
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.java.declarations package org.jetbrains.kotlin.fir.java.declarations
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
@@ -13,11 +14,12 @@ import org.jetbrains.kotlin.name.Name
class FirJavaValueParameter( class FirJavaValueParameter(
session: FirSession, session: FirSession,
psi: PsiElement?,
name: Name, name: Name,
returnTypeRef: FirJavaTypeRef, returnTypeRef: FirJavaTypeRef,
isVararg: Boolean isVararg: Boolean
) : FirValueParameterImpl( ) : FirValueParameterImpl(
session, psi = null, name = name, returnTypeRef = returnTypeRef, session, psi, name, returnTypeRef,
defaultValue = null, isCrossinline = false, isNoinline = false, isVararg = isVararg defaultValue = null, isCrossinline = false, isNoinline = false, isVararg = isVararg
) { ) {
init { init {
@@ -86,6 +86,7 @@ class JavaClassEnhancementScope(
with(firElement) { with(firElement) {
FirJavaField( FirJavaField(
this@JavaClassEnhancementScope.session, this@JavaClassEnhancementScope.session,
firElement.psi,
symbol, symbol,
name, name,
visibility, visibility,
@@ -185,7 +186,7 @@ class JavaClassEnhancementScope(
val symbol = FirConstructorSymbol(methodId) val symbol = FirConstructorSymbol(methodId)
if (firMethod.isPrimary) { if (firMethod.isPrimary) {
FirPrimaryConstructorImpl( FirPrimaryConstructorImpl(
this@JavaClassEnhancementScope.session, null, symbol, this@JavaClassEnhancementScope.session, firMethod.psi, symbol,
firMethod.visibility, firMethod.visibility,
isExpect = false, isExpect = false,
isActual = false, isActual = false,
@@ -194,7 +195,7 @@ class JavaClassEnhancementScope(
) )
} else { } else {
FirConstructorImpl( FirConstructorImpl(
this@JavaClassEnhancementScope.session, null, symbol, this@JavaClassEnhancementScope.session, firMethod.psi, symbol,
newReceiverTypeRef, newReturnTypeRef newReceiverTypeRef, newReturnTypeRef
) )
}.apply { }.apply {
@@ -204,7 +205,7 @@ class JavaClassEnhancementScope(
} }
} }
else -> FirMemberFunctionImpl( else -> FirMemberFunctionImpl(
this@JavaClassEnhancementScope.session, null, this@JavaClassEnhancementScope.session, firMethod.psi,
if (!isAccessor) FirNamedFunctionSymbol(methodId) if (!isAccessor) FirNamedFunctionSymbol(methodId)
else FirAccessorSymbol(callableId = propertyId!!, accessorId = methodId), else FirAccessorSymbol(callableId = propertyId!!, accessorId = methodId),
name, newReceiverTypeRef, newReturnTypeRef name, newReceiverTypeRef, newReturnTypeRef