Skip to content

Commit 5a00a97

Browse files
committed
Extract common parts from deserialization of built-ins and JS
1 parent 3cb8f1a commit 5a00a97

File tree

10 files changed

+70
-101
lines changed

10 files changed

+70
-101
lines changed

core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsPackageFragment.kt

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ package org.jetbrains.kotlin.builtins
1919
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
2020
import org.jetbrains.kotlin.name.FqName
2121
import org.jetbrains.kotlin.serialization.ProtoBuf
22-
import org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer
23-
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
24-
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
25-
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
22+
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl
2623
import org.jetbrains.kotlin.storage.StorageManager
2724
import java.io.InputStream
2825

@@ -31,31 +28,17 @@ class BuiltInsPackageFragment(
3128
storageManager: StorageManager,
3229
module: ModuleDescriptor,
3330
inputStream: InputStream
34-
) : DeserializedPackageFragment(fqName, storageManager, module) {
35-
private val proto = inputStream.use { stream ->
36-
val version = BuiltInsBinaryVersion.readFrom(stream)
37-
38-
if (!version.isCompatible()) {
39-
// TODO: report a proper diagnostic
40-
throw UnsupportedOperationException(
41-
"Kotlin built-in definition format version is not supported: " +
42-
"expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " +
43-
"Please update Kotlin"
44-
)
45-
}
46-
47-
ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry)
31+
) : DeserializedPackageFragmentImpl(fqName, storageManager, module, inputStream.use { stream ->
32+
val version = BuiltInsBinaryVersion.readFrom(stream)
33+
34+
if (!version.isCompatible()) {
35+
// TODO: report a proper diagnostic
36+
throw UnsupportedOperationException(
37+
"Kotlin built-in definition format version is not supported: " +
38+
"expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " +
39+
"Please update Kotlin"
40+
)
4841
}
4942

50-
private val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames)
51-
52-
override val classDataFinder = BuiltInsClassDataFinder(proto, nameResolver)
53-
54-
override fun computeMemberScope() =
55-
DeserializedPackageMemberScope(
56-
this, proto.`package`, nameResolver, containerSource = null, components = components,
57-
classNames = { classDataFinder.allClassIds.filter { classId ->
58-
!classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST
59-
}.map { it.shortClassName } }
60-
)
61-
}
43+
ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry)
44+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright 2010-2017 JetBrains s.r.o.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.jetbrains.kotlin.serialization.deserialization
18+
19+
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
20+
import org.jetbrains.kotlin.name.FqName
21+
import org.jetbrains.kotlin.serialization.ProtoBuf
22+
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
23+
import org.jetbrains.kotlin.storage.StorageManager
24+
25+
abstract class DeserializedPackageFragmentImpl(
26+
fqName: FqName,
27+
storageManager: StorageManager,
28+
module: ModuleDescriptor,
29+
protected val proto: ProtoBuf.PackageFragment
30+
) : DeserializedPackageFragment(fqName, storageManager, module) {
31+
protected val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames)
32+
33+
override val classDataFinder = ProtoBasedClassDataFinder(proto, nameResolver)
34+
35+
override fun computeMemberScope() =
36+
DeserializedPackageMemberScope(
37+
this, proto.`package`, nameResolver, containerSource = null, components = components,
38+
classNames = { classDataFinder.allClassIds.filter { classId ->
39+
!classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST
40+
}.map { it.shortClassName } }
41+
)
42+
}

core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt renamed to core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,15 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.jetbrains.kotlin.builtins
17+
package org.jetbrains.kotlin.serialization.deserialization
1818

1919
import org.jetbrains.kotlin.descriptors.SourceElement
2020
import org.jetbrains.kotlin.name.ClassId
2121
import org.jetbrains.kotlin.serialization.ClassData
2222
import org.jetbrains.kotlin.serialization.ClassDataWithSource
2323
import org.jetbrains.kotlin.serialization.ProtoBuf
24-
import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
25-
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
2624

27-
class BuiltInsClassDataFinder(
25+
class ProtoBasedClassDataFinder(
2826
proto: ProtoBuf.PackageFragment,
2927
private val nameResolver: NameResolver
3028
) : ClassDataFinder {

idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDeserializerForDecompiler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.idea.decompiler.builtIns
1818

1919
import com.intellij.openapi.diagnostic.Logger
2020
import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol
21-
import org.jetbrains.kotlin.builtins.BuiltInsClassDataFinder
21+
import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder
2222
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
2323
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
2424
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
@@ -46,7 +46,7 @@ class KotlinBuiltInDeserializerForDecompiler(
4646
val notFoundClasses = NotFoundClasses(storageManager, moduleDescriptor)
4747

4848
deserializationComponents = DeserializationComponents(
49-
storageManager, moduleDescriptor, DeserializationConfiguration.Default, BuiltInsClassDataFinder(proto, nameResolver),
49+
storageManager, moduleDescriptor, DeserializationConfiguration.Default, ProtoBasedClassDataFinder(proto, nameResolver),
5050
AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, BuiltInSerializerProtocol), packageFragmentProvider,
5151
ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG),
5252
LookupTracker.DO_NOTHING, FlexibleTypeDeserializer.ThrowException, emptyList(), notFoundClasses

idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import com.intellij.psi.impl.compiled.ClassFileStubBuilder
2121
import com.intellij.psi.stubs.PsiFileStub
2222
import com.intellij.util.indexing.FileContent
2323
import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol
24-
import org.jetbrains.kotlin.builtins.BuiltInsClassDataFinder
24+
import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder
2525
import org.jetbrains.kotlin.idea.decompiler.common.AnnotationLoaderForStubBuilderImpl
2626
import org.jetbrains.kotlin.idea.decompiler.stubBuilder.*
2727
import org.jetbrains.kotlin.psi.stubs.KotlinStubVersions
@@ -45,7 +45,7 @@ class KotlinBuiltInStubBuilder : ClsStubBuilder() {
4545
val packageFqName = file.packageFqName
4646
val nameResolver = file.nameResolver
4747
val components = ClsStubBuilderComponents(
48-
BuiltInsClassDataFinder(file.proto, nameResolver),
48+
ProtoBasedClassDataFinder(file.proto, nameResolver),
4949
AnnotationLoaderForStubBuilderImpl(BuiltInSerializerProtocol),
5050
virtualFile
5151
)

idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptDeserializerForDecompiler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.decompiler.js
1919
import com.intellij.openapi.diagnostic.Logger
2020
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
2121
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
22+
import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder
2223
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
2324
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase
2425
import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter
@@ -32,7 +33,6 @@ import org.jetbrains.kotlin.serialization.deserialization.*
3233
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
3334
import org.jetbrains.kotlin.serialization.js.DynamicTypeDeserializer
3435
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
35-
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptClassDataFinder
3636

3737
// TODO: deduplicate with KotlinBuiltInDeserializerForDecompiler
3838
class KotlinJavaScriptDeserializerForDecompiler(
@@ -49,7 +49,7 @@ class KotlinJavaScriptDeserializerForDecompiler(
4949
val notFoundClasses = NotFoundClasses(storageManager, moduleDescriptor)
5050

5151
deserializationComponents = DeserializationComponents(
52-
storageManager, moduleDescriptor, DeserializationConfiguration.Default, KotlinJavascriptClassDataFinder(proto, nameResolver),
52+
storageManager, moduleDescriptor, DeserializationConfiguration.Default, ProtoBasedClassDataFinder(proto, nameResolver),
5353
AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, JsSerializerProtocol), packageFragmentProvider,
5454
ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG),
5555
LookupTracker.DO_NOTHING, DynamicTypeDeserializer, emptyList(), notFoundClasses

idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ import com.intellij.psi.compiled.ClsStubBuilder
2020
import com.intellij.psi.impl.compiled.ClassFileStubBuilder
2121
import com.intellij.psi.stubs.PsiFileStub
2222
import com.intellij.util.indexing.FileContent
23+
import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder
2324
import org.jetbrains.kotlin.idea.decompiler.common.AnnotationLoaderForStubBuilderImpl
2425
import org.jetbrains.kotlin.idea.decompiler.stubBuilder.*
2526
import org.jetbrains.kotlin.psi.stubs.KotlinStubVersions
2627
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer
2728
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
2829
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
29-
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptClassDataFinder
3030

3131
// TODO: deduplicate code with KotlinBuiltInStubBuilder
3232
class KotlinJavaScriptStubBuilder : ClsStubBuilder() {
@@ -46,7 +46,7 @@ class KotlinJavaScriptStubBuilder : ClsStubBuilder() {
4646
val packageFqName = file.packageFqName
4747
val nameResolver = file.nameResolver
4848
val components = ClsStubBuilderComponents(
49-
KotlinJavascriptClassDataFinder(file.proto, nameResolver),
49+
ProtoBasedClassDataFinder(file.proto, nameResolver),
5050
AnnotationLoaderForStubBuilderImpl(JsSerializerProtocol),
5151
virtualFile
5252
)

js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptClassDataFinder.kt

Lines changed: 0 additions & 42 deletions
This file was deleted.

js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,12 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
2020
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
2121
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
2222
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
23-
import org.jetbrains.kotlin.name.ClassId
2423
import org.jetbrains.kotlin.name.FqName
2524
import org.jetbrains.kotlin.resolve.DescriptorUtils
2625
import org.jetbrains.kotlin.serialization.ProtoBuf
2726
import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer
28-
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
29-
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
27+
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl
3028
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
31-
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
3229
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
3330
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor
3431
import org.jetbrains.kotlin.storage.StorageManager
@@ -38,11 +35,10 @@ class KotlinJavascriptPackageFragment(
3835
fqName: FqName,
3936
storageManager: StorageManager,
4037
module: ModuleDescriptor,
41-
private val proto: ProtoBuf.PackageFragment,
42-
private val nameResolver: NameResolver
43-
) : DeserializedPackageFragment(fqName, storageManager, module) {
38+
proto: ProtoBuf.PackageFragment
39+
) : DeserializedPackageFragmentImpl(fqName, storageManager, module, proto) {
4440
private val fileMap: Map<Int, FileHolder> by storageManager.createLazyValue {
45-
proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) ->
41+
this.proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) ->
4642
(if (file.hasId()) file.id else index) to FileHolder(file.annotationList)
4743
}
4844
}
@@ -51,14 +47,6 @@ class KotlinJavascriptPackageFragment(
5147
AnnotationDeserializer(module, components.notFoundClasses)
5248
}
5349

54-
override val classDataFinder = KotlinJavascriptClassDataFinder(proto, nameResolver)
55-
56-
override fun computeMemberScope(): DeserializedPackageMemberScope =
57-
DeserializedPackageMemberScope(
58-
this, proto.`package`, nameResolver, containerSource = null, components = components,
59-
classNames = { classDataFinder.allClassIds.filterNot(ClassId::isNestedClass).map { it.shortClassName } }
60-
)
61-
6250
fun getContainingFileAnnotations(descriptor: DeclarationDescriptor): List<AnnotationDescriptor> {
6351
if (DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor::class.java) != this) {
6452
throw IllegalArgumentException("Provided descriptor $descriptor does not belong to this package $this")

js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ fun createKotlinJavascriptPackageFragmentProvider(
3737
proto.class_Count > 0 -> nameResolver.getClassId(proto.class_OrBuilderList.first().fqName).packageFqName
3838
else -> throw IllegalStateException("Invalid library part: either a Package or a Class must be present")
3939
}
40-
KotlinJavascriptPackageFragment(fqName, storageManager, module, proto, nameResolver)
40+
KotlinJavascriptPackageFragment(fqName, storageManager, module, proto)
4141
}
4242

4343
val provider = PackageFragmentProviderImpl(packageFragments)

0 commit comments

Comments
 (0)