Extract common parts from deserialization of built-ins and JS

This commit is contained in:
Alexander Udalov
2017-02-01 11:18:01 +03:00
parent 3cb8f1ab20
commit 5a00a97cf1
10 changed files with 69 additions and 100 deletions
@@ -1,42 +0,0 @@
/*
* Copyright 2010-2016 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.serialization.js
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.serialization.ClassData
import org.jetbrains.kotlin.serialization.ClassDataWithSource
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
class KotlinJavascriptClassDataFinder(
proto: ProtoBuf.PackageFragment,
private val nameResolver: NameResolver
) : ClassDataFinder {
private val classIdToProto =
proto.class_List.associateBy { klass ->
nameResolver.getClassId(klass.fqName)
}
internal val allClassIds: Collection<ClassId> get() = classIdToProto.keys
override fun findClassData(classId: ClassId): ClassDataWithSource? {
val classProto = classIdToProto[classId] ?: return null
return ClassDataWithSource(ClassData(nameResolver, classProto), SourceElement.NO_SOURCE)
}
}
@@ -20,15 +20,12 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor
import org.jetbrains.kotlin.storage.StorageManager
@@ -38,11 +35,10 @@ class KotlinJavascriptPackageFragment(
fqName: FqName,
storageManager: StorageManager,
module: ModuleDescriptor,
private val proto: ProtoBuf.PackageFragment,
private val nameResolver: NameResolver
) : DeserializedPackageFragment(fqName, storageManager, module) {
proto: ProtoBuf.PackageFragment
) : DeserializedPackageFragmentImpl(fqName, storageManager, module, proto) {
private val fileMap: Map<Int, FileHolder> by storageManager.createLazyValue {
proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) ->
this.proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) ->
(if (file.hasId()) file.id else index) to FileHolder(file.annotationList)
}
}
@@ -51,14 +47,6 @@ class KotlinJavascriptPackageFragment(
AnnotationDeserializer(module, components.notFoundClasses)
}
override val classDataFinder = KotlinJavascriptClassDataFinder(proto, nameResolver)
override fun computeMemberScope(): DeserializedPackageMemberScope =
DeserializedPackageMemberScope(
this, proto.`package`, nameResolver, containerSource = null, components = components,
classNames = { classDataFinder.allClassIds.filterNot(ClassId::isNestedClass).map { it.shortClassName } }
)
fun getContainingFileAnnotations(descriptor: DeclarationDescriptor): List<AnnotationDescriptor> {
if (DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor::class.java) != this) {
throw IllegalArgumentException("Provided descriptor $descriptor does not belong to this package $this")
@@ -37,7 +37,7 @@ fun createKotlinJavascriptPackageFragmentProvider(
proto.class_Count > 0 -> nameResolver.getClassId(proto.class_OrBuilderList.first().fqName).packageFqName
else -> throw IllegalStateException("Invalid library part: either a Package or a Class must be present")
}
KotlinJavascriptPackageFragment(fqName, storageManager, module, proto, nameResolver)
KotlinJavascriptPackageFragment(fqName, storageManager, module, proto)
}
val provider = PackageFragmentProviderImpl(packageFragments)