diff --git a/build.xml b/build.xml index 9a555602e49..44f24010bef 100644 --- a/build.xml +++ b/build.xml @@ -354,6 +354,7 @@ + diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsLoader.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsLoader.kt new file mode 100644 index 00000000000..e899ac7c0d1 --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsLoader.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2017 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.builtins + +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider +import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory +import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter +import org.jetbrains.kotlin.storage.StorageManager +import java.util.* + +interface BuiltInsLoader { + fun createPackageFragmentProvider( + storageManager: StorageManager, + builtInsModule: ModuleDescriptor, + classDescriptorFactories: Iterable, + platformDependentDeclarationFilter: PlatformDependentDeclarationFilter, + additionalClassPartsProvider: AdditionalClassPartsProvider + ): PackageFragmentProvider + + companion object { + val Instance: BuiltInsLoader = + ServiceLoader.load(BuiltInsLoader::class.java, BuiltInsLoader::class.java.classLoader).first() + } +} diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 8fca54a528a..0b88ccbaa66 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -45,7 +45,6 @@ import org.jetbrains.kotlin.storage.StorageManager; import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.checker.KotlinTypeChecker; -import java.io.InputStream; import java.util.*; import static kotlin.collections.SetsKt.setOf; @@ -135,21 +134,10 @@ public abstract class KotlinBuiltIns { protected void createBuiltInsModule() { builtInsModule = new ModuleDescriptorImpl(BUILTINS_MODULE_NAME, storageManager, this, null); - PackageFragmentProvider packageFragmentProvider = BuiltInsPackageFragmentProviderKt.createBuiltInPackageFragmentProvider( - storageManager, builtInsModule, BUILT_INS_PACKAGE_FQ_NAMES, - getClassDescriptorFactories(), - getPlatformDependentDeclarationFilter(), - getAdditionalClassPartsProvider(), - new Function1() { - @Override - public InputStream invoke(String path) { - ClassLoader classLoader = KotlinBuiltIns.class.getClassLoader(); - return classLoader != null ? classLoader.getResourceAsStream(path) : ClassLoader.getSystemResourceAsStream(path); - } - } - ); - - builtInsModule.initialize(packageFragmentProvider); + builtInsModule.initialize(BuiltInsLoader.Companion.getInstance().createPackageFragmentProvider( + storageManager, builtInsModule, + getClassDescriptorFactories(), getPlatformDependentDeclarationFilter(), getAdditionalClassPartsProvider() + )); builtInsModule.setDependencies(builtInsModule); } diff --git a/core/deserialization/src/META-INF/services/org.jetbrains.kotlin.builtins.BuiltInsLoader b/core/deserialization/src/META-INF/services/org.jetbrains.kotlin.builtins.BuiltInsLoader new file mode 100644 index 00000000000..718d714da84 --- /dev/null +++ b/core/deserialization/src/META-INF/services/org.jetbrains.kotlin.builtins.BuiltInsLoader @@ -0,0 +1 @@ +org.jetbrains.kotlin.builtins.BuiltInsLoaderImpl diff --git a/core/deserialization/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/builtins/BuiltInsLoaderImpl.kt similarity index 77% rename from core/deserialization/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt rename to core/deserialization/src/org/jetbrains/kotlin/builtins/BuiltInsLoaderImpl.kt index 3813e4245bf..1a717c218bf 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/builtins/BuiltInsLoaderImpl.kt @@ -29,7 +29,28 @@ import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.storage.StorageManager import java.io.InputStream -class BuiltInsLoaderImpl { +class BuiltInsLoaderImpl : BuiltInsLoader { + private val classLoader = this::class.java.classLoader + + override fun createPackageFragmentProvider( + storageManager: StorageManager, + builtInsModule: ModuleDescriptor, + classDescriptorFactories: Iterable, + platformDependentDeclarationFilter: PlatformDependentDeclarationFilter, + additionalClassPartsProvider: AdditionalClassPartsProvider + ): PackageFragmentProvider { + return createBuiltInPackageFragmentProvider( + storageManager, + builtInsModule, + KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAMES, + classDescriptorFactories, + platformDependentDeclarationFilter, + additionalClassPartsProvider + ) { path -> + classLoader?.getResourceAsStream(path) ?: ClassLoader.getSystemResourceAsStream(path) + } + } + fun createBuiltInPackageFragmentProvider( storageManager: StorageManager, module: ModuleDescriptor, diff --git a/core/reflection.jvm/reflection.pro b/core/reflection.jvm/reflection.pro index 9832191bd0e..d2c319add8b 100644 --- a/core/reflection.jvm/reflection.pro +++ b/core/reflection.jvm/reflection.pro @@ -14,6 +14,7 @@ -keep class kotlin.reflect.jvm.internal.ReflectionFactoryImpl { public protected *; } -keep class * implements kotlin.reflect.jvm.internal.impl.resolve.ExternalOverridabilityCondition { public protected *; } +-keep class * implements kotlin.reflect.jvm.internal.impl.builtins.BuiltInsLoader { public protected *; } -keepclassmembers enum * { public static **[] values(); diff --git a/libraries/tools/kotlin-reflect/build.gradle b/libraries/tools/kotlin-reflect/build.gradle index d4d5b0d1598..2bfde74fb00 100644 --- a/libraries/tools/kotlin-reflect/build.gradle +++ b/libraries/tools/kotlin-reflect/build.gradle @@ -91,6 +91,9 @@ task reflectShadowJar(type: ShadowJar) { from ("${core}/descriptor.loader.java/src") { include 'META-INF/services/**' } + from ("${core}/deserialization/src") { + include 'META-INF/services/**' + } configurations = [project.configurations.shadows] relocate 'org.jetbrains.kotlin', 'kotlin.reflect.jvm.internal.impl'