Simplify code in JS serialization related to module descriptors

Do not use `JsModuleDescriptor<...>` where only its `data` is needed
This commit is contained in:
Alexander Udalov
2018-07-11 19:32:19 +02:00
parent 77405b2cca
commit ae6627fe94
9 changed files with 79 additions and 134 deletions
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
import org.jetbrains.kotlin.serialization.js.JsModuleDescriptor
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
import org.jetbrains.kotlin.serialization.js.ModuleKind
import org.jetbrains.kotlin.serialization.js.PackagesWithHeaderMetadata
@@ -56,8 +55,8 @@ object TopDownAnalyzerFacadeForJS {
files: Collection<KtFile>,
project: Project,
configuration: CompilerConfiguration,
moduleDescriptors: List<JsModuleDescriptor<ModuleDescriptorImpl>>,
friendModuleDescriptors: List<JsModuleDescriptor<ModuleDescriptorImpl>>
moduleDescriptors: List<ModuleDescriptorImpl>,
friendModuleDescriptors: List<ModuleDescriptorImpl>
): JsAnalysisResult {
val moduleName = configuration[CommonConfigurationKeys.MODULE_NAME]!!
@@ -65,9 +64,9 @@ object TopDownAnalyzerFacadeForJS {
context.module.setDependencies(
listOf(context.module) +
moduleDescriptors.map { it.data } +
moduleDescriptors +
listOf(JsPlatform.builtIns.builtInsModule),
friendModuleDescriptors.map { it.data }.toSet()
friendModuleDescriptors.toSet()
)
val moduleKind = configuration.get(JSConfigurationKeys.MODULE_KIND, ModuleKind.PLAIN)
@@ -33,10 +33,7 @@ import org.jetbrains.kotlin.incremental.components.LookupTracker;
import org.jetbrains.kotlin.js.resolve.JsPlatform;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration;
import org.jetbrains.kotlin.serialization.js.JsModuleDescriptor;
import org.jetbrains.kotlin.serialization.js.KotlinJavaScriptLibraryParts;
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil;
import org.jetbrains.kotlin.serialization.js.ModuleKind;
import org.jetbrains.kotlin.serialization.js.*;
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
import org.jetbrains.kotlin.utils.JsMetadataVersion;
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadata;
@@ -64,11 +61,8 @@ public class JsConfig {
private final List<KotlinJavascriptMetadata> metadata = new SmartList<>();
private final List<KotlinJavascriptMetadata> friends = new SmartList<>();
@Nullable
private List<JsModuleDescriptor<ModuleDescriptorImpl>> moduleDescriptors = null;
@Nullable
private List<JsModuleDescriptor<ModuleDescriptorImpl>> friendModuleDescriptors = null;
private List<ModuleDescriptorImpl> moduleDescriptors;
private List<ModuleDescriptorImpl> friendModuleDescriptors;
private boolean initialized = false;
@@ -237,19 +231,16 @@ public class JsConfig {
}
@NotNull
public List<JsModuleDescriptor<ModuleDescriptorImpl>> getModuleDescriptors() {
public List<ModuleDescriptorImpl> getModuleDescriptors() {
init();
return moduleDescriptors;
}
@NotNull
private List<JsModuleDescriptor<ModuleDescriptorImpl>> createModuleDescriptors() {
List<JsModuleDescriptor<ModuleDescriptorImpl>> moduleDescriptors = new SmartList<>();
List<ModuleDescriptorImpl> kotlinModuleDescriptors = new ArrayList<>();
private List<ModuleDescriptorImpl> createModuleDescriptors() {
List<ModuleDescriptorImpl> moduleDescriptors = new SmartList<>();
for (KotlinJavascriptMetadata metadataEntry : metadata) {
JsModuleDescriptor<ModuleDescriptorImpl> descriptor = createModuleDescriptor(metadataEntry);
moduleDescriptors.add(descriptor);
kotlinModuleDescriptors.add(descriptor.getData());
moduleDescriptors.add(createModuleDescriptor(metadataEntry));
}
if (metadataCache != null) {
@@ -259,50 +250,30 @@ public class JsConfig {
Name.special("<" + cached.getName() + ">"), storageManager, JsPlatform.INSTANCE.getBuiltIns()
);
JsModuleDescriptor<PackageFragmentProvider> rawDescriptor = KotlinJavascriptSerializationUtil.readModuleFromProto(
cached, storageManager, moduleDescriptor,
PackageFragmentProvider provider = KotlinJavascriptPackageFragmentProviderKt.createKotlinJavascriptPackageFragmentProvider(
storageManager, moduleDescriptor, cached.getData().getHeader(), cached.getData().getBody(),
new CompilerDeserializationConfiguration(languageVersionSettings),
LookupTracker.DO_NOTHING.INSTANCE
);
PackageFragmentProvider provider = rawDescriptor.getData();
moduleDescriptor.initialize(provider != null ? provider : PackageFragmentProvider.Empty.INSTANCE);
JsModuleDescriptor<ModuleDescriptorImpl> jsModuleDescriptor = cached.copy(moduleDescriptor);
moduleDescriptors.add(jsModuleDescriptor);
kotlinModuleDescriptors.add(jsModuleDescriptor.getData());
moduleDescriptor.initialize(provider);
moduleDescriptors.add(moduleDescriptor);
}
}
for (JsModuleDescriptor<ModuleDescriptorImpl> module : moduleDescriptors) {
// TODO: remove downcast
setDependencies(module.getData(), kotlinModuleDescriptors);
for (ModuleDescriptorImpl module : moduleDescriptors) {
setDependencies(module, moduleDescriptors);
}
moduleDescriptors = Collections.unmodifiableList(moduleDescriptors);
return moduleDescriptors;
return Collections.unmodifiableList(moduleDescriptors);
}
@NotNull
public List<JsModuleDescriptor<ModuleDescriptorImpl>> getFriendModuleDescriptors() {
public List<ModuleDescriptorImpl> getFriendModuleDescriptors() {
init();
return friendModuleDescriptors;
}
@NotNull
private List<JsModuleDescriptor<ModuleDescriptorImpl>> createFriendModuleDescriptors() {
List<JsModuleDescriptor<ModuleDescriptorImpl>> friendModuleDescriptors = new SmartList<>();
for (KotlinJavascriptMetadata metadataEntry : friends) {
JsModuleDescriptor<ModuleDescriptorImpl> descriptor = createModuleDescriptor(metadataEntry);
friendModuleDescriptors.add(descriptor);
}
friendModuleDescriptors = Collections.unmodifiableList(friendModuleDescriptors);
return friendModuleDescriptors;
}
public void init() {
if (!initialized) {
JsConfig.Reporter reporter = new Reporter() {
@@ -320,13 +291,13 @@ public class JsConfig {
}
if (friendModuleDescriptors == null) {
friendModuleDescriptors = createFriendModuleDescriptors();
friendModuleDescriptors = CollectionsKt.map(friends, this::createModuleDescriptor);
}
}
private final IdentityHashMap<KotlinJavascriptMetadata, JsModuleDescriptor<ModuleDescriptorImpl>> factoryMap = new IdentityHashMap<>();
private final IdentityHashMap<KotlinJavascriptMetadata, ModuleDescriptorImpl> factoryMap = new IdentityHashMap<>();
private JsModuleDescriptor<ModuleDescriptorImpl> createModuleDescriptor(KotlinJavascriptMetadata metadata) {
private ModuleDescriptorImpl createModuleDescriptor(KotlinJavascriptMetadata metadata) {
return factoryMap.computeIfAbsent(metadata, m -> {
LanguageVersionSettings languageVersionSettings = CommonConfigurationKeysKt.getLanguageVersionSettings(configuration);
assert m.getVersion().isCompatible() ||
@@ -338,16 +309,15 @@ public class JsConfig {
);
LookupTracker lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER, LookupTracker.DO_NOTHING.INSTANCE);
JsModuleDescriptor<PackageFragmentProvider> rawDescriptor = KotlinJavascriptSerializationUtil.readModule(
m.getBody(), storageManager, moduleDescriptor,
KotlinJavaScriptLibraryParts parts = KotlinJavascriptSerializationUtil.readModuleAsProto(m.getBody());
PackageFragmentProvider provider = KotlinJavascriptPackageFragmentProviderKt.createKotlinJavascriptPackageFragmentProvider(
storageManager, moduleDescriptor, parts.getHeader(), parts.getBody(),
new CompilerDeserializationConfiguration(languageVersionSettings),
lookupTracker
);
PackageFragmentProvider provider = rawDescriptor.getData();
moduleDescriptor.initialize(provider != null ? provider : PackageFragmentProvider.Empty.INSTANCE);
return rawDescriptor.copy(moduleDescriptor);
moduleDescriptor.initialize(provider);
return moduleDescriptor;
});
}