Show "kotlin.Any" in decompiled text for local/anonymous types

This commit is contained in:
Alexander Udalov
2015-02-25 18:43:48 +03:00
parent 6287055475
commit e136025ac5
14 changed files with 220 additions and 75 deletions
@@ -16,10 +16,11 @@
package org.jetbrains.kotlin.load.kotlin 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.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents 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. // 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 // 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, annotationAndConstantLoader: BinaryClassAnnotationAndConstantLoaderImpl,
packageFragmentProvider: LazyJavaPackageFragmentProvider packageFragmentProvider: LazyJavaPackageFragmentProvider
) { ) {
val components = DeserializationComponents( val components: DeserializationComponents;
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
JavaFlexibleTypeCapabilitiesDeserializer {
) val localClassResolver = LocalClassResolverImpl()
components = DeserializationComponents(
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
localClassResolver, JavaFlexibleTypeCapabilitiesDeserializer
)
localClassResolver.setDeserializationComponents(components)
}
} }
@@ -16,22 +16,25 @@
package org.jetbrains.kotlin.builtins 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.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.PackageFragmentProviderImpl import org.jetbrains.kotlin.descriptors.PackageFragmentProviderImpl
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.name.FqName
import java.io.InputStream import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents import org.jetbrains.kotlin.serialization.ClassData
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.serialization.NameSerializationUtil import org.jetbrains.kotlin.serialization.NameSerializationUtil
import org.jetbrains.kotlin.serialization.ProtoBuf 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( public class BuiltinsPackageFragment(
fqName: FqName, fqName: FqName,
@@ -56,17 +59,15 @@ public class BuiltinsPackageFragment(
private val members: DeserializedPackageMemberScope = run { private val members: DeserializedPackageMemberScope = run {
val proto = loadPackage() val proto = loadPackage()
DeserializedPackageMemberScope( val localClassResolver = LocalClassResolverImpl()
this, val components = DeserializationComponents(
proto, storageManager, module, BuiltInsClassDataFinder(),
nameResolver, BuiltInsAnnotationAndConstantLoader(getContainingDeclaration()),
DeserializationComponents( provider, localClassResolver,
storageManager, module, BuiltInsClassDataFinder(), FlexibleTypeCapabilitiesDeserializer.ThrowException
BuiltInsAnnotationAndConstantLoader(getContainingDeclaration()),
provider, FlexibleTypeCapabilitiesDeserializer.ThrowException
),
{ readClassNames(proto) }
) )
localClassResolver.setDeserializationComponents(components)
DeserializedPackageMemberScope(this, proto, nameResolver, components, { readClassNames(proto) })
} }
private fun loadPackage(): ProtoBuf.Package { private fun loadPackage(): ProtoBuf.Package {
@@ -85,8 +86,7 @@ public class BuiltinsPackageFragment(
private inner class BuiltInsClassDataFinder : ClassDataFinder { private inner class BuiltInsClassDataFinder : ClassDataFinder {
override fun findClassData(classId: ClassId): ClassData? { override fun findClassData(classId: ClassId): ClassData? {
val metadataPath = BuiltInsSerializationUtil.getClassMetadataPath(classId) ?: return null val stream = loadResource(BuiltInsSerializationUtil.getClassMetadataPath(classId)) ?: return null
val stream = loadResource(metadataPath) ?: return null
val classProto = ProtoBuf.Class.parseFrom(stream, extensionRegistry) val classProto = ProtoBuf.Class.parseFrom(stream, extensionRegistry)
@@ -104,7 +104,7 @@ public class KotlinBuiltIns {
private final Map<JetType, JetType> primitiveJetTypeToJetArrayType; private final Map<JetType, JetType> primitiveJetTypeToJetArrayType;
private final Map<JetType, JetType> jetArrayTypeToPrimitiveJetType; private final Map<JetType, JetType> jetArrayTypeToPrimitiveJetType;
private static final FqNames FQ_NAMES = new FqNames(); public static final FqNames FQ_NAMES = new FqNames();
private KotlinBuiltIns() { private KotlinBuiltIns() {
builtInsModule = new ModuleDescriptorImpl( builtInsModule = new ModuleDescriptorImpl(
@@ -147,7 +147,7 @@ public class KotlinBuiltIns {
jetArrayTypeToPrimitiveJetType.put(arrayType, type); jetArrayTypeToPrimitiveJetType.put(arrayType, type);
} }
private static class FqNames { public static class FqNames {
public final FqNameUnsafe any = fqNameUnsafe("Any"); public final FqNameUnsafe any = fqNameUnsafe("Any");
public final FqNameUnsafe nothing = fqNameUnsafe("Nothing"); public final FqNameUnsafe nothing = fqNameUnsafe("Nothing");
public final FqNameUnsafe cloneable = fqNameUnsafe("Cloneable"); public final FqNameUnsafe cloneable = fqNameUnsafe("Cloneable");
+1
View File
@@ -8,6 +8,7 @@
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="protobuf-java" level="project" /> <orderEntry type="library" exported="" name="protobuf-java" level="project" />
<orderEntry type="library" name="javax.inject" level="project" />
<orderEntry type="module" module-name="descriptors" exported="" /> <orderEntry type="module" module-name="descriptors" exported="" />
<orderEntry type="module" module-name="util.runtime" /> <orderEntry type="module" module-name="util.runtime" />
</component> </component>
@@ -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?
}
@@ -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)
}
}
@@ -16,12 +16,12 @@
package org.jetbrains.kotlin.serialization.deserialization 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.ClassDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor 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.types.*
import org.jetbrains.kotlin.utils.* import org.jetbrains.kotlin.utils.toReadOnlyList
import java.util.LinkedHashMap import java.util.LinkedHashMap
public class TypeDeserializer( public class TypeDeserializer(
@@ -94,7 +94,7 @@ public class TypeDeserializer(
val id = c.nameResolver.getClassId(fqNameIndex) val id = c.nameResolver.getClassId(fqNameIndex)
if (id.isLocal()) { if (id.isLocal()) {
// Local classes can't be found in scopes // 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) return c.components.moduleDescriptor.findClassAcrossModuleDependencies(id)
} }
@@ -29,6 +29,7 @@ public class DeserializationComponents(
public val classDataFinder: ClassDataFinder, public val classDataFinder: ClassDataFinder,
public val annotationAndConstantLoader: AnnotationAndConstantLoader<AnnotationDescriptor, CompileTimeConstant<*>>, public val annotationAndConstantLoader: AnnotationAndConstantLoader<AnnotationDescriptor, CompileTimeConstant<*>>,
public val packageFragmentProvider: PackageFragmentProvider, public val packageFragmentProvider: PackageFragmentProvider,
public val localClassResolver: LocalClassResolver,
public val flexibleTypeCapabilitiesDeserializer: FlexibleTypeCapabilitiesDeserializer public val flexibleTypeCapabilitiesDeserializer: FlexibleTypeCapabilitiesDeserializer
) { ) {
public val classDeserializer: ClassDeserializer = ClassDeserializer(this) public val classDeserializer: ClassDeserializer = ClassDeserializer(this)
@@ -16,27 +16,27 @@
package org.jetbrains.kotlin.idea.decompiler.stubBuilder 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 com.intellij.psi.PsiElement
import org.jetbrains.kotlin.psi.JetDotQualifiedExpression import com.intellij.psi.stubs.StubElement
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.util.io.StringRef import com.intellij.util.io.StringRef
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.psi.JetConstructorCalleeExpression import org.jetbrains.kotlin.lexer.JetModifierKeywordToken
import org.jetbrains.kotlin.psi.JetTypeReference 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.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.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 { fun createTopLevelClassStub(classId: ClassId, classProto: ProtoBuf.Class, context: ClsStubBuilderContext): KotlinFileStubImpl {
val fileStub = createFileStub(classId.getPackageFqName()) val fileStub = createFileStub(classId.getPackageFqName())
@@ -90,7 +90,10 @@ fun createStubForPackageName(packageDirectiveStub: KotlinPlaceHolderStubImpl<Jet
} }
fun createStubForTypeName(typeClassId: ClassId, parent: StubElement<out PsiElement>): KotlinUserTypeStub { fun createStubForTypeName(typeClassId: ClassId, parent: StubElement<out PsiElement>): 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()) assert(segments.isNotEmpty())
val iterator = segments.listIterator(segments.size()) val iterator = segments.listIterator(segments.size())
@@ -16,22 +16,27 @@
package org.jetbrains.kotlin.idea.decompiler.textBuilder package org.jetbrains.kotlin.idea.decompiler.textBuilder
import org.jetbrains.kotlin.name.ClassId import com.intellij.openapi.diagnostic.Logger
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.descriptors.* 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.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.FqName
import org.jetbrains.kotlin.name.Name 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 org.jetbrains.kotlin.storage.LockBasedStorageManager
import java.util.Collections 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 { public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler {
val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile) val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile)
@@ -101,7 +106,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
private val deserializationComponents = DeserializationComponents( private val deserializationComponents = DeserializationComponents(
storageManager, moduleDescriptor, localClassDataFinder, annotationAndConstantLoader, packageFragmentProvider, storageManager, moduleDescriptor, localClassDataFinder, annotationAndConstantLoader, packageFragmentProvider,
JavaFlexibleTypeCapabilitiesDeserializer ResolveEverythingToKotlinAnyLocalClassResolver, JavaFlexibleTypeCapabilitiesDeserializer
) )
private fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor { private fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor {
@@ -16,18 +16,21 @@
package org.jetbrains.kotlin.idea.decompiler.textBuilder 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.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( class LocalClassFinder(
val packageDirectory: VirtualFile, 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 private val JavaClass.classId: ClassId
get() { get() {
val outer = getOuterClass() val outer = getOuterClass()
@@ -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() {
}
}
}
@@ -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]
@@ -96,6 +96,12 @@ public class ClsStubBuilderTestGenerated extends AbstractClsStubBuilderTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("LocalClass")
public void testLocalClass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/stubBuilder/LocalClass/");
doTest(fileName);
}
@TestMetadata("NestedClasses") @TestMetadata("NestedClasses")
public void testNestedClasses() throws Exception { public void testNestedClasses() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/stubBuilder/NestedClasses/"); String fileName = JetTestUtils.navigationMetadata("idea/testData/decompiler/stubBuilder/NestedClasses/");