Combine decompiler deserializers for built-ins and JS
This commit is contained in:
+7
-1
@@ -27,15 +27,18 @@ import org.jetbrains.kotlin.builtins.BuiltInsBinaryVersion
|
|||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.idea.decompiler.KotlinDecompiledFileViewProvider
|
import org.jetbrains.kotlin.idea.decompiler.KotlinDecompiledFileViewProvider
|
||||||
import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile
|
import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile
|
||||||
|
import org.jetbrains.kotlin.idea.decompiler.common.KotlinMetadataDeserializerForDecompiler
|
||||||
import org.jetbrains.kotlin.idea.decompiler.common.createIncompatibleAbiVersionDecompiledText
|
import org.jetbrains.kotlin.idea.decompiler.common.createIncompatibleAbiVersionDecompiledText
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText
|
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText
|
import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.defaultDecompilerRendererOptions
|
import org.jetbrains.kotlin.idea.decompiler.textBuilder.defaultDecompilerRendererOptions
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
|
import org.jetbrains.kotlin.resolve.TargetPlatform
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf
|
import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer
|
import org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeDeserializer
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment
|
import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
|
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
@@ -80,7 +83,10 @@ fun buildDecompiledTextForBuiltIns(builtInFile: VirtualFile): DecompiledText {
|
|||||||
}
|
}
|
||||||
is BuiltInDefinitionFile.Compatible -> {
|
is BuiltInDefinitionFile.Compatible -> {
|
||||||
val packageFqName = file.packageFqName
|
val packageFqName = file.packageFqName
|
||||||
val resolver = KotlinBuiltInDeserializerForDecompiler(packageFqName, file.proto, file.nameResolver)
|
val resolver = KotlinMetadataDeserializerForDecompiler(
|
||||||
|
packageFqName, file.proto, file.nameResolver,
|
||||||
|
TargetPlatform.Default, BuiltInSerializerProtocol, FlexibleTypeDeserializer.ThrowException
|
||||||
|
)
|
||||||
val declarations = arrayListOf<DeclarationDescriptor>()
|
val declarations = arrayListOf<DeclarationDescriptor>()
|
||||||
declarations.addAll(resolver.resolveDeclarationsInFacade(packageFqName))
|
declarations.addAll(resolver.resolveDeclarationsInFacade(packageFqName))
|
||||||
for (classProto in file.classesToDecompile) {
|
for (classProto in file.classesToDecompile) {
|
||||||
|
|||||||
+11
-10
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2016 JetBrains s.r.o.
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -14,11 +14,9 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.decompiler.builtIns
|
package org.jetbrains.kotlin.idea.decompiler.common
|
||||||
|
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder
|
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
@@ -29,15 +27,18 @@ import org.jetbrains.kotlin.incremental.components.LookupTracker
|
|||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.resolve.TargetPlatform
|
import org.jetbrains.kotlin.resolve.TargetPlatform
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
|
import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
||||||
|
|
||||||
class KotlinBuiltInDeserializerForDecompiler(
|
class KotlinMetadataDeserializerForDecompiler(
|
||||||
packageFqName: FqName,
|
packageFqName: FqName,
|
||||||
private val proto: ProtoBuf.PackageFragment,
|
private val proto: ProtoBuf.PackageFragment,
|
||||||
private val nameResolver: NameResolver
|
private val nameResolver: NameResolver,
|
||||||
|
override val targetPlatform: TargetPlatform,
|
||||||
|
serializerProtocol: SerializerExtensionProtocol,
|
||||||
|
flexibleTypeDeserializer: FlexibleTypeDeserializer
|
||||||
) : DeserializerForDecompilerBase(packageFqName) {
|
) : DeserializerForDecompilerBase(packageFqName) {
|
||||||
override val targetPlatform: TargetPlatform get() = TargetPlatform.Default
|
|
||||||
override val builtIns: KotlinBuiltIns get() = DefaultBuiltIns.Instance
|
override val builtIns: KotlinBuiltIns get() = DefaultBuiltIns.Instance
|
||||||
|
|
||||||
override val deserializationComponents: DeserializationComponents
|
override val deserializationComponents: DeserializationComponents
|
||||||
@@ -47,9 +48,9 @@ class KotlinBuiltInDeserializerForDecompiler(
|
|||||||
|
|
||||||
deserializationComponents = DeserializationComponents(
|
deserializationComponents = DeserializationComponents(
|
||||||
storageManager, moduleDescriptor, DeserializationConfiguration.Default, ProtoBasedClassDataFinder(proto, nameResolver),
|
storageManager, moduleDescriptor, DeserializationConfiguration.Default, ProtoBasedClassDataFinder(proto, nameResolver),
|
||||||
AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, BuiltInSerializerProtocol), packageFragmentProvider,
|
AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, serializerProtocol), packageFragmentProvider,
|
||||||
ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG),
|
ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG),
|
||||||
LookupTracker.DO_NOTHING, FlexibleTypeDeserializer.ThrowException, emptyList(), notFoundClasses
|
LookupTracker.DO_NOTHING, flexibleTypeDeserializer, emptyList(), notFoundClasses
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,6 +68,6 @@ class KotlinBuiltInDeserializerForDecompiler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val LOG = Logger.getInstance(KotlinBuiltInDeserializerForDecompiler::class.java)
|
private val LOG = Logger.getInstance(KotlinMetadataDeserializerForDecompiler::class.java)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
-75
@@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2016 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.idea.decompiler.js
|
|
||||||
|
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder
|
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase
|
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter
|
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.ResolveEverythingToKotlinAnyLocalClassifierResolver
|
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
|
||||||
import org.jetbrains.kotlin.js.resolve.JsPlatform
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.resolve.TargetPlatform
|
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
|
||||||
import org.jetbrains.kotlin.serialization.js.DynamicTypeDeserializer
|
|
||||||
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
|
|
||||||
|
|
||||||
// TODO: deduplicate with KotlinBuiltInDeserializerForDecompiler
|
|
||||||
class KotlinJavaScriptDeserializerForDecompiler(
|
|
||||||
packageFqName: FqName,
|
|
||||||
private val proto: ProtoBuf.PackageFragment,
|
|
||||||
private val nameResolver: NameResolver
|
|
||||||
) : DeserializerForDecompilerBase(packageFqName) {
|
|
||||||
override val targetPlatform: TargetPlatform get() = JsPlatform
|
|
||||||
override val builtIns: KotlinBuiltIns get() = DefaultBuiltIns.Instance
|
|
||||||
|
|
||||||
override val deserializationComponents: DeserializationComponents
|
|
||||||
|
|
||||||
init {
|
|
||||||
val notFoundClasses = NotFoundClasses(storageManager, moduleDescriptor)
|
|
||||||
|
|
||||||
deserializationComponents = DeserializationComponents(
|
|
||||||
storageManager, moduleDescriptor, DeserializationConfiguration.Default, ProtoBasedClassDataFinder(proto, nameResolver),
|
|
||||||
AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, JsSerializerProtocol), packageFragmentProvider,
|
|
||||||
ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG),
|
|
||||||
LookupTracker.DO_NOTHING, DynamicTypeDeserializer, emptyList(), notFoundClasses
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun resolveDeclarationsInFacade(facadeFqName: FqName): List<DeclarationDescriptor> {
|
|
||||||
assert(facadeFqName == directoryPackageFqName) {
|
|
||||||
"Was called for $facadeFqName; only members of $directoryPackageFqName package are expected."
|
|
||||||
}
|
|
||||||
|
|
||||||
val membersScope = DeserializedPackageMemberScope(
|
|
||||||
createDummyPackageFragment(facadeFqName), proto.`package`, nameResolver, containerSource = null,
|
|
||||||
components = deserializationComponents
|
|
||||||
) { emptyList() }
|
|
||||||
|
|
||||||
return membersScope.getContributedDescriptors().toList()
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private val LOG = Logger.getInstance(KotlinJavaScriptDeserializerForDecompiler::class.java)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+10
-1
@@ -20,17 +20,23 @@ import com.intellij.openapi.vfs.VirtualFile
|
|||||||
import com.intellij.psi.FileViewProvider
|
import com.intellij.psi.FileViewProvider
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.psi.compiled.ClassFileDecompilers
|
import com.intellij.psi.compiled.ClassFileDecompilers
|
||||||
|
import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.idea.decompiler.KotlinDecompiledFileViewProvider
|
import org.jetbrains.kotlin.idea.decompiler.KotlinDecompiledFileViewProvider
|
||||||
import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile
|
import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile
|
||||||
|
import org.jetbrains.kotlin.idea.decompiler.common.KotlinMetadataDeserializerForDecompiler
|
||||||
import org.jetbrains.kotlin.idea.decompiler.common.createIncompatibleAbiVersionDecompiledText
|
import org.jetbrains.kotlin.idea.decompiler.common.createIncompatibleAbiVersionDecompiledText
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText
|
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText
|
import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.defaultDecompilerRendererOptions
|
import org.jetbrains.kotlin.idea.decompiler.textBuilder.defaultDecompilerRendererOptions
|
||||||
|
import org.jetbrains.kotlin.js.resolve.JsPlatform
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
|
import org.jetbrains.kotlin.resolve.TargetPlatform
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeDeserializer
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
|
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
|
||||||
|
import org.jetbrains.kotlin.serialization.js.DynamicTypeDeserializer
|
||||||
import org.jetbrains.kotlin.serialization.js.JsProtoBuf
|
import org.jetbrains.kotlin.serialization.js.JsProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
|
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
|
||||||
import org.jetbrains.kotlin.utils.JsMetadataVersion
|
import org.jetbrains.kotlin.utils.JsMetadataVersion
|
||||||
@@ -73,7 +79,10 @@ fun buildDecompiledTextFromJsMetadata(kjsmFile: VirtualFile): DecompiledText {
|
|||||||
}
|
}
|
||||||
is KjsmFile.Compatible -> {
|
is KjsmFile.Compatible -> {
|
||||||
val packageFqName = file.packageFqName
|
val packageFqName = file.packageFqName
|
||||||
val resolver = KotlinJavaScriptDeserializerForDecompiler(packageFqName, file.proto, file.nameResolver)
|
val resolver = KotlinMetadataDeserializerForDecompiler(
|
||||||
|
packageFqName, file.proto, file.nameResolver,
|
||||||
|
JsPlatform, JsSerializerProtocol, DynamicTypeDeserializer
|
||||||
|
)
|
||||||
val declarations = arrayListOf<DeclarationDescriptor>()
|
val declarations = arrayListOf<DeclarationDescriptor>()
|
||||||
declarations.addAll(resolver.resolveDeclarationsInFacade(packageFqName))
|
declarations.addAll(resolver.resolveDeclarationsInFacade(packageFqName))
|
||||||
for (klass in file.classesToDecompile) {
|
for (klass in file.classesToDecompile) {
|
||||||
|
|||||||
Reference in New Issue
Block a user