From b558fd4181dab0a5bee615f66882c387c4dd9d2e Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Thu, 23 Apr 2015 01:19:31 +0300 Subject: [PATCH] add KotlinJavaScriptDecompiledTextConsistencyTest --- idea/idea.iml | 1 + .../DecompiledTextConsistencyTest.kt | 62 +++++---------- ...JavaScriptDecompiledTextConsistencyTest.kt | 73 ++++++++++++++++++ .../textBuilder/TextConsistencyBaseTest.kt | 75 +++++++++++++++++++ 4 files changed, 167 insertions(+), 44 deletions(-) create mode 100644 idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDecompiledTextConsistencyTest.kt create mode 100644 idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/TextConsistencyBaseTest.kt diff --git a/idea/idea.iml b/idea/idea.iml index 9e216669076..833a1fa11d8 100644 --- a/idea/idea.iml +++ b/idea/idea.iml @@ -48,5 +48,6 @@ + \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextConsistencyTest.kt b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextConsistencyTest.kt index 9b1dd593f83..f8667e3ef5f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextConsistencyTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextConsistencyTest.kt @@ -16,63 +16,37 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder -import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.JetWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder -import org.jetbrains.kotlin.load.kotlin.PackageClassUtils -import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.BindingTraceContext -import org.jetbrains.kotlin.resolve.MemberComparator -import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM -import org.junit.Assert +import kotlin.properties.Delegates -public class DecompiledTextConsistencyTest : JetLightCodeInsightFixtureTestCase() { +public class DecompiledTextConsistencyTest : TextConsistencyBaseTest() { - private val STANDARD_LIBRARY_FQNAME = FqName("kotlin") + override val packages: List = listOf(FqName("kotlin")) - public fun testConsistencyWithJavaDescriptorResolver() { - val project = getProject() - val virtualFileFinder = JvmVirtualFileFinder.SERVICE.getInstance(getProject()) - val kotlinPackageFile = virtualFileFinder.findVirtualFileWithHeader(PackageClassUtils.getPackageClassId(STANDARD_LIBRARY_FQNAME))!! - val projectBasedText = buildDecompiledText(kotlinPackageFile, ProjectBasedResolverForDecompiler(project)).text - val deserializedText = buildDecompiledText(kotlinPackageFile).text - Assert.assertEquals(projectBasedText, deserializedText) - // sanity checks - Assert.assertTrue(projectBasedText.contains("linkedListOf")) - Assert.assertFalse(projectBasedText.contains("ERROR")) + override val topLevelMembers: Map = mapOf("kotlin" to "linkedListOf") + + override val virtualFileFinder: VirtualFileFinder by Delegates.lazy() { + JvmVirtualFileFinder.SERVICE.getInstance(getProject()) } + override fun getDecompiledText(packageFile: VirtualFile, resolver: ResolverForDecompiler?): String = + (resolver?.let { buildDecompiledText(packageFile, it) } ?: buildDecompiledText(packageFile)).text + + override fun getModuleDescriptor(): ModuleDescriptor = + TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegrationWithCustomContext( + TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(getProject()), + listOf(), BindingTraceContext(), null, null + ).moduleDescriptor + override fun getProjectDescriptor() = object : JetWithJdkAndRuntimeLightProjectDescriptor() { override fun getSdk() = PluginTestCaseBase.fullJdk() } } - -class ProjectBasedResolverForDecompiler(project: Project) : ResolverForDecompiler { - val module: ModuleDescriptor = run { - TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegrationWithCustomContext( - TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(project), - listOf(), BindingTraceContext(), null, null - ).moduleDescriptor - } - - override fun resolveTopLevelClass(classId: ClassId): ClassDescriptor? { - return module.resolveTopLevelClass(classId.asSingleFqName()) - } - - override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection { - val packageView = module.getPackage(packageFqName) ?: return listOf() - return packageView.getMemberScope().getAllDescriptors() filter { - it is CallableMemberDescriptor && it.module != KotlinBuiltIns.getInstance().getBuiltInsModule() - } sortBy MemberComparator.INSTANCE - } -} diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDecompiledTextConsistencyTest.kt b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDecompiledTextConsistencyTest.kt new file mode 100644 index 00000000000..f9d3159398a --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDecompiledTextConsistencyTest.kt @@ -0,0 +1,73 @@ +/* + * Copyright 2010-2015 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.textBuilder + +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.js.KotlinJavaScriptLibraryManager +import org.jetbrains.kotlin.idea.test.KotlinStdJSProjectDescriptor +import org.jetbrains.kotlin.idea.vfilefinder.JsVirtualFileFinder +import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil +import org.jetbrains.kotlin.storage.LockBasedStorageManager +import org.jetbrains.kotlin.test.JetTestUtils +import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils +import org.jetbrains.kotlin.utils.PathUtil +import org.jetbrains.kotlin.utils.sure +import kotlin.properties.Delegates + +public class KotlinJavaScriptDecompiledTextConsistencyTest : TextConsistencyBaseTest() { + + override val packages: List = listOf( + "java.util", "jquery", "jquery.ui", "kotlin", "kotlin.browser", "kotlin.dom", "kotlin.js" + ).map { FqName(it) } + + override val topLevelMembers: Map = mapOf("kotlin" to "intArrayOf") + + override val virtualFileFinder: VirtualFileFinder by Delegates.lazy() { + JsVirtualFileFinder.SERVICE.getInstance(getProject()) + } + + override fun setUp() { + super.setUp() + KotlinJavaScriptLibraryManager.getInstance(getProject()).syncUpdateProjectLibrary() + } + + override fun getDecompiledText(packageFile: VirtualFile, resolver: ResolverForDecompiler?): String = + (resolver?.let { buildDecompiledTextFromJsMetadata(packageFile, it) } ?: buildDecompiledTextFromJsMetadata(packageFile)).text + + override fun getModuleDescriptor(): ModuleDescriptor { + val stdlibJar = PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath().getAbsolutePath() + val module = JetTestUtils.createEmptyModule("") + val metadata = KotlinJavascriptMetadataUtils.loadMetadata(stdlibJar) + assert(metadata.size() == 1) + + val provider = KotlinJavascriptSerializationUtil.createPackageFragmentProvider(module, metadata[0].body, LockBasedStorageManager()) + .sure { "No package fragment provider was created" } + + module.initialize(provider) + module.addDependencyOnModule(module) + module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()) + module.seal() + + return module + } + + override fun getProjectDescriptor() = KotlinStdJSProjectDescriptor.instance +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/TextConsistencyBaseTest.kt b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/TextConsistencyBaseTest.kt new file mode 100644 index 00000000000..2a4dcb3df59 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/TextConsistencyBaseTest.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2010-2015 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.textBuilder + +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.test.JetLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.load.kotlin.PackageClassUtils +import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.MemberComparator +import org.jetbrains.kotlin.resolve.descriptorUtil.module +import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass +import org.junit.Assert + +public abstract class TextConsistencyBaseTest : JetLightCodeInsightFixtureTestCase() { + + protected abstract val packages: List + + protected abstract val topLevelMembers: Map + + protected abstract val virtualFileFinder: VirtualFileFinder + + protected abstract fun getDecompiledText(packageFile: VirtualFile, resolver: ResolverForDecompiler? = null): String + + protected abstract fun getModuleDescriptor(): ModuleDescriptor + + public fun testConsistency() { + packages.forEach { doTest(it) } + } + + private fun doTest(packageFqName: FqName) { + val packageFile = virtualFileFinder.findVirtualFileWithHeader(PackageClassUtils.getPackageClassId(packageFqName))!! + val projectBasedText = getDecompiledText(packageFile, ResolverForDecompilerImpl(getModuleDescriptor())) + val deserializedText = getDecompiledText(packageFile) + Assert.assertEquals(projectBasedText, deserializedText) + // sanity checks + topLevelMembers[packageFqName.asString()]?.let { + Assert.assertTrue(projectBasedText.contains(it)) + } + Assert.assertFalse(projectBasedText.contains("ERROR")) + } +} + +private class ResolverForDecompilerImpl(val module: ModuleDescriptor) : ResolverForDecompiler { + override fun resolveTopLevelClass(classId: ClassId): ClassDescriptor? { + return module.resolveTopLevelClass(classId.asSingleFqName()) + } + + override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection { + val packageView = module.getPackage(packageFqName) ?: return listOf() + return packageView.getMemberScope().getAllDescriptors() filter { + it is CallableMemberDescriptor && it.module != KotlinBuiltIns.getInstance().getBuiltInsModule() + } sortBy MemberComparator.INSTANCE + } +}