Introduce PackageFragmentProviderImpl
It works with a read-only collection of package fragments, passed to it in the constructor
This commit is contained in:
+33
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user