Make NameResolver.getClassId extension instead of member

To get rid of dependency of NameResolver on ClassId
This commit is contained in:
Alexander Udalov
2018-03-01 13:27:53 +01:00
parent 27ad4f7d5d
commit e31f286444
23 changed files with 55 additions and 29 deletions
@@ -19,8 +19,6 @@ package org.jetbrains.kotlin.load.kotlin
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.StringTableTypes.Record
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.StringTableTypes.Record.Operation.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
import java.util.*
@@ -85,15 +83,11 @@ class JvmNameResolver(
override fun getName(index: Int) = Name.guessByFirstCharacter(getString(index))
override fun getClassId(index: Int): ClassId {
val string = getString(index)
val lastSlash = string.lastIndexOf('/')
val packageName =
if (lastSlash < 0) FqName.ROOT
else FqName(string.substring(0, lastSlash).replace('/', '.'))
val className = FqName(string.substring(lastSlash + 1))
return ClassId(packageName, className, index in localNameIndices)
}
override fun getQualifiedClassName(index: Int): String =
getString(index)
override fun isLocalClassName(index: Int): Boolean =
index in localNameIndices
companion object {
val PREDEFINED_STRINGS = listOf(
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
import org.jetbrains.kotlin.serialization.deserialization.getClassId
import java.io.ByteArrayInputStream
import java.io.DataInputStream
import java.io.IOException
@@ -100,9 +100,14 @@ public final class ClassId {
*/
@NotNull
public static ClassId fromString(@NotNull String string) {
return fromString(string, false);
}
@NotNull
public static ClassId fromString(@NotNull String string, boolean isLocal) {
String packageName = StringsKt.substringBeforeLast(string, '/', "").replace('/', '.');
String className = StringsKt.substringAfterLast(string, '/', string);
return new ClassId(new FqName(packageName), new FqName(className), false);
return new ClassId(new FqName(packageName), new FqName(className), isLocal);
}
/**
@@ -27,6 +27,11 @@ public interface NameResolver {
@NotNull
Name getName(int index);
/**
* @return the fully qualified name of some class in the format: `org/foo/bar/Test.Inner`
*/
@NotNull
ClassId getClassId(int index);
String getQualifiedClassName(int index);
boolean isLocalClassName(int index);
}
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.ProtoBuf.QualifiedNameTable.QualifiedName
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import java.util.*
@@ -32,11 +31,16 @@ class NameResolverImpl(
override fun getName(index: Int) = Name.guessByFirstCharacter(strings.getString(index))
override fun getClassId(index: Int): ClassId {
val (packageFqNameSegments, relativeClassNameSegments, isLocal) = traverseIds(index)
return ClassId(FqName.fromSegments(packageFqNameSegments), FqName.fromSegments(relativeClassNameSegments), isLocal)
override fun getQualifiedClassName(index: Int): String {
val (packageFqNameSegments, relativeClassNameSegments) = traverseIds(index)
val className = relativeClassNameSegments.joinToString(".")
return if (packageFqNameSegments.isEmpty()) className
else packageFqNameSegments.joinToString("/") + "/$className"
}
override fun isLocalClassName(index: Int): Boolean =
traverseIds(index).third
fun getPackageFqName(index: Int): FqName {
val packageNameSegments = traverseIds(index).first
return FqName.fromSegments(packageNameSegments)
@@ -0,0 +1,12 @@
/*
* Copyright 2000-2018 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.serialization.deserialization
import org.jetbrains.kotlin.name.ClassId
fun NameResolver.getClassId(index: Int): ClassId {
return ClassId.fromString(getQualifiedClassName(index), isLocalClassName(index))
}