diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt index 5294cf5b3d0..590e7f6f345 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt @@ -16,10 +16,11 @@ package org.jetbrains.kotlin.load.kotlin -import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents +import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolverImpl +import org.jetbrains.kotlin.storage.StorageManager // This class is needed only for easier injection: exact types of needed components are specified in the constructor here. // Otherwise injector generator is not smart enough to deduce, for example, which package fragment provider DeserializationComponents needs @@ -30,8 +31,14 @@ public class DeserializationComponentsForJava( annotationAndConstantLoader: BinaryClassAnnotationAndConstantLoaderImpl, packageFragmentProvider: LazyJavaPackageFragmentProvider ) { - val components = DeserializationComponents( - storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider, - JavaFlexibleTypeCapabilitiesDeserializer - ) + val components: DeserializationComponents; + + { + val localClassResolver = LocalClassResolverImpl() + components = DeserializationComponents( + storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider, + localClassResolver, JavaFlexibleTypeCapabilitiesDeserializer + ) + localClassResolver.setDeserializationComponents(components) + } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt index bffe5304a05..79125dfa7c1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt @@ -16,22 +16,25 @@ package org.jetbrains.kotlin.builtins -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope +import com.google.protobuf.ExtensionRegistryLite import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.descriptors.PackageFragmentProviderImpl import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl -import org.jetbrains.kotlin.name.* -import org.jetbrains.kotlin.storage.StorageManager -import java.io.InputStream -import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents -import com.google.protobuf.ExtensionRegistryLite -import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder -import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeCapabilitiesDeserializer -import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.serialization.ClassData import org.jetbrains.kotlin.serialization.NameSerializationUtil import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.ClassData +import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf +import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder +import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents +import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeCapabilitiesDeserializer +import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolverImpl +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope +import org.jetbrains.kotlin.storage.StorageManager +import java.io.InputStream public class BuiltinsPackageFragment( fqName: FqName, @@ -56,17 +59,15 @@ public class BuiltinsPackageFragment( private val members: DeserializedPackageMemberScope = run { val proto = loadPackage() - DeserializedPackageMemberScope( - this, - proto, - nameResolver, - DeserializationComponents( - storageManager, module, BuiltInsClassDataFinder(), - BuiltInsAnnotationAndConstantLoader(getContainingDeclaration()), - provider, FlexibleTypeCapabilitiesDeserializer.ThrowException - ), - { readClassNames(proto) } + val localClassResolver = LocalClassResolverImpl() + val components = DeserializationComponents( + storageManager, module, BuiltInsClassDataFinder(), + BuiltInsAnnotationAndConstantLoader(getContainingDeclaration()), + provider, localClassResolver, + FlexibleTypeCapabilitiesDeserializer.ThrowException ) + localClassResolver.setDeserializationComponents(components) + DeserializedPackageMemberScope(this, proto, nameResolver, components, { readClassNames(proto) }) } private fun loadPackage(): ProtoBuf.Package { @@ -85,8 +86,7 @@ public class BuiltinsPackageFragment( private inner class BuiltInsClassDataFinder : ClassDataFinder { override fun findClassData(classId: ClassId): ClassData? { - val metadataPath = BuiltInsSerializationUtil.getClassMetadataPath(classId) ?: return null - val stream = loadResource(metadataPath) ?: return null + val stream = loadResource(BuiltInsSerializationUtil.getClassMetadataPath(classId)) ?: return null val classProto = ProtoBuf.Class.parseFrom(stream, extensionRegistry) diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index e1a9891d854..d80e8009e2e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -104,7 +104,7 @@ public class KotlinBuiltIns { private final Map primitiveJetTypeToJetArrayType; private final Map jetArrayTypeToPrimitiveJetType; - private static final FqNames FQ_NAMES = new FqNames(); + public static final FqNames FQ_NAMES = new FqNames(); private KotlinBuiltIns() { builtInsModule = new ModuleDescriptorImpl( @@ -147,7 +147,7 @@ public class KotlinBuiltIns { jetArrayTypeToPrimitiveJetType.put(arrayType, type); } - private static class FqNames { + public static class FqNames { public final FqNameUnsafe any = fqNameUnsafe("Any"); public final FqNameUnsafe nothing = fqNameUnsafe("Nothing"); public final FqNameUnsafe cloneable = fqNameUnsafe("Cloneable"); diff --git a/core/serialization/serialization.iml b/core/serialization/serialization.iml index 1ebc393e8c9..2dc5c7ffd03 100644 --- a/core/serialization/serialization.iml +++ b/core/serialization/serialization.iml @@ -8,6 +8,7 @@ + diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/LocalClassResolver.kt b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/LocalClassResolver.kt new file mode 100644 index 00000000000..afbe1fa5021 --- /dev/null +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/LocalClassResolver.kt @@ -0,0 +1,24 @@ +/* + * 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.serialization.deserialization + +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.name.ClassId + +public trait LocalClassResolver { + public fun resolveLocalClass(classId: ClassId): ClassDescriptor? +} diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/LocalClassResolverImpl.kt b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/LocalClassResolverImpl.kt new file mode 100644 index 00000000000..bb6d55f5200 --- /dev/null +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/LocalClassResolverImpl.kt @@ -0,0 +1,35 @@ +/* + * 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.serialization.deserialization + +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.name.ClassId +import javax.inject.Inject +import kotlin.properties.Delegates + +public class LocalClassResolverImpl : LocalClassResolver { + public var components: DeserializationComponents by Delegates.notNull() + + Inject + public fun setDeserializationComponents(components: DeserializationComponents) { + this.components = components + } + + override fun resolveLocalClass(classId: ClassId): ClassDescriptor? { + return components.deserializeClass(classId) + } +} diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt index c17f05ce7a5..fabdb79ebf2 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer.kt @@ -16,12 +16,12 @@ package org.jetbrains.kotlin.serialization.deserialization -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedTypeParameterDescriptor -import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.serialization.ProtoBuf +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedTypeParameterDescriptor import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.utils.* +import org.jetbrains.kotlin.utils.toReadOnlyList import java.util.LinkedHashMap public class TypeDeserializer( @@ -94,7 +94,7 @@ public class TypeDeserializer( val id = c.nameResolver.getClassId(fqNameIndex) if (id.isLocal()) { // Local classes can't be found in scopes - return c.components.deserializeClass(id) + return c.components.localClassResolver.resolveLocalClass(id) } return c.components.moduleDescriptor.findClassAcrossModuleDependencies(id) } diff --git a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt index 7ab932cf833..cfa9ca5f7be 100644 --- a/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt +++ b/core/serialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt @@ -29,6 +29,7 @@ public class DeserializationComponents( public val classDataFinder: ClassDataFinder, public val annotationAndConstantLoader: AnnotationAndConstantLoader>, public val packageFragmentProvider: PackageFragmentProvider, + public val localClassResolver: LocalClassResolver, public val flexibleTypeCapabilitiesDeserializer: FlexibleTypeCapabilitiesDeserializer ) { public val classDeserializer: ClassDeserializer = ClassDeserializer(this) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt index 0343d1dd495..31cadcc3aee 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt @@ -16,27 +16,27 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.stubs.impl.* -import org.jetbrains.kotlin.psi.JetPackageDirective -import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes -import com.intellij.psi.stubs.StubElement import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.psi.JetDotQualifiedExpression -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.psi.stubs.KotlinUserTypeStub -import org.jetbrains.kotlin.name.SpecialNames -import org.jetbrains.kotlin.lexer.JetModifierKeywordToken -import org.jetbrains.kotlin.serialization.Flags -import org.jetbrains.kotlin.lexer.JetTokens -import org.jetbrains.kotlin.serialization.ProtoBuf +import com.intellij.psi.stubs.StubElement import com.intellij.util.io.StringRef -import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer -import org.jetbrains.kotlin.psi.JetConstructorCalleeExpression -import org.jetbrains.kotlin.psi.JetTypeReference +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.lexer.JetModifierKeywordToken +import org.jetbrains.kotlin.lexer.JetTokens +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.serialization.deserialization.AnnotatedCallableKind +import org.jetbrains.kotlin.psi.JetConstructorCalleeExpression +import org.jetbrains.kotlin.psi.JetDotQualifiedExpression +import org.jetbrains.kotlin.psi.JetPackageDirective +import org.jetbrains.kotlin.psi.JetTypeReference +import org.jetbrains.kotlin.psi.stubs.KotlinUserTypeStub +import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes +import org.jetbrains.kotlin.psi.stubs.impl.* +import org.jetbrains.kotlin.serialization.Flags +import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.CallableKind +import org.jetbrains.kotlin.serialization.deserialization.AnnotatedCallableKind +import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer fun createTopLevelClassStub(classId: ClassId, classProto: ProtoBuf.Class, context: ClsStubBuilderContext): KotlinFileStubImpl { val fileStub = createFileStub(classId.getPackageFqName()) @@ -90,7 +90,10 @@ fun createStubForPackageName(packageDirectiveStub: KotlinPlaceHolderStubImpl): KotlinUserTypeStub { - val segments = typeClassId.asSingleFqName().pathSegments().toArrayList() + val fqName = + if (typeClassId.isLocal()) KotlinBuiltIns.FQ_NAMES.any + else typeClassId.asSingleFqName() + val segments = fqName.pathSegments().toArrayList() assert(segments.isNotEmpty()) val iterator = segments.listIterator(segments.size()) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompiler.kt index 538b414b44a..98d127bd42b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompiler.kt @@ -16,22 +16,27 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil -import org.jetbrains.kotlin.descriptors.* +import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor -import org.jetbrains.kotlin.load.kotlin.* +import org.jetbrains.kotlin.load.kotlin.BinaryClassAnnotationAndConstantLoaderImpl +import org.jetbrains.kotlin.load.kotlin.JavaFlexibleTypeCapabilitiesDeserializer +import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache +import org.jetbrains.kotlin.load.kotlin.PackageClassUtils +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap +import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope +import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import org.jetbrains.kotlin.storage.LockBasedStorageManager import java.util.Collections -import com.intellij.openapi.vfs.VirtualFile -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope -import com.intellij.openapi.diagnostic.Logger -import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents -import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap -import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler { val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile) @@ -101,7 +106,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di private val deserializationComponents = DeserializationComponents( storageManager, moduleDescriptor, localClassDataFinder, annotationAndConstantLoader, packageFragmentProvider, - JavaFlexibleTypeCapabilitiesDeserializer + ResolveEverythingToKotlinAnyLocalClassResolver, JavaFlexibleTypeCapabilitiesDeserializer ) private fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/LocalClassFinder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/LocalClassFinder.kt index b3cef0b0d57..bc44beef2fb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/LocalClassFinder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/LocalClassFinder.kt @@ -16,18 +16,21 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder -import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder -import org.jetbrains.kotlin.load.java.structure.JavaClass -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass -import org.jetbrains.kotlin.idea.decompiler.isKotlinWithCompatibleAbiVersion -import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache -import com.intellij.openapi.vfs.VirtualFile -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder -import org.jetbrains.kotlin.serialization.ClassData -import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.idea.decompiler.isKotlinWithCompatibleAbiVersion +import org.jetbrains.kotlin.load.java.structure.JavaClass +import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache +import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder +import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.ClassData +import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder +import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolver +import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil class LocalClassFinder( val packageDirectory: VirtualFile, @@ -63,6 +66,10 @@ class LocalClassDataFinder( } } +object ResolveEverythingToKotlinAnyLocalClassResolver : LocalClassResolver { + override fun resolveLocalClass(classId: ClassId): ClassDescriptor = KotlinBuiltIns.getInstance().getAny() +} + private val JavaClass.classId: ClassId get() { val outer = getOuterClass() diff --git a/idea/testData/decompiler/stubBuilder/LocalClass/LocalClass.kt b/idea/testData/decompiler/stubBuilder/LocalClass/LocalClass.kt new file mode 100644 index 00000000000..0897ef8ae9b --- /dev/null +++ b/idea/testData/decompiler/stubBuilder/LocalClass/LocalClass.kt @@ -0,0 +1,18 @@ +package test + +class LocalClass { + private fun foo() = run { + class Local + + Local() + } + + private val bar = object {} + + private val sam = Runnable {} + + private val sub = object : Runnable { + override fun run() { + } + } +} diff --git a/idea/testData/decompiler/stubBuilder/LocalClass/LocalClass.txt b/idea/testData/decompiler/stubBuilder/LocalClass/LocalClass.txt new file mode 100644 index 00000000000..0c0c419ff10 --- /dev/null +++ b/idea/testData/decompiler/stubBuilder/LocalClass/LocalClass.txt @@ -0,0 +1,38 @@ +PsiJetFileStubImpl[package=test] + PACKAGE_DIRECTIVE: + REFERENCE_EXPRESSION:[referencedName=test] + CLASS:[fqName=test.LocalClass, isEnumEntry=false, isLocal=false, isTopLevel=true, isTrait=false, name=LocalClass, superNames=[]] + MODIFIER_LIST:[internal final] + VALUE_PARAMETER_LIST: + CLASS_BODY: + PROPERTY:[fqName=test.LocalClass.bar, hasDelegate=false, hasDelegateExpression=false, hasInitializer=false, hasReceiverTypeRef=false, hasReturnTypeRef=true, isProbablyNothingType=false, isTopLevel=false, isVar=false, name=bar] + MODIFIER_LIST:[private final] + TYPE_REFERENCE: + USER_TYPE:[isAbsoluteInRootPackage=false] + USER_TYPE:[isAbsoluteInRootPackage=false] + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Any] + PROPERTY:[fqName=test.LocalClass.sam, hasDelegate=false, hasDelegateExpression=false, hasInitializer=false, hasReceiverTypeRef=false, hasReturnTypeRef=true, isProbablyNothingType=false, isTopLevel=false, isVar=false, name=sam] + MODIFIER_LIST:[private final] + TYPE_REFERENCE: + USER_TYPE:[isAbsoluteInRootPackage=false] + USER_TYPE:[isAbsoluteInRootPackage=false] + USER_TYPE:[isAbsoluteInRootPackage=false] + REFERENCE_EXPRESSION:[referencedName=java] + REFERENCE_EXPRESSION:[referencedName=lang] + REFERENCE_EXPRESSION:[referencedName=Runnable] + PROPERTY:[fqName=test.LocalClass.sub, hasDelegate=false, hasDelegateExpression=false, hasInitializer=false, hasReceiverTypeRef=false, hasReturnTypeRef=true, isProbablyNothingType=false, isTopLevel=false, isVar=false, name=sub] + MODIFIER_LIST:[private final] + TYPE_REFERENCE: + USER_TYPE:[isAbsoluteInRootPackage=false] + USER_TYPE:[isAbsoluteInRootPackage=false] + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Any] + FUN:[fqName=test.LocalClass.foo, hasBlockBody=true, hasBody=true, hasTypeParameterListBeforeFunctionName=false, isExtension=false, isProbablyNothingType=false, isTopLevel=false, name=foo] + MODIFIER_LIST:[private final] + VALUE_PARAMETER_LIST: + TYPE_REFERENCE: + USER_TYPE:[isAbsoluteInRootPackage=false] + USER_TYPE:[isAbsoluteInRootPackage=false] + REFERENCE_EXPRESSION:[referencedName=kotlin] + REFERENCE_EXPRESSION:[referencedName=Any] diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderTestGenerated.java index 578dff7fa5e..019dd2a1219 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderTestGenerated.java @@ -96,6 +96,12 @@ public class ClsStubBuilderTestGenerated extends AbstractClsStubBuilderTest { doTest(fileName); } + @TestMetadata("LocalClass") + public void testLocalClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/stubBuilder/LocalClass/"); + doTest(fileName); + } + @TestMetadata("NestedClasses") public void testNestedClasses() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/stubBuilder/NestedClasses/");