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
+ }
+}