Code improvements after conversion to Kotlin

This commit is contained in:
Valentin Kipyatkov
2014-11-01 12:15:16 +03:00
parent 64e6b7f52d
commit c95448b185
@@ -16,7 +16,6 @@
package org.jetbrains.jet.lang.types.lang package org.jetbrains.jet.lang.types.lang
import kotlin.Function0
import org.jetbrains.jet.descriptors.serialization.* import org.jetbrains.jet.descriptors.serialization.*
import org.jetbrains.jet.descriptors.serialization.context.DeserializationContext import org.jetbrains.jet.descriptors.serialization.context.DeserializationContext
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader
@@ -36,49 +35,26 @@ import java.io.DataInputStream
import java.io.IOException import java.io.IOException
import java.io.InputStream import java.io.InputStream
import java.util.ArrayList import java.util.ArrayList
import java.util.Collections
class BuiltinsPackageFragment(storageManager: StorageManager, module: ModuleDescriptor) class BuiltinsPackageFragment(storageManager: StorageManager, module: ModuleDescriptor)
: PackageFragmentDescriptorImpl(module, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) { : PackageFragmentDescriptorImpl(module, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) {
private val members: DeserializedPackageMemberScope private val nameResolver = NameSerializationUtil.deserializeNameResolver(getStream(BuiltInsSerializationUtil.getNameTableFilePath(fqName)))
private val nameResolver: NameResolver
public val provider: PackageFragmentProvider
{ public val provider: PackageFragmentProvider = BuiltinsPackageFragmentProvider()
nameResolver = NameSerializationUtil.deserializeNameResolver(getStream(BuiltInsSerializationUtil.getNameTableFilePath(fqName)))
provider = BuiltinsPackageFragmentProvider()
val classNames = object : Function0<Collection<Name>> {
override fun invoke(): Collection<Name> {
val `in` = getStream(BuiltInsSerializationUtil.getClassNamesFilePath(fqName))
try {
val data = DataInputStream(`in`)
try {
val size = data.readInt()
val result = ArrayList<Name>(size)
for (i in 0..size - 1) {
result.add(nameResolver.getName(data.readInt()))
}
return result
}
finally {
data.close()
}
}
catch (e: IOException) {
throw IllegalStateException(e)
}
}
}
private val members: DeserializedPackageMemberScope = run {
val builtInsClassDataFinder = BuiltInsClassDataFinder() val builtInsClassDataFinder = BuiltInsClassDataFinder()
val deserializationContext = DeserializationContext(storageManager, module, builtInsClassDataFinder, // TODO: support annotations val deserializationContext = DeserializationContext(storageManager,
AnnotationLoader.UNSUPPORTED, ConstantLoader.UNSUPPORTED, provider, FlexibleTypeCapabilitiesDeserializer.ThrowException, ClassDeserializer(storageManager, builtInsClassDataFinder), nameResolver) module,
members = DeserializedPackageMemberScope(this, loadPackage(), deserializationContext, classNames) builtInsClassDataFinder,
AnnotationLoader.UNSUPPORTED, // TODO: support annotations
ConstantLoader.UNSUPPORTED,
provider,
FlexibleTypeCapabilitiesDeserializer.ThrowException,
ClassDeserializer(storageManager, builtInsClassDataFinder),
nameResolver)
DeserializedPackageMemberScope(this, loadPackage(), deserializationContext, { readClassNames() })
} }
private fun loadPackage(): ProtoBuf.Package { private fun loadPackage(): ProtoBuf.Package {
@@ -93,63 +69,52 @@ class BuiltinsPackageFragment(storageManager: StorageManager, module: ModuleDesc
} }
override fun getMemberScope(): JetScope { private fun readClassNames(): List<Name> {
return members val `in` = getStream(BuiltInsSerializationUtil.getClassNamesFilePath(fqName))
} val data = DataInputStream(`in`)
try {
private fun getStream(path: String): InputStream { val size = data.readInt()
val stream = getStreamNullable(path) val result = ArrayList<Name>(size)
if (stream == null) { for (i in 0..size - 1) {
throw IllegalStateException("Resource not found in classpath: " + path) result.add(nameResolver.getName(data.readInt()))
}
return result
}
finally {
data.close()
} }
return stream
} }
private fun getStreamNullable(path: String): InputStream? { override fun getMemberScope() = members
//noinspection ConstantConditions
return javaClass<KotlinBuiltIns>().getClassLoader().getResourceAsStream(path) private fun getStream(path: String) = getStreamNullable(path) ?: throw IllegalStateException("Resource not found in classpath: " + path)
}
private fun getStreamNullable(path: String): InputStream? = javaClass<KotlinBuiltIns>().getClassLoader().getResourceAsStream(path)
private inner class BuiltinsPackageFragmentProvider : PackageFragmentProvider { private inner class BuiltinsPackageFragmentProvider : PackageFragmentProvider {
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> { override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor>
if (KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME == fqName) { = if (KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME == fqName) listOf(this@BuiltinsPackageFragment) else listOf()
return listOf<PackageFragmentDescriptor>(this@BuiltinsPackageFragment)
}
return listOf()
}
override fun getSubPackagesOf(fqName: FqName): Collection<FqName> { override fun getSubPackagesOf(fqName: FqName): Collection<FqName>
if (fqName.isRoot()) { = if (fqName.isRoot()) setOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) else listOf()
return setOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME)
}
return listOf()
}
} }
private inner class BuiltInsClassDataFinder : ClassDataFinder { private inner class BuiltInsClassDataFinder : ClassDataFinder {
override fun findClassData(classId: ClassId): ClassData? { override fun findClassData(classId: ClassId): ClassData? {
val metadataPath = BuiltInsSerializationUtil.getClassMetadataPath(classId) val metadataPath = BuiltInsSerializationUtil.getClassMetadataPath(classId) ?: return null
if (metadataPath == null) return null val stream = getStreamNullable(metadataPath) ?: return null
val stream = getStreamNullable(metadataPath)
if (stream == null) return null
try { val classProto = ProtoBuf.Class.parseFrom(stream)
val classProto = ProtoBuf.Class.parseFrom(stream)
val expectedShortName = classId.getRelativeClassName().shortName() val expectedShortName = classId.getRelativeClassName().shortName()
val actualShortName = nameResolver.getClassId(classProto.getFqName()).getRelativeClassName().shortName() val actualShortName = nameResolver.getClassId(classProto.getFqName()).getRelativeClassName().shortName()
if (!actualShortName.isSpecial() && actualShortName != expectedShortName) { if (!actualShortName.isSpecial() && actualShortName != expectedShortName) {
// Workaround for case-insensitive file systems, // Workaround for case-insensitive file systems,
// otherwise we'd find "Collection" for "collection" etc // otherwise we'd find "Collection" for "collection" etc
return null return null
}
return ClassData(nameResolver, classProto)
}
catch (e: IOException) {
throw IllegalStateException(e)
} }
return ClassData(nameResolver, classProto)
} }
} }
} }