diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt index e545aa5bf3f..94021decafc 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt @@ -20,7 +20,7 @@ import com.google.protobuf.ExtensionRegistryLite import org.jetbrains.kotlin.serialization.ClassData import org.jetbrains.kotlin.serialization.PackageData import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.deserialization.NameResolver +import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl import java.io.ByteArrayInputStream public object JvmProtoBufUtil { @@ -37,7 +37,7 @@ public object JvmProtoBufUtil { @JvmStatic public fun readClassDataFrom(bytes: ByteArray): ClassData { val input = ByteArrayInputStream(bytes) - val nameResolver = NameResolver.read(input) + val nameResolver = NameResolverImpl.read(input) val classProto = ProtoBuf.Class.parseFrom(input, EXTENSION_REGISTRY) return ClassData(nameResolver, classProto) } @@ -49,7 +49,7 @@ public object JvmProtoBufUtil { @JvmStatic public fun readPackageDataFrom(bytes: ByteArray): PackageData { val input = ByteArrayInputStream(bytes) - val nameResolver = NameResolver.read(input) + val nameResolver = NameResolverImpl.read(input) val packageProto = ProtoBuf.Package.parseFrom(input, EXTENSION_REGISTRY) return PackageData(nameResolver, packageProto) } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt index bc3852ce68c..65cacf4637b 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt @@ -37,7 +37,7 @@ public abstract class DeserializedPackageFragment( private val loadResource: (path: String) -> InputStream? ) : PackageFragmentDescriptorImpl(module, fqName) { - val nameResolver = NameResolver.read( + val nameResolver = NameResolverImpl.read( loadResource(serializedResourcePaths.getStringTableFilePath(fqName)) ?: loadResourceSure(serializedResourcePaths.fallbackPaths.getStringTableFilePath(fqName)) ) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolver.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolver.java index 2209b0f9e5c..088b3d6dbc5 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolver.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolver.java @@ -20,84 +20,17 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; -import org.jetbrains.kotlin.serialization.ProtoBuf; -import org.jetbrains.kotlin.utils.UtilsPackage; -import java.io.IOException; -import java.io.InputStream; -import java.util.LinkedList; - -import static org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName; - -public class NameResolver { +public interface NameResolver { @NotNull - public static NameResolver read(@NotNull InputStream in) { - try { - ProtoBuf.StringTable simpleNames = ProtoBuf.StringTable.parseDelimitedFrom(in); - ProtoBuf.QualifiedNameTable qualifiedNames = ProtoBuf.QualifiedNameTable.parseDelimitedFrom(in); - return new NameResolver(simpleNames, qualifiedNames); - } - catch (IOException e) { - throw UtilsPackage.rethrow(e); - } - } - - private final ProtoBuf.StringTable strings; - private final ProtoBuf.QualifiedNameTable qualifiedNames; - - public NameResolver( - @NotNull ProtoBuf.StringTable strings, - @NotNull ProtoBuf.QualifiedNameTable qualifiedNames - ) { - this.strings = strings; - this.qualifiedNames = qualifiedNames; - } + String getString(int index); @NotNull - public String getString(int index) { - return strings.getString(index); - } + Name getName(int index); @NotNull - public Name getName(int index) { - return Name.guess(strings.getString(index)); - } + ClassId getClassId(int index); @NotNull - public ClassId getClassId(int index) { - LinkedList packageFqName = new LinkedList(); - LinkedList relativeClassName = new LinkedList(); - boolean local = false; - - while (index != -1) { - QualifiedName proto = qualifiedNames.getQualifiedName(index); - String shortName = strings.getString(proto.getShortName()); - switch (proto.getKind()) { - case CLASS: - relativeClassName.addFirst(shortName); - break; - case PACKAGE: - packageFqName.addFirst(shortName); - break; - case LOCAL: - relativeClassName.addFirst(shortName); - local = true; - break; - } - - index = proto.getParentQualifiedName(); - } - - return new ClassId(FqName.fromSegments(packageFqName), FqName.fromSegments(relativeClassName), local); - } - - @NotNull - public FqName getFqName(int index) { - QualifiedName qualifiedName = qualifiedNames.getQualifiedName(index); - Name shortName = getName(qualifiedName.getShortName()); - if (!qualifiedName.hasParentQualifiedName()) { - return FqName.topLevel(shortName); - } - return getFqName(qualifiedName.getParentQualifiedName()).child(shortName); - } + FqName getFqName(int index); } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolverImpl.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolverImpl.java new file mode 100644 index 00000000000..a8fa8b79bc8 --- /dev/null +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NameResolverImpl.java @@ -0,0 +1,107 @@ +/* + * 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.annotations.NotNull; +import org.jetbrains.kotlin.name.ClassId; +import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.serialization.ProtoBuf; +import org.jetbrains.kotlin.utils.UtilsPackage; + +import java.io.IOException; +import java.io.InputStream; +import java.util.LinkedList; + +import static org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName; + +public class NameResolverImpl implements NameResolver { + @NotNull + public static NameResolverImpl read(@NotNull InputStream in) { + try { + ProtoBuf.StringTable simpleNames = ProtoBuf.StringTable.parseDelimitedFrom(in); + ProtoBuf.QualifiedNameTable qualifiedNames = ProtoBuf.QualifiedNameTable.parseDelimitedFrom(in); + return new NameResolverImpl(simpleNames, qualifiedNames); + } + catch (IOException e) { + throw UtilsPackage.rethrow(e); + } + } + + private final ProtoBuf.StringTable strings; + private final ProtoBuf.QualifiedNameTable qualifiedNames; + + public NameResolverImpl( + @NotNull ProtoBuf.StringTable strings, + @NotNull ProtoBuf.QualifiedNameTable qualifiedNames + ) { + this.strings = strings; + this.qualifiedNames = qualifiedNames; + } + + @Override + @NotNull + public String getString(int index) { + return strings.getString(index); + } + + @Override + @NotNull + public Name getName(int index) { + return Name.guess(strings.getString(index)); + } + + @Override + @NotNull + public ClassId getClassId(int index) { + LinkedList packageFqName = new LinkedList(); + LinkedList relativeClassName = new LinkedList(); + boolean local = false; + + while (index != -1) { + QualifiedName proto = qualifiedNames.getQualifiedName(index); + String shortName = strings.getString(proto.getShortName()); + switch (proto.getKind()) { + case CLASS: + relativeClassName.addFirst(shortName); + break; + case PACKAGE: + packageFqName.addFirst(shortName); + break; + case LOCAL: + relativeClassName.addFirst(shortName); + local = true; + break; + } + + index = proto.getParentQualifiedName(); + } + + return new ClassId(FqName.fromSegments(packageFqName), FqName.fromSegments(relativeClassName), local); + } + + @Override + @NotNull + public FqName getFqName(int index) { + QualifiedName qualifiedName = qualifiedNames.getQualifiedName(index); + Name shortName = getName(qualifiedName.getShortName()); + if (!qualifiedName.hasParentQualifiedName()) { + return FqName.topLevel(shortName); + } + return getFqName(qualifiedName.getParentQualifiedName()).child(shortName); + } +} diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt index c61a5bb8092..6096e238e31 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.DeserializationContext import org.jetbrains.kotlin.serialization.deserialization.MemberDeserializer -import org.jetbrains.kotlin.serialization.deserialization.NameResolver +import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl import org.jetbrains.kotlin.serialization.jvm.BitEncoding import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import kotlin.jvm.internal.KotlinCallable @@ -37,7 +37,7 @@ import kotlin.reflect.jvm.internal.getOrCreateModule public fun Function.reflect(): KFunction? { val callable = javaClass.getAnnotation(KotlinCallable::class.java) ?: return null val input = BitEncoding.decodeBytes(callable.data).inputStream() - val nameResolver = NameResolver.read(input) + val nameResolver = NameResolverImpl.read(input) val proto = ProtoBuf.Callable.parseFrom(input, JvmProtoBufUtil.EXTENSION_REGISTRY) val moduleData = javaClass.getOrCreateModule() val context = DeserializationContext(moduleData.deserialization, nameResolver, moduleData.module, diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/KotlinJavaScriptStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/KotlinJavaScriptStubBuilder.kt index f018e95bc84..fb6360bb814 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/KotlinJavaScriptStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/KotlinJavaScriptStubBuilder.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.decompiler.textBuilder.DirectoryBasedKotlinJava import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.serialization.deserialization.NameResolver +import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializedResourcePaths import org.jetbrains.kotlin.serialization.js.toClassData import org.jetbrains.kotlin.serialization.js.toPackageData @@ -57,7 +58,7 @@ public open class KotlinJavaScriptStubBuilder : ClsStubBuilder() { val stringsFile = moduleDirectory.findFileByRelativePath(stringsFileName) assert(stringsFile != null) { "strings file not found: $stringsFileName" } - val nameResolver = NameResolver.read(ByteArrayInputStream(stringsFile!!.contentsToByteArray(false))) + val nameResolver = NameResolverImpl.read(ByteArrayInputStream(stringsFile!!.contentsToByteArray(false))) val components = createStubBuilderComponents(file, packageFqName, nameResolver) if (isPackageHeader) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDeserializerForDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDeserializerForDecompiler.kt index 1971914c010..947a27bbef0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDeserializerForDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDeserializerForDecompiler.kt @@ -38,7 +38,7 @@ public class KotlinJavaScriptDeserializerForDecompiler( val stringsFileName = KotlinJavascriptSerializedResourcePaths.getStringTableFilePath(directoryPackageFqName) val stringsFile = moduleDirectory.findFileByRelativePath(stringsFileName) assert(stringsFile != null) { "strings file not found: $stringsFileName" } - NameResolver.read(ByteArrayInputStream(stringsFile!!.contentsToByteArray(false))) + NameResolverImpl.read(ByteArrayInputStream(stringsFile!!.contentsToByteArray(false))) } private val metaFileFinder = DirectoryBasedKotlinJavaScriptMetaFileFinder(packageDirectory, directoryPackageFqName, nameResolver)