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'