From bb1acdbe95ef23b4106b84ce6b27e23b03a1dcc4 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 19 Mar 2019 13:01:17 +0300 Subject: [PATCH] Minor. Extract classes deserialization from BuiltInsPackageFragment --- .../deserialization/ClassDeserialization.kt | 81 +++++++++++++++++++ .../impl/FirLibrarySymbolProviderImpl.kt | 60 +------------- 2 files changed, 83 insertions(+), 58 deletions(-) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt new file mode 100644 index 00000000000..5d3b17b9850 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -0,0 +1,81 @@ +/* + * 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.deserialization + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl +import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl +import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.Flags +import org.jetbrains.kotlin.metadata.deserialization.NameResolver +import org.jetbrains.kotlin.metadata.deserialization.TypeTable +import org.jetbrains.kotlin.metadata.deserialization.supertypes +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags +import org.jetbrains.kotlin.serialization.deserialization.getName +import org.jetbrains.kotlin.types.Variance + +fun deserializeClassToSymbol( + classId: ClassId, + classProto: ProtoBuf.Class, + symbol: FirClassSymbol, + nameResolver: NameResolver, + session: FirSession +) { + val flags = classProto.flags + val kind = Flags.CLASS_KIND.get(flags) + FirClassImpl( + session, null, symbol, classId.shortClassName, + ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), + ProtoEnumFlags.modality(Flags.MODALITY.get(flags)), + Flags.IS_EXPECT_CLASS.get(flags), false, + ProtoEnumFlags.classKind(kind), + Flags.IS_INNER.get(flags), + kind == ProtoBuf.Class.Kind.COMPANION_OBJECT, + Flags.IS_DATA.get(classProto.flags), + Flags.IS_INLINE_CLASS.get(classProto.flags) + ).apply { + for (typeParameter in classProto.typeParameterList) { + typeParameters += createTypeParameterSymbol(nameResolver.getName(typeParameter.name), session).fir + } + //addAnnotationsFrom(classProto) ? TODO + + val typeTable = TypeTable(classProto.typeTable) + val typeDeserializer = FirTypeDeserializer( + nameResolver, + typeTable, + classProto.typeParameterList, + null + ) + + val superTypesDeserialized = classProto.supertypes(typeTable).map { supertypeProto -> + typeDeserializer.simpleType(supertypeProto) + }// TODO: + c.components.additionalClassPartsProvider.getSupertypes(this@DeserializedClassDescriptor) + + superTypesDeserialized.mapNotNullTo(superTypeRefs) { + if (it == null) return@mapNotNullTo null + FirResolvedTypeRefImpl(session, null, it, false, emptyList()) + } + + val classDeserializer = + FirDeserializationContext + .createForClass(classId, classProto, nameResolver, session) + .memberDeserializer + + // TODO: properties + nested classes + declarations += classProto.functionList.map(classDeserializer::loadFunction) + } +} + +private fun createTypeParameterSymbol(name: Name, session: FirSession): FirTypeParameterSymbol { + val firSymbol = FirTypeParameterSymbol() + FirTypeParameterImpl(session, null, firSymbol, name, variance = Variance.INVARIANT, isReified = false) + return firSymbol +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt index 52a28fcf666..210c6bdfb5c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt @@ -16,29 +16,21 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl -import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext -import org.jetbrains.kotlin.fir.deserialization.FirTypeDeserializer +import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.getOrPut import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol -import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion -import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl -import org.jetbrains.kotlin.metadata.deserialization.TypeTable -import org.jetbrains.kotlin.metadata.deserialization.supertypes import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder -import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.serialization.deserialization.getName -import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import java.io.InputStream @@ -72,61 +64,13 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider val lookup = mutableMapOf() - private fun createTypeParameterSymbol(name: Name): FirTypeParameterSymbol { - val firSymbol = FirTypeParameterSymbol() - FirTypeParameterImpl(session, null, firSymbol, name, variance = Variance.INVARIANT, isReified = false) - return firSymbol - } - fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? { if (classId !in classDataFinder.allClassIds) return null return lookup.getOrPut(classId, { FirClassSymbol(classId) }) { symbol -> val classData = classDataFinder.findClassData(classId)!! val classProto = classData.classProto - val flags = classProto.flags - val kind = Flags.CLASS_KIND.get(flags) - FirClassImpl( - session, null, symbol, classId.shortClassName, - ProtoEnumFlags.visibility(Flags.VISIBILITY.get(flags)), - ProtoEnumFlags.modality(Flags.MODALITY.get(flags)), - Flags.IS_EXPECT_CLASS.get(flags), false, - ProtoEnumFlags.classKind(kind), - Flags.IS_INNER.get(flags), - kind == ProtoBuf.Class.Kind.COMPANION_OBJECT, - Flags.IS_DATA.get(classProto.flags), - Flags.IS_INLINE_CLASS.get(classProto.flags) - ).apply { - for (typeParameter in classProto.typeParameterList) { - typeParameters += createTypeParameterSymbol(classData.nameResolver.getName(typeParameter.name)).fir - } - //addAnnotationsFrom(classProto) ? TODO - val typeTable = TypeTable(classData.classProto.typeTable) - val typeDeserializer = FirTypeDeserializer( - classData.nameResolver, - typeTable, - classData.classProto.typeParameterList, - null - ) - - val superTypesDeserialized = classProto.supertypes(typeTable).map { supertypeProto -> - typeDeserializer.simpleType(supertypeProto) - }// TODO: + c.components.additionalClassPartsProvider.getSupertypes(this@DeserializedClassDescriptor) - - superTypesDeserialized.mapNotNullTo(superTypeRefs) { - if (it == null) return@mapNotNullTo null - FirResolvedTypeRefImpl(this@BuiltInsPackageFragment.session, null, it, false, emptyList()) - } - - val classDeserializer = - FirDeserializationContext - .createForClass(classId, classProto, nameResolver, this@BuiltInsPackageFragment.session) - .memberDeserializer - - // TODO: properties + nested classes - declarations += classData.classProto.functionList.map(classDeserializer::loadFunction) - - } + deserializeClassToSymbol(classId, classProto, symbol, nameResolver, session) } }