FIR: introduce callable member symbols & initial member scopes
Initial member scopes cover top-level, class-level, and supers Ad-hock version of call resolve was introduced to test them NB: after this commit, total Kotlin resolve test cannot finish because of scope problems in type resolve transformer Related to KT-24078 #KT-24083 Fixed
This commit is contained in:
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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.symbols
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
// NB: with className == null we are at top level
|
||||||
|
data class CallableId(val packageName: FqName, val className: FqName?, val callableName: Name) {
|
||||||
|
constructor(packageName: FqName, callableName: Name): this(packageName, null, callableName)
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return buildString {
|
||||||
|
append(packageName.asString().replace('.', '/'))
|
||||||
|
append("/")
|
||||||
|
if (className != null) {
|
||||||
|
append(className)
|
||||||
|
append(".")
|
||||||
|
}
|
||||||
|
append(callableName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ConeCallableSymbol : ConeSymbol {
|
||||||
|
val callableId: CallableId
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ConePropertySymbol : ConeCallableSymbol
|
||||||
|
|
||||||
|
interface ConeFunctionSymbol : ConeCallableSymbol {
|
||||||
|
val parameters: List<ConeKotlinType>
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.fir.java.symbols.JavaClassSymbol
|
import org.jetbrains.kotlin.fir.java.symbols.JavaClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.load.java.JavaClassFinder
|
import org.jetbrains.kotlin.load.java.JavaClassFinder
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
@@ -19,6 +20,10 @@ class JavaSymbolProvider(
|
|||||||
val project: Project,
|
val project: Project,
|
||||||
private val searchScope: GlobalSearchScope
|
private val searchScope: GlobalSearchScope
|
||||||
) : AbstractFirSymbolProvider() {
|
) : AbstractFirSymbolProvider() {
|
||||||
|
override fun getCallableSymbols(callableId: CallableId): List<ConeSymbol> {
|
||||||
|
// TODO
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
override fun getSymbolByFqName(classId: ClassId): ConeSymbol? {
|
override fun getSymbolByFqName(classId: ClassId): ConeSymbol? {
|
||||||
return classCache.lookupCacheOrCalculate(classId) {
|
return classCache.lookupCacheOrCalculate(classId) {
|
||||||
|
|||||||
@@ -20,9 +20,8 @@ import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
|||||||
import org.jetbrains.kotlin.fir.references.FirExplicitSuperReference
|
import org.jetbrains.kotlin.fir.references.FirExplicitSuperReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
|
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirExplicitThisReference
|
import org.jetbrains.kotlin.fir.references.FirExplicitThisReference
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.types.FirType
|
import org.jetbrains.kotlin.fir.types.FirType
|
||||||
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||||
import org.jetbrains.kotlin.fir.types.impl.*
|
import org.jetbrains.kotlin.fir.types.impl.*
|
||||||
@@ -250,6 +249,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
|
|||||||
val firProperty = FirMemberPropertyImpl(
|
val firProperty = FirMemberPropertyImpl(
|
||||||
session,
|
session,
|
||||||
this,
|
this,
|
||||||
|
FirPropertySymbol(callableIdForName(nameAsSafeName)),
|
||||||
nameAsSafeName,
|
nameAsSafeName,
|
||||||
visibility,
|
visibility,
|
||||||
modality,
|
modality,
|
||||||
@@ -359,6 +359,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
|
|||||||
val firConstructor = FirPrimaryConstructorImpl(
|
val firConstructor = FirPrimaryConstructorImpl(
|
||||||
session,
|
session,
|
||||||
this ?: owner,
|
this ?: owner,
|
||||||
|
FirFunctionSymbol(callableIdForClassConstructor()),
|
||||||
this?.visibility ?: Visibilities.UNKNOWN,
|
this?.visibility ?: Visibilities.UNKNOWN,
|
||||||
this?.hasExpectModifier() ?: false,
|
this?.hasExpectModifier() ?: false,
|
||||||
this?.hasActualModifier() ?: false,
|
this?.hasActualModifier() ?: false,
|
||||||
@@ -432,6 +433,14 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
|
|||||||
|
|
||||||
val currentClassId get() = ClassId(packageFqName, className, false)
|
val currentClassId get() = ClassId(packageFqName, className, false)
|
||||||
|
|
||||||
|
fun callableIdForName(name: Name) =
|
||||||
|
if (className == FqName.ROOT) CallableId(packageFqName, name)
|
||||||
|
else CallableId(packageFqName, className, name)
|
||||||
|
|
||||||
|
fun callableIdForClassConstructor() =
|
||||||
|
if (className == FqName.ROOT) CallableId(packageFqName, Name.special("<anonymous-init>"))
|
||||||
|
else CallableId(packageFqName, className, className.shortName())
|
||||||
|
|
||||||
var className: FqName = FqName.ROOT
|
var className: FqName = FqName.ROOT
|
||||||
|
|
||||||
override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Unit): FirElement {
|
override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Unit): FirElement {
|
||||||
@@ -546,6 +555,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
|
|||||||
FirMemberFunctionImpl(
|
FirMemberFunctionImpl(
|
||||||
session,
|
session,
|
||||||
function,
|
function,
|
||||||
|
FirFunctionSymbol(callableIdForName(function.nameAsSafeName)),
|
||||||
function.nameAsSafeName,
|
function.nameAsSafeName,
|
||||||
function.visibility,
|
function.visibility,
|
||||||
function.modality,
|
function.modality,
|
||||||
@@ -621,6 +631,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
|
|||||||
val firConstructor = FirConstructorImpl(
|
val firConstructor = FirConstructorImpl(
|
||||||
session,
|
session,
|
||||||
this,
|
this,
|
||||||
|
FirFunctionSymbol(callableIdForClassConstructor()),
|
||||||
visibility,
|
visibility,
|
||||||
hasExpectModifier(),
|
hasExpectModifier(),
|
||||||
hasActualModifier(),
|
hasActualModifier(),
|
||||||
@@ -686,6 +697,7 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
|
|||||||
FirMemberPropertyImpl(
|
FirMemberPropertyImpl(
|
||||||
session,
|
session,
|
||||||
property,
|
property,
|
||||||
|
FirPropertySymbol(callableIdForName(name)),
|
||||||
name,
|
name,
|
||||||
property.visibility,
|
property.visibility,
|
||||||
property.modality,
|
property.modality,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.service
|
import org.jetbrains.kotlin.fir.service
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -15,6 +16,8 @@ interface FirSymbolProvider {
|
|||||||
|
|
||||||
fun getSymbolByFqName(classId: ClassId): ConeSymbol?
|
fun getSymbolByFqName(classId: ClassId): ConeSymbol?
|
||||||
|
|
||||||
|
fun getCallableSymbols(callableId: CallableId): List<ConeSymbol>
|
||||||
|
|
||||||
fun getPackage(fqName: FqName): FqName? // TODO: Replace to symbol sometime
|
fun getPackage(fqName: FqName): FqName? // TODO: Replace to symbol sometime
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+8
@@ -6,12 +6,20 @@
|
|||||||
package org.jetbrains.kotlin.fir.resolve.impl
|
package org.jetbrains.kotlin.fir.resolve.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
||||||
|
|
||||||
class FirCompositeSymbolProvider(val providers: List<FirSymbolProvider>) : FirSymbolProvider {
|
class FirCompositeSymbolProvider(val providers: List<FirSymbolProvider>) : FirSymbolProvider {
|
||||||
|
override fun getCallableSymbols(callableId: CallableId): List<ConeSymbol> {
|
||||||
|
for (provider in providers) {
|
||||||
|
val symbols = provider.getCallableSymbols(callableId)
|
||||||
|
if (symbols.isNotEmpty()) return symbols
|
||||||
|
}
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
override fun getPackage(fqName: FqName): FqName? {
|
override fun getPackage(fqName: FqName): FqName? {
|
||||||
return providers.firstNotNullResult { it.getPackage(fqName) }
|
return providers.firstNotNullResult { it.getPackage(fqName) }
|
||||||
|
|||||||
+5
@@ -10,11 +10,16 @@ import org.jetbrains.kotlin.fir.dependenciesWithoutSelf
|
|||||||
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.service
|
import org.jetbrains.kotlin.fir.service
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
class FirDependenciesSymbolProviderImpl(val session: FirSession) : AbstractFirSymbolProvider() {
|
class FirDependenciesSymbolProviderImpl(val session: FirSession) : AbstractFirSymbolProvider() {
|
||||||
|
override fun getCallableSymbols(callableId: CallableId): List<ConeSymbol> {
|
||||||
|
// TODO
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
private val dependencyProviders by lazy {
|
private val dependencyProviders by lazy {
|
||||||
val moduleInfo = session.moduleInfo ?: return@lazy emptyList()
|
val moduleInfo = session.moduleInfo ?: return@lazy emptyList()
|
||||||
|
|||||||
+5
-1
@@ -11,10 +11,10 @@ import org.jetbrains.kotlin.descriptors.SourceElement
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.deserialization.FirTypeDeserializer
|
import org.jetbrains.kotlin.fir.deserialization.FirTypeDeserializer
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.LibraryClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.LibraryClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FictitiousFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FictitiousFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||||
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
|
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl
|
import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl
|
||||||
@@ -27,6 +27,10 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
|
|||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
|
||||||
class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider {
|
class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider {
|
||||||
|
override fun getCallableSymbols(callableId: CallableId): List<ConeSymbol> {
|
||||||
|
// TODO
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
private class BuiltInsPackageFragment(stream: InputStream, val fqName: FqName) {
|
private class BuiltInsPackageFragment(stream: InputStream, val fqName: FqName) {
|
||||||
lateinit var version: BuiltInsBinaryVersion
|
lateinit var version: BuiltInsBinaryVersion
|
||||||
|
|||||||
@@ -9,10 +9,7 @@ import org.jetbrains.kotlin.fir.FirElement
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
|
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -31,6 +28,10 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
|
|||||||
return (getFirClassifierByFqName(classId) as? FirSymbolOwner<*>)?.symbol
|
return (getFirClassifierByFqName(classId) as? FirSymbolOwner<*>)?.symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getCallableSymbols(callableId: CallableId): List<ConeSymbol> {
|
||||||
|
return (callableMap[callableId] ?: emptyList()).filterIsInstance<FirSymbolOwner<*>>().map { it.symbol }
|
||||||
|
}
|
||||||
|
|
||||||
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
|
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
|
||||||
return classifierContainerFileMap[fqName] ?: error("Couldn't find container for $fqName")
|
return classifierContainerFileMap[fqName] ?: error("Couldn't find container for $fqName")
|
||||||
}
|
}
|
||||||
@@ -61,12 +62,29 @@ class FirProviderImpl(val session: FirSession) : FirProvider {
|
|||||||
classifierMap[classId] = typeAlias
|
classifierMap[classId] = typeAlias
|
||||||
classifierContainerFileMap[classId] = file
|
classifierContainerFileMap[classId] = file
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitCallableMember(callableMember: FirCallableMember) {
|
||||||
|
val callableId = when (containerFqName) {
|
||||||
|
FqName.ROOT -> CallableId(packageName, callableMember.name)
|
||||||
|
else -> CallableId(packageName, containerFqName, callableMember.name)
|
||||||
|
}
|
||||||
|
callableMap.merge(callableId, listOf(callableMember)) { a, b -> a + b }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitNamedFunction(namedFunction: FirNamedFunction) {
|
||||||
|
visitCallableMember(namedFunction)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitProperty(property: FirProperty) {
|
||||||
|
visitCallableMember(property)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private val fileMap = mutableMapOf<FqName, List<FirFile>>()
|
private val fileMap = mutableMapOf<FqName, List<FirFile>>()
|
||||||
private val classifierMap = mutableMapOf<ClassId, FirMemberDeclaration>()
|
private val classifierMap = mutableMapOf<ClassId, FirMemberDeclaration>()
|
||||||
private val classifierContainerFileMap = mutableMapOf<ClassId, FirFile>()
|
private val classifierContainerFileMap = mutableMapOf<ClassId, FirFile>()
|
||||||
|
private val callableMap = mutableMapOf<CallableId, List<FirNamedDeclaration>>()
|
||||||
|
|
||||||
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> {
|
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> {
|
||||||
return fileMap[fqName].orEmpty()
|
return fileMap[fqName].orEmpty()
|
||||||
|
|||||||
+7
-7
@@ -16,16 +16,16 @@ import org.jetbrains.kotlin.fir.types.ConeClassErrorType
|
|||||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||||
|
|
||||||
abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: Boolean) : FirAbstractTreeTransformer() {
|
abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: Boolean) : FirAbstractTreeTransformer() {
|
||||||
protected var towerScope = FirCompositeScope(mutableListOf(), reversedPriority = reversedScopePriority)
|
protected val towerScope = FirCompositeScope(mutableListOf(), reversedPriority = reversedScopePriority)
|
||||||
|
|
||||||
protected inline fun <T> withScopeCleanup(crossinline l: () -> T): T {
|
protected inline fun <T> withScopeCleanup(crossinline l: () -> T): T {
|
||||||
val scopeBefore = towerScope
|
val sizeBefore = towerScope.scopes.size
|
||||||
val scopes = towerScope.scopes
|
|
||||||
val sizeBefore = scopes.size
|
|
||||||
val result = l()
|
val result = l()
|
||||||
towerScope = scopeBefore
|
val size = towerScope.scopes.size
|
||||||
assert(scopes.size >= sizeBefore)
|
assert(size >= sizeBefore)
|
||||||
scopes.subList(sizeBefore + 1, scopes.size).clear()
|
repeat(size - sizeBefore) {
|
||||||
|
towerScope.scopes.let { it.removeAt(it.size - 1) }
|
||||||
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+64
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* 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.resolve.transformers
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirNamedReference
|
||||||
|
import org.jetbrains.kotlin.fir.FirResolvedCallableReference
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.compose
|
||||||
|
|
||||||
|
class FirAccessResolveTransformer : FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority = true) {
|
||||||
|
|
||||||
|
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
|
||||||
|
return withScopeCleanup {
|
||||||
|
towerScope.scopes += FirTopLevelDeclaredMemberScope(file, file.session)
|
||||||
|
super.transformFile(file, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult<FirDeclaration> {
|
||||||
|
return withScopeCleanup {
|
||||||
|
lookupSuperTypes(regularClass).asReversed().mapNotNullTo(towerScope.scopes) {
|
||||||
|
val symbol = it.symbol
|
||||||
|
if (symbol is FirClassSymbol) {
|
||||||
|
FirClassDeclaredMemberScope(symbol.fir, symbol.fir.session)
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
towerScope.scopes += FirClassDeclaredMemberScope(regularClass, regularClass.session)
|
||||||
|
super.transformRegularClass(regularClass, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transformNamedReference(namedReference: FirNamedReference, data: Nothing?): CompositeTransformResult<FirNamedReference> {
|
||||||
|
if (namedReference is FirResolvedCallableReference) return namedReference.compose()
|
||||||
|
val name = namedReference.name
|
||||||
|
var symbol: ConeCallableSymbol? = null
|
||||||
|
towerScope.processClassifiersByName(name, FirPosition.OTHER) {
|
||||||
|
symbol = it as? ConeCallableSymbol
|
||||||
|
// I'm lucky today!!! (the first symbol we have found is the one we need)
|
||||||
|
it is ConeCallableSymbol
|
||||||
|
}
|
||||||
|
val callableSymbol = symbol ?: return FirErrorNamedReference(
|
||||||
|
namedReference.session, namedReference.psi, "Unresolved name: $name"
|
||||||
|
).compose()
|
||||||
|
return FirResolvedCallableReferenceImpl(
|
||||||
|
namedReference.session, namedReference.psi,
|
||||||
|
name, callableSymbol
|
||||||
|
).compose()
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-1
@@ -13,7 +13,8 @@ class FirTotalResolveTransformer {
|
|||||||
val transformers: List<FirTransformer<Nothing?>> = listOf(
|
val transformers: List<FirTransformer<Nothing?>> = listOf(
|
||||||
FirImportResolveTransformer(),
|
FirImportResolveTransformer(),
|
||||||
FirTypeResolveTransformer(),
|
FirTypeResolveTransformer(),
|
||||||
FirStatusResolveTransformer()
|
FirStatusResolveTransformer(),
|
||||||
|
FirAccessResolveTransformer()
|
||||||
)
|
)
|
||||||
|
|
||||||
fun processFile(firFile: FirFile) {
|
fun processFile(firFile: FirFile) {
|
||||||
|
|||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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.scopes.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class FirClassDeclaredMemberScope(
|
||||||
|
klass: FirRegularClass,
|
||||||
|
session: FirSession,
|
||||||
|
lookupInFir: Boolean = true
|
||||||
|
) : FirAbstractProviderBasedScope(session, lookupInFir) {
|
||||||
|
private val classId = klass.symbol.classId
|
||||||
|
|
||||||
|
override fun processClassifiersByName(
|
||||||
|
name: Name,
|
||||||
|
position: FirPosition,
|
||||||
|
processor: (ConeSymbol) -> Boolean
|
||||||
|
): Boolean {
|
||||||
|
val symbols = provider.getCallableSymbols(CallableId(classId.packageFqName, classId.relativeClassName, name))
|
||||||
|
for (symbol in symbols) {
|
||||||
|
if (!processor(symbol)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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.scopes.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
|
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class FirTopLevelDeclaredMemberScope(
|
||||||
|
file: FirFile,
|
||||||
|
session: FirSession,
|
||||||
|
lookupInFir: Boolean = true
|
||||||
|
) : FirAbstractProviderBasedScope(session, lookupInFir) {
|
||||||
|
private val packageFqName = file.packageFqName
|
||||||
|
|
||||||
|
override fun processClassifiersByName(
|
||||||
|
name: Name,
|
||||||
|
position: FirPosition,
|
||||||
|
processor: (ConeSymbol) -> Boolean
|
||||||
|
): Boolean {
|
||||||
|
val symbols = provider.getCallableSymbols(CallableId(packageFqName, name))
|
||||||
|
for (symbol in symbols) {
|
||||||
|
if (!processor(symbol)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,8 +8,8 @@ FILE: lists.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final function convert R|kotlin/collections/List<kotlin/String>|.(): R|MyStringList| {
|
public final function convert R|kotlin/collections/List<kotlin/String>|.(): R|MyStringList| {
|
||||||
return@@@convert STUB
|
return@@@convert as/R|MyStringList|(this#)
|
||||||
}
|
}
|
||||||
public final function ret(l: R|kotlin/collections/MutableList<kotlin/String>|): R|MyMutableStringList| {
|
public final function ret(l: R|kotlin/collections/MutableList<kotlin/String>|): R|MyMutableStringList| {
|
||||||
return@@@ret STUB
|
return@@@ret as/R|MyMutableStringList|(this#)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -7,9 +7,9 @@ FILE: derivedClass.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
<T : R|kotlin/Any|> public final class Derived : R|Base<T>| {
|
<T : R|kotlin/Any|> public final class Derived : R|Base<T>| {
|
||||||
public constructor(x: R|T|): super<R|Base<T>|>()
|
public constructor(x: R|T|): super<R|Base<T>|>(R|/Base.x|)
|
||||||
|
|
||||||
}
|
}
|
||||||
<T : R|kotlin/Any|> public final function create(x: R|T|): R|Derived<T>| {
|
<T : R|kotlin/Any|> public final function create(x: R|T|): R|Derived<T>| {
|
||||||
return@@@create STUB
|
return@@@create <Unresolved name: Derived>#(<Unresolved name: x>#)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -16,19 +16,19 @@ FILE: enum.kt
|
|||||||
public get(): R|Some|
|
public get(): R|Some|
|
||||||
|
|
||||||
public final enum entry FIRST : R|SomeEnum| {
|
public final enum entry FIRST : R|SomeEnum| {
|
||||||
public constructor(): super<R|SomeEnum|>()
|
public constructor(): super<R|SomeEnum|>(<Unresolved name: O1>#)
|
||||||
|
|
||||||
public final override function check(y: R|Some|): R|kotlin/Boolean| {
|
public final override function check(y: R|Some|): R|kotlin/Boolean| {
|
||||||
return@@@check STUB
|
return@@@check Boolean(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final enum entry SECOND : R|SomeEnum| {
|
public final enum entry SECOND : R|SomeEnum| {
|
||||||
public constructor(): super<R|SomeEnum|>()
|
public constructor(): super<R|SomeEnum|>(<Unresolved name: O2>#)
|
||||||
|
|
||||||
public final override function check(y: R|Some|): R|kotlin/Boolean| {
|
public final override function check(y: R|Some|): R|kotlin/Boolean| {
|
||||||
return@@@check STUB
|
return@@@check ==(<Unresolved name: y>#, <Unresolved name: O2>#)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,33 +28,33 @@ FILE: enums.kt
|
|||||||
internal get(): R|kotlin/Double|
|
internal get(): R|kotlin/Double|
|
||||||
|
|
||||||
public final enum entry MERCURY : R|Planet| {
|
public final enum entry MERCURY : R|Planet| {
|
||||||
public constructor(): super<R|Planet|>()
|
public constructor(): super<R|Planet|>(Double(1.0), Double(2.0))
|
||||||
|
|
||||||
public final override function sayHello(): R|kotlin/Unit| {
|
public final override function sayHello(): R|kotlin/Unit| {
|
||||||
return@@@sayHello STUB
|
<Unresolved name: println>#(String(Hello!!!))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final enum entry VENERA : R|Planet| {
|
public final enum entry VENERA : R|Planet| {
|
||||||
public constructor(): super<R|Planet|>()
|
public constructor(): super<R|Planet|>(Double(3.0), Double(4.0))
|
||||||
|
|
||||||
public final override function sayHello(): R|kotlin/Unit| {
|
public final override function sayHello(): R|kotlin/Unit| {
|
||||||
return@@@sayHello STUB
|
<Unresolved name: println>#(String(Ola!!!))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final enum entry EARTH : R|Planet| {
|
public final enum entry EARTH : R|Planet| {
|
||||||
public constructor(): super<R|Planet|>()
|
public constructor(): super<R|Planet|>(Double(5.0), Double(6.0))
|
||||||
|
|
||||||
public final override function sayHello(): R|kotlin/Unit| {
|
public final override function sayHello(): R|kotlin/Unit| {
|
||||||
return@@@sayHello STUB
|
<Unresolved name: println>#(String(Privet!!!))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final property g(val): R|kotlin/Double| = STUB
|
public final property g(val): R|kotlin/Double| = <Unresolved name: div>#(<Unresolved name: times>#(<Unresolved name: G>#, R|/Planet.m|), <Unresolved name: times>#(R|/Planet.r|, R|/Planet.r|))
|
||||||
public get(): R|kotlin/Double|
|
public get(): R|kotlin/Double|
|
||||||
|
|
||||||
public abstract function sayHello(): R|kotlin/Unit|
|
public abstract function sayHello(): R|kotlin/Unit|
|
||||||
@@ -62,7 +62,7 @@ FILE: enums.kt
|
|||||||
public final companion object Companion {
|
public final companion object Companion {
|
||||||
public constructor(): super<R|kotlin/Any|>()
|
public constructor(): super<R|kotlin/Any|>()
|
||||||
|
|
||||||
public final const property G(val): R|error: Not supported: FirImplicitTypeImpl| = STUB
|
public final const property G(val): R|error: Not supported: FirImplicitTypeImpl| = Double(6.67E-11)
|
||||||
public get(): R|error: Not supported: FirImplicitTypeImpl|
|
public get(): R|error: Not supported: FirImplicitTypeImpl|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ FILE: noPrimaryConstructor.kt
|
|||||||
public get(): R|kotlin/String|
|
public get(): R|kotlin/String|
|
||||||
|
|
||||||
public constructor(x: R|kotlin/String|): super<R|kotlin/Any|>() {
|
public constructor(x: R|kotlin/String|): super<R|kotlin/Any|>() {
|
||||||
return STUB
|
this#.R|/NoPrimary.x| = R|/NoPrimary.x|
|
||||||
}
|
}
|
||||||
|
|
||||||
public constructor(): this<R|NoPrimary|>()
|
public constructor(): this<R|NoPrimary|>(String())
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,19 +9,18 @@ FILE: simpleClass.kt
|
|||||||
public final class SomeClass : R|SomeInterface| {
|
public final class SomeClass : R|SomeInterface| {
|
||||||
public constructor(): super<R|kotlin/Any|>()
|
public constructor(): super<R|kotlin/Any|>()
|
||||||
|
|
||||||
private final property baz(val): R|error: Not supported: FirImplicitTypeImpl| = STUB
|
private final property baz(val): R|error: Not supported: FirImplicitTypeImpl| = Int(42)
|
||||||
private get(): R|error: Not supported: FirImplicitTypeImpl|
|
private get(): R|error: Not supported: FirImplicitTypeImpl|
|
||||||
|
|
||||||
public final override function foo(x: R|kotlin/Int|, y: R|kotlin/String|): R|kotlin/String| {
|
public final override function foo(x: R|kotlin/Int|, y: R|kotlin/String|): R|kotlin/String| {
|
||||||
return@@@foo STUB
|
return@@@foo <Unresolved name: plus>#(<Unresolved name: plus>#(<Unresolved name: y>#, <Unresolved name: x>#), R|/SomeClass.baz|)
|
||||||
}
|
}
|
||||||
|
|
||||||
public final override property bar(var): R|kotlin/Boolean|
|
public final override property bar(var): R|kotlin/Boolean|
|
||||||
public get(): R|kotlin/Boolean| {
|
public get(): R|kotlin/Boolean| {
|
||||||
return STUB
|
return Boolean(true)
|
||||||
}
|
}
|
||||||
public set(value: R|kotlin/Boolean|): R|kotlin/Unit| {
|
public set(value: R|kotlin/Boolean|): R|kotlin/Unit| {
|
||||||
return STUB
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final lateinit property fau(var): R|kotlin/Double|
|
public final lateinit property fau(var): R|kotlin/Double|
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ FILE: typeParameters.kt
|
|||||||
public constructor(): super<R|AbstractList<kotlin/Int>|>()
|
public constructor(): super<R|AbstractList<kotlin/Int>|>()
|
||||||
|
|
||||||
public final override function get(index: R|kotlin/Int|): R|kotlin/Int| {
|
public final override function get(index: R|kotlin/Int|): R|kotlin/Int| {
|
||||||
return@@@get STUB
|
return@@@get Int(42)
|
||||||
}
|
}
|
||||||
|
|
||||||
public final override function concat(other: R|List<kotlin/Int>|): R|List<kotlin/Int>| {
|
public final override function concat(other: R|List<kotlin/Int>|): R|List<kotlin/Int>| {
|
||||||
return@@@concat STUB
|
return@@@concat this#
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -1,12 +1,11 @@
|
|||||||
FILE: functionTypes.kt
|
FILE: functionTypes.kt
|
||||||
<T> public final function simpleRun(f: R|(T) -> kotlin/Unit|): R|kotlin/Unit| {
|
<T> public final function simpleRun(f: R|(T) -> kotlin/Unit|): R|kotlin/Unit| {
|
||||||
return@@@simpleRun STUB
|
return@@@simpleRun <Unresolved name: f>#()
|
||||||
}
|
}
|
||||||
<T, R> public final function simpleMap R|kotlin/collections/List<T>|.(f: R|(T) -> R|): R|R| {
|
<T, R> public final function simpleMap R|kotlin/collections/List<T>|.(f: R|(T) -> R|): R|R| {
|
||||||
return@@@simpleMap STUB
|
|
||||||
}
|
}
|
||||||
<T> public final function simpleWith(t: R|T|, f: R|T.() -> kotlin/Unit|): R|kotlin/Unit| {
|
<T> public final function simpleWith(t: R|T|, f: R|T.() -> kotlin/Unit|): R|kotlin/Unit| {
|
||||||
return@@@simpleWith STUB
|
return@@@simpleWith <Unresolved name: t>#.<Unresolved name: f>#()
|
||||||
}
|
}
|
||||||
<T, R> public abstract interface KMutableProperty1 : R|KProperty1<T, R>|, R|KMutableProperty<R>| {
|
<T, R> public abstract interface KMutableProperty1 : R|KProperty1<T, R>|, R|KMutableProperty<R>| {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ FILE: genericFunctions.kt
|
|||||||
public abstract interface Any {
|
public abstract interface Any {
|
||||||
}
|
}
|
||||||
<reified T : R|Any|> public final inline function safeAs R|Any|.(): R|T| {
|
<reified T : R|Any|> public final inline function safeAs R|Any|.(): R|T| {
|
||||||
return@@@safeAs STUB
|
return@@@safeAs as?/R|T|(this#)
|
||||||
}
|
}
|
||||||
public abstract class Summator {
|
public abstract class Summator {
|
||||||
public constructor(): super<R|Any|>()
|
public constructor(): super<R|Any|>()
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ FILE: Annotations.kt
|
|||||||
|
|
||||||
@R|annotations/Simple|() public abstract function foo(@R|annotations/WithString|(String(abc)) arg: @R|annotations/Simple|() R|kotlin/Double|): R|kotlin/Unit|
|
@R|annotations/Simple|() public abstract function foo(@R|annotations/WithString|(String(abc)) arg: @R|annotations/Simple|() R|kotlin/Double|): R|kotlin/Unit|
|
||||||
|
|
||||||
@R|annotations/Complex|(STUB, STUB) public abstract property v(val): R|kotlin/String|
|
@R|annotations/Complex|(<Unresolved name: WithInt>#(Int(7)), <Unresolved name: WithString>#(String())) public abstract property v(val): R|kotlin/String|
|
||||||
public get(): R|kotlin/String|
|
public get(): R|kotlin/String|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -16,15 +16,15 @@ FILE: Annotations.kt
|
|||||||
public get(): R|kotlin/Char|
|
public get(): R|kotlin/Char|
|
||||||
|
|
||||||
public final override function foo(arg: R|kotlin/Double|): R|kotlin/Unit| {
|
public final override function foo(arg: R|kotlin/Double|): R|kotlin/Unit| {
|
||||||
return@@@foo STUB
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final override property v(val): R|kotlin/String|
|
public final override property v(val): R|kotlin/String|
|
||||||
@R|annotations/Simple|() public get(): R|kotlin/String| {
|
@R|annotations/Simple|() public get(): R|kotlin/String| {
|
||||||
return STUB
|
return String()
|
||||||
}
|
}
|
||||||
|
|
||||||
@R|annotations/WithString|(String(constructor)) public constructor(): this<R|test/Second|>()
|
@R|annotations/WithString|(String(constructor)) public constructor(): this<R|test/Second|>(Char(
|
||||||
|
))
|
||||||
|
|
||||||
}
|
}
|
||||||
@R|annotations/WithInt|(Int(24)) @R|annotations/VeryComplex|(Float(3.14), Double(6.67E-11), Boolean(false), Long(123456789012345), Null(null)) @R|annotations/WithInt|(Int(24)) @R|annotations/VeryComplex|(Float(3.14), Double(6.67E-11), Boolean(false), Long(123456789012345), Null(null)) public final typealias Third = @R|annotations/Simple|() R|test/Second|
|
@R|annotations/WithInt|(Int(24)) @R|annotations/VeryComplex|(Float(3.14), Double(6.67E-11), Boolean(false), Long(123456789012345), Null(null)) @R|annotations/WithInt|(Int(24)) @R|annotations/VeryComplex|(Float(3.14), Double(6.67E-11), Boolean(false), Long(123456789012345), Null(null)) public final typealias Third = @R|annotations/Simple|() R|test/Second|
|
||||||
|
|||||||
+2
-2
@@ -10,12 +10,12 @@ FILE: nestedClass.kt
|
|||||||
public constructor(): super<R|kotlin/Any|>()
|
public constructor(): super<R|kotlin/Any|>()
|
||||||
|
|
||||||
public final class Derived : R|Base| {
|
public final class Derived : R|Base| {
|
||||||
public constructor(s: R|kotlin/String|): super<R|Base|>()
|
public constructor(s: R|kotlin/String|): super<R|Base|>(R|/Base.s|)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final object Obj : R|Base| {
|
public final object Obj : R|Base| {
|
||||||
public constructor(): super<R|Base|>()
|
public constructor(): super<R|Base|>(String())
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun foo() = 1
|
||||||
|
|
||||||
|
fun bar() = foo()
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
FILE: simple.kt
|
||||||
|
public final function foo(): R|error: Not supported: FirImplicitTypeImpl| {
|
||||||
|
return@@@foo Int(1)
|
||||||
|
}
|
||||||
|
public final function bar(): R|error: Not supported: FirImplicitTypeImpl| {
|
||||||
|
return@@@bar R|/foo|()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
open class A {
|
||||||
|
open fun foo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class B : A() {
|
||||||
|
fun bar() {
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
FILE: superMember.kt
|
||||||
|
public open class A {
|
||||||
|
public constructor(): super<R|kotlin/Any|>()
|
||||||
|
|
||||||
|
public open function foo(): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class B : R|A| {
|
||||||
|
public constructor(): super<R|A|>()
|
||||||
|
|
||||||
|
public final function bar(): R|kotlin/Unit| {
|
||||||
|
R|/A.foo|()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+3
-4
@@ -9,19 +9,18 @@ FILE: simpleClass.kt
|
|||||||
public final class SomeClass : R|SomeInterface| {
|
public final class SomeClass : R|SomeInterface| {
|
||||||
public constructor(): super<R|kotlin/Any|>()
|
public constructor(): super<R|kotlin/Any|>()
|
||||||
|
|
||||||
private final property baz(val): R|error: Not supported: FirImplicitTypeImpl| = STUB
|
private final property baz(val): R|error: Not supported: FirImplicitTypeImpl| = Int(42)
|
||||||
private get(): R|error: Not supported: FirImplicitTypeImpl|
|
private get(): R|error: Not supported: FirImplicitTypeImpl|
|
||||||
|
|
||||||
public final override function foo(x: R|kotlin/Int|, y: R|kotlin/String|): R|kotlin/String| {
|
public final override function foo(x: R|kotlin/Int|, y: R|kotlin/String|): R|kotlin/String| {
|
||||||
return@@@foo STUB
|
return@@@foo <Unresolved name: plus>#(<Unresolved name: plus>#(<Unresolved name: y>#, <Unresolved name: x>#), R|/SomeClass.baz|)
|
||||||
}
|
}
|
||||||
|
|
||||||
public final override property bar(var): R|kotlin/Boolean|
|
public final override property bar(var): R|kotlin/Boolean|
|
||||||
public get(): R|kotlin/Boolean| {
|
public get(): R|kotlin/Boolean| {
|
||||||
return STUB
|
return Boolean(true)
|
||||||
}
|
}
|
||||||
public set(value: R|kotlin/Boolean|): R|kotlin/Unit| {
|
public set(value: R|kotlin/Boolean|): R|kotlin/Unit| {
|
||||||
return STUB
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final property fau(var): R|kotlin/Double|
|
public final property fau(var): R|kotlin/Double|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
FILE: concurrent.kt
|
FILE: concurrent.kt
|
||||||
@R|kotlin/jvm/Volatile|() public final property xx(var): R|kotlin/Int| = STUB
|
@R|kotlin/jvm/Volatile|() public final property xx(var): R|kotlin/Int| = Int(2)
|
||||||
public get(): R|kotlin/Int|
|
public get(): R|kotlin/Int|
|
||||||
public set(value: R|kotlin/Int|): R|kotlin/Unit|
|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
|
||||||
@R|kotlin/jvm/Synchronized|() public final function foo(): R|kotlin/Unit| {
|
@R|kotlin/jvm/Synchronized|() public final function foo(): R|kotlin/Unit| {
|
||||||
return@@@foo STUB
|
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-3
@@ -1,13 +1,24 @@
|
|||||||
FILE: functionX.kt
|
FILE: functionX.kt
|
||||||
public final property x(val): R|kotlin/jvm/functions/Function0<kotlin/Int>| = STUB
|
public final property x(val): R|kotlin/jvm/functions/Function0<kotlin/Int>| = function R|error: Not supported: FirImplicitTypeImpl|.<anonymous>(): R|error: Not supported: FirImplicitTypeImpl| {
|
||||||
|
return {
|
||||||
|
Int(42)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public get(): R|kotlin/jvm/functions/Function0<kotlin/Int>|
|
public get(): R|kotlin/jvm/functions/Function0<kotlin/Int>|
|
||||||
public final property y(val): R|kotlin/Function1<kotlin/String, kotlin/String>| = STUB
|
public final property y(val): R|kotlin/Function1<kotlin/String, kotlin/String>| = function R|error: Not supported: FirImplicitTypeImpl|.<anonymous>(): R|error: Not supported: FirImplicitTypeImpl| {
|
||||||
|
return {
|
||||||
|
<Unresolved name: it>#
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public get(): R|kotlin/Function1<kotlin/String, kotlin/String>|
|
public get(): R|kotlin/Function1<kotlin/String, kotlin/String>|
|
||||||
public final class MyFunction : R|kotlin/Function2<kotlin/Int, kotlin/String, kotlin/Unit>| {
|
public final class MyFunction : R|kotlin/Function2<kotlin/Int, kotlin/String, kotlin/Unit>| {
|
||||||
public constructor(): super<R|kotlin/Any|>()
|
public constructor(): super<R|kotlin/Any|>()
|
||||||
|
|
||||||
public final override function invoke(p1: R|kotlin/Int|, p2: R|kotlin/String|): R|kotlin/Unit| {
|
public final override function invoke(p1: R|kotlin/Int|, p2: R|kotlin/String|): R|kotlin/Unit| {
|
||||||
return@@@invoke STUB
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
FILE: reflectionClass.kt
|
FILE: reflectionClass.kt
|
||||||
public final property javaClass(val): R|java/lang/Class<kotlin/String>| = STUB
|
public final property javaClass(val): R|java/lang/Class<kotlin/String>| = <getClass>(<Unresolved name: String>#).<Unresolved name: java>#
|
||||||
public get(): R|java/lang/Class<kotlin/String>|
|
public get(): R|java/lang/Class<kotlin/String>|
|
||||||
public final property kotlinClass(val): R|kotlin/reflect/KClass<kotlin/String>| = STUB
|
public final property kotlinClass(val): R|kotlin/reflect/KClass<kotlin/String>| = <getClass>(<Unresolved name: String>#)
|
||||||
public get(): R|kotlin/reflect/KClass<kotlin/String>|
|
public get(): R|kotlin/reflect/KClass<kotlin/String>|
|
||||||
|
|||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
FILE: treeSet.kt
|
FILE: treeSet.kt
|
||||||
public final property x(val): R|java/util/SortedSet<kotlin/Int>| = STUB
|
public final property x(val): R|java/util/SortedSet<kotlin/Int>| = <Unresolved name: TreeSet>#()
|
||||||
public get(): R|java/util/SortedSet<kotlin/Int>|
|
public get(): R|java/util/SortedSet<kotlin/Int>|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
FILE: typeParameterInPropertyReceiver.kt
|
FILE: typeParameterInPropertyReceiver.kt
|
||||||
<T : R|kotlin/Any|> public final property self R|T|.(val): R|T|
|
<T : R|kotlin/Any|> public final property self R|T|.(val): R|T|
|
||||||
public get(): R|T| {
|
public get(): R|T| {
|
||||||
return STUB
|
return this#
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ abstract class AbstractFirResolveTestCase : AbstractFirResolveWithSessionTestCas
|
|||||||
.uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(project))
|
.uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(project))
|
||||||
val session = createSession(scope)
|
val session = createSession(scope)
|
||||||
|
|
||||||
val builder = RawFirBuilder(session, stubMode = true)
|
val builder = RawFirBuilder(session, stubMode = false)
|
||||||
|
|
||||||
val transformer = FirTotalResolveTransformer()
|
val transformer = FirTotalResolveTransformer()
|
||||||
return ktFiles.map {
|
return ktFiles.map {
|
||||||
|
|||||||
+23
@@ -242,4 +242,27 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase {
|
|||||||
runTest("compiler/fir/resolve/testData/resolve/multifile/TypeAliasExpansion.kt");
|
runTest("compiler/fir/resolve/testData/resolve/multifile/TypeAliasExpansion.kt");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/fir/resolve/testData/resolve/references")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class References extends AbstractFirResolveTestCase {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInReferences() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve/references"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("simple.kt")
|
||||||
|
public void testSimple() throws Exception {
|
||||||
|
runTest("compiler/fir/resolve/testData/resolve/references/simple.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("superMember.kt")
|
||||||
|
public void testSuperMember() throws Exception {
|
||||||
|
runTest("compiler/fir/resolve/testData/resolve/references/superMember.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir
|
|||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
@BaseTransformedType
|
||||||
interface FirNamedReference : FirReference {
|
interface FirNamedReference : FirReference {
|
||||||
val name: Name
|
val name: Name
|
||||||
|
|
||||||
|
|||||||
@@ -695,6 +695,12 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
|
|||||||
print("${namedReference.name}#")
|
print("${namedReference.name}#")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference) {
|
||||||
|
print("R|")
|
||||||
|
print(resolvedCallableReference.callableSymbol.callableId)
|
||||||
|
print("|")
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitThisReference(thisReference: FirThisReference) {
|
override fun visitThisReference(thisReference: FirThisReference) {
|
||||||
print("this")
|
print("this")
|
||||||
val labelName = thisReference.labelName
|
val labelName = thisReference.labelName
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||||
|
|
||||||
|
interface FirResolvedCallableReference : FirNamedReference {
|
||||||
|
val callableSymbol: ConeCallableSymbol
|
||||||
|
|
||||||
|
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
|
||||||
|
visitor.visitResolvedCallableReference(this, data)
|
||||||
|
}
|
||||||
@@ -6,11 +6,14 @@
|
|||||||
package org.jetbrains.kotlin.fir.declarations
|
package org.jetbrains.kotlin.fir.declarations
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.VisitedSupertype
|
import org.jetbrains.kotlin.fir.VisitedSupertype
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.FirSymbolOwner
|
||||||
import org.jetbrains.kotlin.fir.types.FirType
|
import org.jetbrains.kotlin.fir.types.FirType
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||||
|
|
||||||
// Good name needed (something with receiver, type parameters, return type, and name)
|
// Good name needed (something with receiver, type parameters, return type, and name)
|
||||||
interface FirCallableMember : @VisitedSupertype FirDeclaration, FirMemberDeclaration, FirTypedDeclaration {
|
interface FirCallableMember :
|
||||||
|
@VisitedSupertype FirDeclaration, FirMemberDeclaration,
|
||||||
|
FirTypedDeclaration, FirSymbolOwner<FirCallableMember> {
|
||||||
val isOverride: Boolean get() = status.isOverride
|
val isOverride: Boolean get() = status.isOverride
|
||||||
|
|
||||||
val receiverType: FirType?
|
val receiverType: FirType?
|
||||||
|
|||||||
+3
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.Visibility
|
|||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
|
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.transformSingle
|
import org.jetbrains.kotlin.fir.transformSingle
|
||||||
import org.jetbrains.kotlin.fir.types.FirType
|
import org.jetbrains.kotlin.fir.types.FirType
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
@@ -19,6 +20,7 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
abstract class FirAbstractCallableMember(
|
abstract class FirAbstractCallableMember(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
psi: PsiElement?,
|
psi: PsiElement?,
|
||||||
|
final override val symbol: FirBasedSymbol<FirCallableMember>,
|
||||||
name: Name,
|
name: Name,
|
||||||
visibility: Visibility,
|
visibility: Visibility,
|
||||||
modality: Modality?,
|
modality: Modality?,
|
||||||
@@ -30,6 +32,7 @@ abstract class FirAbstractCallableMember(
|
|||||||
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, isExpect, isActual), FirCallableMember {
|
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, isExpect, isActual), FirCallableMember {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
symbol.bind(this)
|
||||||
status.isOverride = isOverride
|
status.isOverride = isOverride
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.transformInplace
|
import org.jetbrains.kotlin.fir.transformInplace
|
||||||
import org.jetbrains.kotlin.fir.transformSingle
|
import org.jetbrains.kotlin.fir.transformSingle
|
||||||
import org.jetbrains.kotlin.fir.types.FirType
|
import org.jetbrains.kotlin.fir.types.FirType
|
||||||
@@ -23,13 +24,14 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
open class FirConstructorImpl(
|
open class FirConstructorImpl(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
psi: PsiElement?,
|
psi: PsiElement?,
|
||||||
|
symbol: FirFunctionSymbol,
|
||||||
visibility: Visibility,
|
visibility: Visibility,
|
||||||
isExpect: Boolean,
|
isExpect: Boolean,
|
||||||
isActual: Boolean,
|
isActual: Boolean,
|
||||||
delegatedSelfType: FirType,
|
delegatedSelfType: FirType,
|
||||||
final override var delegatedConstructor: FirDelegatedConstructorCall?
|
final override var delegatedConstructor: FirDelegatedConstructorCall?
|
||||||
) : FirAbstractCallableMember(
|
) : FirAbstractCallableMember(
|
||||||
session, psi, NAME, visibility, Modality.FINAL,
|
session, psi, symbol, NAME, visibility, Modality.FINAL,
|
||||||
isExpect, isActual, isOverride = false, receiverType = null, returnType = delegatedSelfType
|
isExpect, isActual, isOverride = false, receiverType = null, returnType = delegatedSelfType
|
||||||
), FirConstructor {
|
), FirConstructor {
|
||||||
override val valueParameters = mutableListOf<FirValueParameter>()
|
override val valueParameters = mutableListOf<FirValueParameter>()
|
||||||
|
|||||||
+3
-1
@@ -13,6 +13,7 @@ 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.FirValueParameter
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
import org.jetbrains.kotlin.fir.expressions.FirBlock
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.transformInplace
|
import org.jetbrains.kotlin.fir.transformInplace
|
||||||
import org.jetbrains.kotlin.fir.transformSingle
|
import org.jetbrains.kotlin.fir.transformSingle
|
||||||
import org.jetbrains.kotlin.fir.types.FirType
|
import org.jetbrains.kotlin.fir.types.FirType
|
||||||
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
class FirMemberFunctionImpl(
|
class FirMemberFunctionImpl(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
psi: PsiElement?,
|
psi: PsiElement?,
|
||||||
|
symbol: FirFunctionSymbol,
|
||||||
name: Name,
|
name: Name,
|
||||||
visibility: Visibility,
|
visibility: Visibility,
|
||||||
modality: Modality?,
|
modality: Modality?,
|
||||||
@@ -37,7 +39,7 @@ class FirMemberFunctionImpl(
|
|||||||
receiverType: FirType?,
|
receiverType: FirType?,
|
||||||
returnType: FirType
|
returnType: FirType
|
||||||
) : FirAbstractCallableMember(
|
) : FirAbstractCallableMember(
|
||||||
session, psi, name, visibility, modality,
|
session, psi, symbol, name, visibility, modality,
|
||||||
isExpect, isActual, isOverride, receiverType, returnType
|
isExpect, isActual, isOverride, receiverType, returnType
|
||||||
), FirNamedFunction, FirModifiableFunction {
|
), FirNamedFunction, FirModifiableFunction {
|
||||||
init {
|
init {
|
||||||
|
|||||||
+3
-1
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirSession
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
import org.jetbrains.kotlin.fir.transformSingle
|
import org.jetbrains.kotlin.fir.transformSingle
|
||||||
import org.jetbrains.kotlin.fir.types.FirType
|
import org.jetbrains.kotlin.fir.types.FirType
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
class FirMemberPropertyImpl(
|
class FirMemberPropertyImpl(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
psi: PsiElement?,
|
psi: PsiElement?,
|
||||||
|
symbol: FirPropertySymbol,
|
||||||
name: Name,
|
name: Name,
|
||||||
visibility: Visibility,
|
visibility: Visibility,
|
||||||
modality: Modality?,
|
modality: Modality?,
|
||||||
@@ -37,7 +39,7 @@ class FirMemberPropertyImpl(
|
|||||||
override var setter: FirPropertyAccessor,
|
override var setter: FirPropertyAccessor,
|
||||||
override var delegate: FirExpression?
|
override var delegate: FirExpression?
|
||||||
) : FirAbstractCallableMember(
|
) : FirAbstractCallableMember(
|
||||||
session, psi, name, visibility, modality, isExpect, isActual, isOverride, receiverType, returnType
|
session, psi, symbol, name, visibility, modality, isExpect, isActual, isOverride, receiverType, returnType
|
||||||
), FirProperty {
|
), FirProperty {
|
||||||
init {
|
init {
|
||||||
status.isConst = isConst
|
status.isConst = isConst
|
||||||
|
|||||||
+3
-1
@@ -9,14 +9,16 @@ import com.intellij.psi.PsiElement
|
|||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.FirType
|
import org.jetbrains.kotlin.fir.types.FirType
|
||||||
|
|
||||||
class FirPrimaryConstructorImpl(
|
class FirPrimaryConstructorImpl(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
psi: PsiElement?,
|
psi: PsiElement?,
|
||||||
|
symbol: FirFunctionSymbol,
|
||||||
visibility: Visibility,
|
visibility: Visibility,
|
||||||
isExpect: Boolean,
|
isExpect: Boolean,
|
||||||
isActual: Boolean,
|
isActual: Boolean,
|
||||||
delegatedSelfType: FirType,
|
delegatedSelfType: FirType,
|
||||||
delegatedConstructor: FirDelegatedConstructorCall?
|
delegatedConstructor: FirDelegatedConstructorCall?
|
||||||
) : FirConstructorImpl(session, psi, visibility, isExpect, isActual, delegatedSelfType, delegatedConstructor)
|
) : FirConstructorImpl(session, psi, symbol, visibility, isExpect, isActual, delegatedSelfType, delegatedConstructor)
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* 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.references
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.fir.FirAbstractElement
|
||||||
|
import org.jetbrains.kotlin.fir.FirResolvedCallableReference
|
||||||
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class FirResolvedCallableReferenceImpl(
|
||||||
|
session: FirSession,
|
||||||
|
psi: PsiElement?,
|
||||||
|
override val name: Name,
|
||||||
|
override val callableSymbol: ConeCallableSymbol
|
||||||
|
) : FirAbstractElement(session, psi), FirResolvedCallableReference
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* 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.symbols.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
|
|
||||||
|
class FirFunctionSymbol(override val callableId: CallableId) : ConeFunctionSymbol, AbstractFirBasedSymbol<FirCallableMember>() {
|
||||||
|
override val parameters: List<ConeKotlinType>
|
||||||
|
get() = emptyList()
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* 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.symbols.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirCallableMember
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
|
||||||
|
|
||||||
|
class FirPropertySymbol(override val callableId: CallableId) : ConePropertySymbol, AbstractFirBasedSymbol<FirCallableMember>()
|
||||||
+9
-1
@@ -136,10 +136,14 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
|||||||
return transformElement(reference, data)
|
return transformElement(reference, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun <E : FirReference> transformNamedReference(namedReference: E, data: D): CompositeTransformResult<E> {
|
open fun transformNamedReference(namedReference: FirNamedReference, data: D): CompositeTransformResult<FirNamedReference> {
|
||||||
return transformReference(namedReference, data)
|
return transformReference(namedReference, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun transformResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference, data: D): CompositeTransformResult<FirNamedReference> {
|
||||||
|
return transformNamedReference(resolvedCallableReference, data)
|
||||||
|
}
|
||||||
|
|
||||||
open fun <E : FirReference> transformSuperReference(superReference: E, data: D): CompositeTransformResult<E> {
|
open fun <E : FirReference> transformSuperReference(superReference: E, data: D): CompositeTransformResult<E> {
|
||||||
return transformReference(superReference, data)
|
return transformReference(superReference, data)
|
||||||
}
|
}
|
||||||
@@ -580,6 +584,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
|||||||
return transformRegularClass(regularClass, data)
|
return transformRegularClass(regularClass, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference, data: D): CompositeTransformResult<FirElement> {
|
||||||
|
return transformResolvedCallableReference(resolvedCallableReference, data)
|
||||||
|
}
|
||||||
|
|
||||||
final override fun visitResolvedDeclarationStatus(resolvedDeclarationStatus: FirResolvedDeclarationStatus, data: D): CompositeTransformResult<FirElement> {
|
final override fun visitResolvedDeclarationStatus(resolvedDeclarationStatus: FirResolvedDeclarationStatus, data: D): CompositeTransformResult<FirElement> {
|
||||||
return transformResolvedDeclarationStatus(resolvedDeclarationStatus, data)
|
return transformResolvedDeclarationStatus(resolvedDeclarationStatus, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -140,6 +140,10 @@ abstract class FirVisitor<out R, in D> {
|
|||||||
return visitReference(namedReference, data)
|
return visitReference(namedReference, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference, data: D): R {
|
||||||
|
return visitNamedReference(resolvedCallableReference, data)
|
||||||
|
}
|
||||||
|
|
||||||
open fun visitSuperReference(superReference: FirSuperReference, data: D): R {
|
open fun visitSuperReference(superReference: FirSuperReference, data: D): R {
|
||||||
return visitReference(superReference, data)
|
return visitReference(superReference, data)
|
||||||
}
|
}
|
||||||
|
|||||||
+8
@@ -140,6 +140,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
|||||||
visitReference(namedReference, null)
|
visitReference(namedReference, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference) {
|
||||||
|
visitNamedReference(resolvedCallableReference, null)
|
||||||
|
}
|
||||||
|
|
||||||
open fun visitSuperReference(superReference: FirSuperReference) {
|
open fun visitSuperReference(superReference: FirSuperReference) {
|
||||||
visitReference(superReference, null)
|
visitReference(superReference, null)
|
||||||
}
|
}
|
||||||
@@ -580,6 +584,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
|||||||
visitRegularClass(regularClass)
|
visitRegularClass(regularClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference, data: Nothing?) {
|
||||||
|
visitResolvedCallableReference(resolvedCallableReference)
|
||||||
|
}
|
||||||
|
|
||||||
final override fun visitResolvedDeclarationStatus(resolvedDeclarationStatus: FirResolvedDeclarationStatus, data: Nothing?) {
|
final override fun visitResolvedDeclarationStatus(resolvedDeclarationStatus: FirResolvedDeclarationStatus, data: Nothing?) {
|
||||||
visitResolvedDeclarationStatus(resolvedDeclarationStatus)
|
visitResolvedDeclarationStatus(resolvedDeclarationStatus)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FILE: user.kt
|
FILE: user.kt
|
||||||
public final function foo(hello: R|hello/Hello|): R|kotlin/String| {
|
public final function foo(hello: R|hello/Hello|): R|kotlin/String| {
|
||||||
return@@@foo STUB
|
return@@@foo <Unresolved name: hello>#.<Unresolved name: msg>#
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
expect open class A() {
|
||||||
|
fun foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
open class B : A()
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
FILE: common.kt
|
||||||
|
public open expect class A {
|
||||||
|
public constructor(): super<R|kotlin/Any|>()
|
||||||
|
|
||||||
|
public final function foo(): R|kotlin/Unit|
|
||||||
|
|
||||||
|
}
|
||||||
|
public open class B : R|A| {
|
||||||
|
public constructor(): super<R|A|>()
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
actual open class A {
|
||||||
|
actual fun foo() {}
|
||||||
|
|
||||||
|
fun bar() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
class C : B() {
|
||||||
|
fun test() {
|
||||||
|
foo()
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class D : A() {
|
||||||
|
fun test() {
|
||||||
|
foo()
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
FILE: jvm.kt
|
||||||
|
public open actual class A {
|
||||||
|
public constructor(): super<R|kotlin/Any|>()
|
||||||
|
|
||||||
|
public final actual function foo(): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final function bar(): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class C : R|B| {
|
||||||
|
public constructor(): super<R|B|>()
|
||||||
|
|
||||||
|
public final function test(): R|kotlin/Unit| {
|
||||||
|
R|/A.foo|()
|
||||||
|
<Unresolved name: bar>#()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class D : R|A| {
|
||||||
|
public constructor(): super<R|A|>()
|
||||||
|
|
||||||
|
public final function test(): R|kotlin/Unit| {
|
||||||
|
R|/A.foo|()
|
||||||
|
<Unresolved name: bar>#()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -68,7 +68,7 @@ abstract class AbstractFirMultiModuleResolveTest : AbstractMultiModuleTest() {
|
|||||||
for (module in project.allModules().drop(1)) {
|
for (module in project.allModules().drop(1)) {
|
||||||
val session = createSession(module, provider)
|
val session = createSession(module, provider)
|
||||||
|
|
||||||
val builder = RawFirBuilder(session, stubMode = true)
|
val builder = RawFirBuilder(session, stubMode = false)
|
||||||
val psiManager = PsiManager.getInstance(project)
|
val psiManager = PsiManager.getInstance(project)
|
||||||
|
|
||||||
val ideaModuleInfo = session.moduleInfo.cast<IdeaModuleInfo>()
|
val ideaModuleInfo = session.moduleInfo.cast<IdeaModuleInfo>()
|
||||||
|
|||||||
+5
@@ -33,4 +33,9 @@ public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleRe
|
|||||||
public void testBasic() throws Exception {
|
public void testBasic() throws Exception {
|
||||||
runTest("idea/testData/fir/multiModule/basic/");
|
runTest("idea/testData/fir/multiModule/basic/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("mppMembers")
|
||||||
|
public void testMppMembers() throws Exception {
|
||||||
|
runTest("idea/testData/fir/multiModule/mppMembers/");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user