diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/PackageFragmentProviderImpl.kt b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/PackageFragmentProviderImpl.kt new file mode 100644 index 00000000000..2dd955ae9a1 --- /dev/null +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/PackageFragmentProviderImpl.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2014 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.jet.lang.descriptors + +import org.jetbrains.jet.lang.resolve.name.FqName +import org.jetbrains.jet.lang.resolve.name.Name + +public class PackageFragmentProviderImpl( + private val packageFragments: Collection +) : PackageFragmentProvider { + override fun getPackageFragments(fqName: FqName): List = + packageFragments.filter { it.fqName == fqName } + + override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection = + packageFragments.stream() + .map { it.fqName } + .filter { !it.isRoot() && it.parent() == fqName } + .toList() +} diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.kt b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.kt index 74f9ce827b9..b7cc9f2c862 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.kt @@ -20,15 +20,13 @@ import org.jetbrains.jet.descriptors.serialization.* import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationAndConstantLoader import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.jet.lang.descriptors.ModuleDescriptor -import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider +import org.jetbrains.jet.lang.descriptors.PackageFragmentProviderImpl import org.jetbrains.jet.lang.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.jet.lang.resolve.name.ClassId -import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.storage.StorageManager import java.io.DataInputStream -import java.io.IOException import java.io.InputStream import java.util.ArrayList import org.jetbrains.jet.descriptors.serialization.context.DeserializationComponents @@ -38,7 +36,7 @@ class BuiltinsPackageFragment(storageManager: StorageManager, module: ModuleDesc private val nameResolver = NameSerializationUtil.deserializeNameResolver(getStream(BuiltInsSerializationUtil.getNameTableFilePath(fqName))) - public val provider: PackageFragmentProvider = BuiltinsPackageFragmentProvider() + public val provider: PackageFragmentProvider = PackageFragmentProviderImpl(listOf(this)) private val members: DeserializedPackageMemberScope = DeserializedPackageMemberScope( @@ -53,47 +51,28 @@ class BuiltinsPackageFragment(storageManager: StorageManager, module: ModuleDesc ) private fun loadPackage(): ProtoBuf.Package { - val packageFilePath = BuiltInsSerializationUtil.getPackageFilePath(fqName) - val stream = getStream(packageFilePath) - try { - return ProtoBuf.Package.parseFrom(stream) - } - catch (e: IOException) { - throw IllegalStateException(e) - } - + val stream = getStream(BuiltInsSerializationUtil.getPackageFilePath(fqName)) + return ProtoBuf.Package.parseFrom(stream) } private fun readClassNames(): List { - val `in` = getStream(BuiltInsSerializationUtil.getClassNamesFilePath(fqName)) - val data = DataInputStream(`in`) - try { + val stream = getStream(BuiltInsSerializationUtil.getClassNamesFilePath(fqName)) + return DataInputStream(stream).use { data -> val size = data.readInt() val result = ArrayList(size) - for (i in 0..size - 1) { + size.times { result.add(nameResolver.getName(data.readInt())) } - return result - } - finally { - data.close() + result } } override fun getMemberScope() = members - private fun getStream(path: String) = getStreamNullable(path) ?: throw IllegalStateException("Resource not found in classpath: " + path) + private fun getStream(path: String) = getStreamNullable(path) ?: throw IllegalStateException("Resource not found in classpath: $path") private fun getStreamNullable(path: String): InputStream? = javaClass().getClassLoader().getResourceAsStream(path) - private inner class BuiltinsPackageFragmentProvider : PackageFragmentProvider { - override fun getPackageFragments(fqName: FqName): List - = if (KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME == fqName) listOf(this@BuiltinsPackageFragment) else listOf() - - override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection - = if (fqName.isRoot()) setOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) else listOf() - } - private inner class BuiltInsClassDataFinder : ClassDataFinder { override fun findClassData(classId: ClassId): ClassData? { val metadataPath = BuiltInsSerializationUtil.getClassMetadataPath(classId) ?: return null