From 34c3c04ead96f60ada2f9d4e5cbc14a0d23210a4 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 7 Dec 2015 16:41:03 +0300 Subject: [PATCH] Implement NameResolverImpl#getPackageFqName(index) --- .../deserialization/NameResolverImpl.kt | 66 +++++++------------ 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolverImpl.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolverImpl.kt index b9c654f5a15..c625a1569c2 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolverImpl.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolverImpl.kt @@ -14,22 +14,6 @@ * limitations under the License. */ -/* - * Copyright 2010-2015 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.deserialization import org.jetbrains.kotlin.name.ClassId @@ -37,58 +21,56 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName -import org.jetbrains.kotlin.utils.rethrow -import java.io.IOException import java.io.InputStream import java.util.* class NameResolverImpl private constructor( private val strings: ProtoBuf.StringTable, - private val qualifiedNames: ProtoBuf.QualifiedNameTable) : NameResolver { + private val qualifiedNames: ProtoBuf.QualifiedNameTable +) : NameResolver { - override fun getString(index: Int): String { - return strings.getString(index) - } + override fun getString(index: Int) = strings.getString(index) - override fun getName(index: Int): Name { - return Name.guess(strings.getString(index)) - } + override fun getName(index: Int) = Name.guess(strings.getString(index)) override fun getClassId(index: Int): ClassId { - var index = index - val packageFqName = LinkedList() - val relativeClassName = LinkedList() + val (packageFqNameSegments, relativeClassNameSegments, isLocal) = traverseIds(index) + return ClassId(FqName.fromSegments(packageFqNameSegments), FqName.fromSegments(relativeClassNameSegments), isLocal) + } + + fun getPackageFqName(index: Int): FqName { + val packageNameSegments = traverseIds(index).first + return FqName.fromSegments(packageNameSegments) + } + + private fun traverseIds(startingIndex: Int): Triple, List, Boolean> { + var index = startingIndex + val packageNameSegments = LinkedList() + val relativeClassNameSegments = LinkedList() var local = false while (index != -1) { val proto = qualifiedNames.getQualifiedName(index) val shortName = strings.getString(proto.shortName) when (proto.kind!!) { - QualifiedName.Kind.CLASS -> relativeClassName.addFirst(shortName) - QualifiedName.Kind.PACKAGE -> packageFqName.addFirst(shortName) + QualifiedName.Kind.CLASS -> relativeClassNameSegments.addFirst(shortName) + QualifiedName.Kind.PACKAGE -> packageNameSegments.addFirst(shortName) QualifiedName.Kind.LOCAL -> { - relativeClassName.addFirst(shortName) + relativeClassNameSegments.addFirst(shortName) local = true } } index = proto.parentQualifiedName } - - return ClassId(FqName.fromSegments(packageFqName), FqName.fromSegments(relativeClassName), local) + return Triple(packageNameSegments, relativeClassNameSegments, local) } companion object { fun read(stream: InputStream): NameResolverImpl { - try { - val simpleNames = ProtoBuf.StringTable.parseDelimitedFrom(stream) - val qualifiedNames = ProtoBuf.QualifiedNameTable.parseDelimitedFrom(stream) - return NameResolverImpl(simpleNames, qualifiedNames) - } - catch (e: IOException) { - throw rethrow(e) - } - + val simpleNames = ProtoBuf.StringTable.parseDelimitedFrom(stream) + val qualifiedNames = ProtoBuf.QualifiedNameTable.parseDelimitedFrom(stream) + return NameResolverImpl(simpleNames, qualifiedNames) } } }