org.jetbrains.kotlin.resolve.lazy.declarations.AbstractPsiBasedDeclarationProvider.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kotlin-compiler-embeddable Show documentation
Show all versions of kotlin-compiler-embeddable Show documentation
the Kotlin compiler embeddable
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.resolve.lazy.declarations
import com.google.common.collect.ArrayListMultimap
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.safeNameForLazyResolve
import org.jetbrains.kotlin.resolve.lazy.data.KtClassInfoUtil
import org.jetbrains.kotlin.resolve.lazy.data.KtClassOrObjectInfo
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.storage.StorageManager
import java.util.*
abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManager) : DeclarationProvider {
protected class Index {
// This mutable state is only modified under inside the computable
val allDeclarations = ArrayList()
val functions = ArrayListMultimap.create()
val properties = ArrayListMultimap.create()
val classesAndObjects = ArrayListMultimap.create>() // order matters here
val scripts = ArrayListMultimap.create()
val typeAliases = ArrayListMultimap.create()
val destructuringDeclarationsEntries = ArrayListMultimap.create()
val names = hashSetOf()
fun putToIndex(declaration: KtDeclaration) {
if (declaration is KtAnonymousInitializer || declaration is KtSecondaryConstructor) return
allDeclarations.add(declaration)
when (declaration) {
is KtNamedFunction ->
functions.put(declaration.safeNameForLazyResolve(), declaration)
is KtProperty ->
properties.put(declaration.safeNameForLazyResolve(), declaration)
is KtTypeAlias ->
typeAliases.put(declaration.nameAsName.safeNameForLazyResolve(), declaration)
is KtClassOrObject ->
classesAndObjects.put(declaration.nameAsName.safeNameForLazyResolve(), KtClassInfoUtil.createClassOrObjectInfo(declaration))
is KtScript ->
scripts.put(KtScriptInfo(declaration).script.nameAsName!!, KtScriptInfo(declaration))
is KtDestructuringDeclaration -> {
for (entry in declaration.entries) {
val name = entry.nameAsName.safeNameForLazyResolve()
destructuringDeclarationsEntries.put(name, entry)
names.add(name)
}
}
is KtParameter -> {
// Do nothing, just put it into allDeclarations is enough
}
else -> throw IllegalArgumentException("Unknown declaration: " + declaration)
}
when (declaration) {
is KtNamedDeclaration -> names.add(declaration.safeNameForLazyResolve())
}
}
override fun toString() = "allDeclarations: " + allDeclarations.mapNotNull { it.name }
}
override fun getDeclarationNames() = index().names
private val index = storageManager.createLazyValue {
val index = Index()
doCreateIndex(index)
index
}
protected abstract fun doCreateIndex(index: Index)
internal fun toInfoString() = toString() + ": " + index().toString()
override fun getDeclarations(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): List {
val allDeclarations = index().allDeclarations
if (kindFilter == DescriptorKindFilter.CLASSIFIERS) {
return allDeclarations.filter { it is KtClassOrObject || it is KtTypeAlias }
}
return allDeclarations
}
override fun getFunctionDeclarations(name: Name): List = index().functions[name.safeNameForLazyResolve()].toList()
override fun getPropertyDeclarations(name: Name): List = index().properties[name.safeNameForLazyResolve()].toList()
override fun getDestructuringDeclarationsEntries(name: Name): Collection =
index().destructuringDeclarationsEntries[name.safeNameForLazyResolve()].toList()
override fun getClassOrObjectDeclarations(name: Name): Collection> =
index().classesAndObjects[name.safeNameForLazyResolve()]
override fun getScriptDeclarations(name: Name): MutableList =
index().scripts[name.safeNameForLazyResolve()]
override fun getTypeAliasDeclarations(name: Name): Collection = index().typeAliases[name.safeNameForLazyResolve()]
}