Introduce PackageFragmentProviderImpl

It works with a read-only collection of package fragments, passed to it in the
constructor
This commit is contained in:
Alexander Udalov
2014-11-18 17:28:13 +03:00
parent fd2ddff750
commit 44b8f3045f
2 changed files with 42 additions and 30 deletions
@@ -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<PackageFragmentDescriptor>
) : PackageFragmentProvider {
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> =
packageFragments.filter { it.fqName == fqName }
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> =
packageFragments.stream()
.map { it.fqName }
.filter { !it.isRoot() && it.parent() == fqName }
.toList()
}
@@ -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.AnnotationAndConstantLoader
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor 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.PackageFragmentProvider
import org.jetbrains.jet.lang.descriptors.PackageFragmentProviderImpl
import org.jetbrains.jet.lang.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.jet.lang.descriptors.impl.PackageFragmentDescriptorImpl
import org.jetbrains.jet.lang.resolve.name.ClassId 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.lang.resolve.name.Name
import org.jetbrains.jet.storage.StorageManager import org.jetbrains.jet.storage.StorageManager
import java.io.DataInputStream import java.io.DataInputStream
import java.io.IOException
import java.io.InputStream import java.io.InputStream
import java.util.ArrayList import java.util.ArrayList
import org.jetbrains.jet.descriptors.serialization.context.DeserializationComponents 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))) 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 = private val members: DeserializedPackageMemberScope =
DeserializedPackageMemberScope( DeserializedPackageMemberScope(
@@ -53,47 +51,28 @@ class BuiltinsPackageFragment(storageManager: StorageManager, module: ModuleDesc
) )
private fun loadPackage(): ProtoBuf.Package { private fun loadPackage(): ProtoBuf.Package {
val packageFilePath = BuiltInsSerializationUtil.getPackageFilePath(fqName) val stream = getStream(BuiltInsSerializationUtil.getPackageFilePath(fqName))
val stream = getStream(packageFilePath) return ProtoBuf.Package.parseFrom(stream)
try {
return ProtoBuf.Package.parseFrom(stream)
}
catch (e: IOException) {
throw IllegalStateException(e)
}
} }
private fun readClassNames(): List<Name> { private fun readClassNames(): List<Name> {
val `in` = getStream(BuiltInsSerializationUtil.getClassNamesFilePath(fqName)) val stream = getStream(BuiltInsSerializationUtil.getClassNamesFilePath(fqName))
val data = DataInputStream(`in`) return DataInputStream(stream).use { data ->
try {
val size = data.readInt() val size = data.readInt()
val result = ArrayList<Name>(size) val result = ArrayList<Name>(size)
for (i in 0..size - 1) { size.times {
result.add(nameResolver.getName(data.readInt())) result.add(nameResolver.getName(data.readInt()))
} }
return result result
}
finally {
data.close()
} }
} }
override fun getMemberScope() = members 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<KotlinBuiltIns>().getClassLoader().getResourceAsStream(path) private fun getStreamNullable(path: String): InputStream? = javaClass<KotlinBuiltIns>().getClassLoader().getResourceAsStream(path)
private inner class BuiltinsPackageFragmentProvider : PackageFragmentProvider {
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor>
= if (KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME == fqName) listOf(this@BuiltinsPackageFragment) else listOf()
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName>
= if (fqName.isRoot()) setOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) else 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) ?: return null val metadataPath = BuiltInsSerializationUtil.getClassMetadataPath(classId) ?: return null