From 14f3e4c75830f435453f03073ab11555f564b13c Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 20 Sep 2016 16:38:34 +0300 Subject: [PATCH] Cls stubs and decompiled text: Do not render parameter names in decompiled text and do not load ParameterName annotation in stubs Add tests for decompiled text and stubs --- .../stubBuilder/TypeClsStubBuilder.kt | 5 +++- .../textBuilder/buildDecompiledText.kt | 4 ++- ...nctionalTypeWithNamedArguments.expected.kt | 9 ++++++ .../FunctionalTypeWithNamedArguments.kt | 5 ++++ .../decompiler/stubBuilder/Types/Types.kt | 2 ++ .../decompiler/stubBuilder/Types/Types.txt | 30 +++++++++++++++++++ .../KotlinJavaScriptStubConsistencyTest.kt | 3 +- ...mpiledTextFromJsMetadataTestGenerated.java | 6 ++++ .../CommonDecompiledTextTestGenerated.java | 6 ++++ 9 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments.expected.kt create mode 100644 idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments/FunctionalTypeWithNamedArguments.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt index 93722d92d85..9dfdf1a41cf 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/TypeClsStubBuilder.kt @@ -41,6 +41,9 @@ import org.jetbrains.kotlin.serialization.js.DynamicTypeDeserializer import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList import java.util.* +// TODO: see DescriptorRendererOptions.excludedTypeAnnotationClasses for decompiler +private val ANNOTATIONS_NOT_LOADED_FOR_TYPES = (ANNOTATIONS_COPIED_TO_TYPES + KotlinBuiltIns.FQ_NAMES.parameterName).toSet() + class TypeClsStubBuilder(private val c: ClsStubBuilderContext) { fun createTypeReferenceStub(parent: StubElement, type: Type) { @@ -49,7 +52,7 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) { val annotations = c.components.annotationLoader.loadTypeAnnotations(type, c.nameResolver).filterNot { val isTopLevelClass = !it.isNestedClass - isTopLevelClass && it.asSingleFqName() in ANNOTATIONS_COPIED_TO_TYPES + isTopLevelClass && it.asSingleFqName() in ANNOTATIONS_NOT_LOADED_FOR_TYPES } val effectiveParent = diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt index 87ee8db373c..eefb50399eb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/buildDecompiledText.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder import com.intellij.openapi.util.TextRange +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.decompiler.navigation.ByDescriptorIndexer import org.jetbrains.kotlin.name.FqName @@ -38,8 +39,9 @@ fun DescriptorRendererOptions.defaultDecompilerRendererOptions() { classWithPrimaryConstructor = true secondaryConstructorsAsPrimary = false modifiers = DescriptorRendererModifier.ALL - excludedTypeAnnotationClasses = ExcludedTypeAnnotations.annotationsForNullabilityAndMutability + excludedTypeAnnotationClasses = (ExcludedTypeAnnotations.annotationsForNullabilityAndMutability + KotlinBuiltIns.FQ_NAMES.parameterName).toSet() alwaysRenderModifiers = true + parameterNamesInFunctionalTypes = false // to support parameters names in decompiled text we need to load annotation arguments } fun buildDecompiledText( diff --git a/idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments.expected.kt b/idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments.expected.kt new file mode 100644 index 00000000000..2ac0541f205 --- /dev/null +++ b/idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments.expected.kt @@ -0,0 +1,9 @@ +// IntelliJ API Decompiler stub source generated from a class file +// Implementation of methods is not available + +package test + +public final class FunctionalTypeWithNamedArguments public constructor() { + public final fun f(ftype: (kotlin.String, kotlin.Any?) -> kotlin.Any?): kotlin.String { /* compiled code */ } +} + diff --git a/idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments/FunctionalTypeWithNamedArguments.kt b/idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments/FunctionalTypeWithNamedArguments.kt new file mode 100644 index 00000000000..cc4d5234de0 --- /dev/null +++ b/idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments/FunctionalTypeWithNamedArguments.kt @@ -0,0 +1,5 @@ +package test + +class FunctionalTypeWithNamedArguments { + public fun f(ftype: (key: String, value: Any?) -> Any?): String = "" +} diff --git a/idea/testData/decompiler/stubBuilder/Types/Types.kt b/idea/testData/decompiler/stubBuilder/Types/Types.kt index 6d91e6fcdff..e3d6187be3a 100644 --- a/idea/testData/decompiler/stubBuilder/Types/Types.kt +++ b/idea/testData/decompiler/stubBuilder/Types/Types.kt @@ -22,4 +22,6 @@ abstract class Types { abstract val extFun: @ExtensionFunctionType Function2 abstract val listExtStarFun: List<@ExtensionFunctionType Function1<*, *>> abstract val funTypeWithStarAndNonStar: Function1<*, Int> + + abstract fun functionTypeWithNamedArgs(fType: (first: String, second: Any?) -> Int) } diff --git a/idea/testData/decompiler/stubBuilder/Types/Types.txt b/idea/testData/decompiler/stubBuilder/Types/Types.txt index 7c6314fcf96..345ce842999 100644 --- a/idea/testData/decompiler/stubBuilder/Types/Types.txt +++ b/idea/testData/decompiler/stubBuilder/Types/Types.txt @@ -380,6 +380,36 @@ PsiJetFileStubImpl[package=test] REFERENCE_EXPRESSION:[referencedName=List] TYPE_ARGUMENT_LIST: TYPE_PROJECTION:[projectionKind=STAR] + FUN:[fqName=test.Types.functionTypeWithNamedArgs, hasBlockBody=true, hasBody=false, hasTypeParameterListBeforeFunctionName=false, isExtension=false, isTopLevel=false, name=functionTypeWithNamedArgs] + MODIFIER_LIST:[abstract public] + VALUE_PARAMETER_LIST: + VALUE_PARAMETER:[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=fType] + TYPE_REFERENCE: + FUNCTION_TYPE: + VALUE_PARAMETER_LIST: + VALUE_PARAMETER:[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=null] + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=String] + VALUE_PARAMETER:[fqName=null, hasDefaultValue=false, hasValOrVar=false, isMutable=false, name=null] + TYPE_REFERENCE: + NULLABLE_TYPE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Any] + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Int] + TYPE_REFERENCE: + USER_TYPE: + USER_TYPE: + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Unit] FUN:[fqName=test.Types.extOnFunctionType, hasBlockBody=true, hasBody=true, hasTypeParameterListBeforeFunctionName=true, isExtension=true, isTopLevel=false, name=extOnFunctionType] MODIFIER_LIST:[public final] TYPE_PARAMETER_LIST: diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/KotlinJavaScriptStubConsistencyTest.kt b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/KotlinJavaScriptStubConsistencyTest.kt index 5bef24d221c..dcb6f8d22b3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/KotlinJavaScriptStubConsistencyTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/KotlinJavaScriptStubConsistencyTest.kt @@ -23,13 +23,14 @@ import org.jetbrains.kotlin.idea.decompiler.js.buildDecompiledTextFromJsMetadata 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.ClassId import org.jetbrains.kotlin.name.FqName class KotlinJavaScriptStubConsistencyTest : StubConsistencyBaseTest() { override fun getFileIds() = listOf( "java.util", "jquery", "jquery.ui", "kotlin", "kotlin.browser", "kotlin.dom", "kotlin.js" - ).map { OldPackageFacadeClassUtils.getPackageClassId(FqName(it)) } + ).map { OldPackageFacadeClassUtils.getPackageClassId(FqName(it)) } + ClassId.topLevel(FqName("kotlin.js.JsonClass")) override fun getVirtualFileFinder(): VirtualFileFinder = JsVirtualFileFinder.SERVICE.getInstance(project) diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextFromJsMetadataTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextFromJsMetadataTestGenerated.java index 4da2e1057cd..1bbbcf23b13 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextFromJsMetadataTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextFromJsMetadataTestGenerated.java @@ -125,6 +125,12 @@ public class CommonDecompiledTextFromJsMetadataTestGenerated extends AbstractCom doTest(fileName); } + @TestMetadata("FunctionalTypeWithNamedArguments") + public void testFunctionalTypeWithNamedArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments/"); + doTest(fileName); + } + @TestMetadata("Inherited") public void testInherited() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/decompiler/decompiledText/Inherited/"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextTestGenerated.java index ac1f966fe6d..5eaf0a4bf2c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/CommonDecompiledTextTestGenerated.java @@ -95,6 +95,12 @@ public class CommonDecompiledTextTestGenerated extends AbstractCommonDecompiledT doTest(fileName); } + @TestMetadata("FunctionalTypeWithNamedArguments") + public void testFunctionalTypeWithNamedArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/decompiler/decompiledText/FunctionalTypeWithNamedArguments/"); + doTest(fileName); + } + @TestMetadata("Inherited") public void testInherited() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/decompiler/decompiledText/Inherited/");