From aa20d88dff1ac20a60d846dd2c68baea416ef1fa Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 20 Mar 2018 01:24:20 +0300 Subject: [PATCH] FIR: Create ad-hoc fir by name provider --- .../kotlin/fir/resolve/FirProvider.kt | 28 +++++++++ .../fir/resolve/impl/FirProviderImpl.kt | 63 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt new file mode 100644 index 00000000000..310862ceef6 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirProvider.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2018 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 + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.UnambiguousFqName +import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.FirTypeParameter +import org.jetbrains.kotlin.fir.service +import org.jetbrains.kotlin.name.FqNameUnsafe +import org.jetbrains.kotlin.name.Name + +interface FirProvider { + fun getFirFilesByPackage(fqName: FqNameUnsafe): List + + fun getFirClassifierByFqName(fqName: UnambiguousFqName): FirMemberDeclaration? + + fun getFirTypeParameterByFqName(fqName: UnambiguousFqName, parameterName: Name): FirTypeParameter? + + + companion object { + fun getInstance(session: FirSession): FirProvider = session.service() + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt new file mode 100644 index 00000000000..6fc2abab042 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirProviderImpl.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2010-2018 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.impl + +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.UnambiguousFqName +import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.resolve.FirProvider +import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.FqNameUnsafe +import org.jetbrains.kotlin.name.Name + +class FirProviderImpl(val session: FirSession) : FirProvider { + + fun recordFile(file: FirFile) { + val packageName = file.packageFqName.toUnsafe() + fileMap.merge(packageName, listOf(file)) { a, b -> a + b } + + file.acceptChildren(object : FirVisitorVoid() { + override fun visitElement(element: FirElement) {} + + var containerFqName: FqName = FqName.ROOT + + override fun visitClass(klass: FirClass) { + val fqName = containerFqName.child(klass.name) + classifierMap[UnambiguousFqName(packageName, fqName)] = klass + + containerFqName = fqName + klass.acceptChildren(this) + containerFqName = fqName.parent() + } + + override fun visitTypeAlias(typeAlias: FirTypeAlias) { + val fqName = containerFqName.child(typeAlias.name) + classifierMap[UnambiguousFqName(packageName, fqName)] = typeAlias + } + }) + } + + private val fileMap = mutableMapOf>() + private val classifierMap = mutableMapOf() + + override fun getFirFilesByPackage(fqName: FqNameUnsafe): List { + + + return fileMap[fqName].orEmpty() + } + + override fun getFirClassifierByFqName(fqName: UnambiguousFqName): FirMemberDeclaration? { + return classifierMap[fqName] + } + + override fun getFirTypeParameterByFqName(fqName: UnambiguousFqName, parameterName: Name): FirTypeParameter? { + val typeParameterContainer = (getFirClassifierByFqName(fqName) as? FirTypeParameterContainer) ?: return null + // TODO: Optimize search here + return typeParameterContainer.typeParameters.find { it.name == parameterName } + } +} \ No newline at end of file