From f20aba63a687bf590d383978a94f91a82a5f1b7f Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 23 Dec 2015 14:18:22 +0300 Subject: [PATCH] Add better diagnostic for "could not create stub for nested class" failures --- .../builtIns/KotlinBuiltInStubBuilder.kt | 2 +- .../classFile/KotlinClsStubBuilder.kt | 2 +- .../js/KotlinJavaScriptStubBuilder.kt | 2 +- .../stubBuilder/ClassClsStubBuilder.kt | 19 +++++++++++++++++-- .../stubBuilder/ClsStubBuilderContext.kt | 4 +++- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt index d8c58d22a0d..fde646cbe0c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt @@ -81,7 +81,7 @@ public class KotlinBuiltInStubBuilder : ClsStubBuilder() { private fun createStubBuilderComponents(file: VirtualFile, packageFqName: FqName, nameResolver: NameResolver): ClsStubBuilderComponents { val finder = DirectoryBasedClassDataFinder(file.parent!!, packageFqName, nameResolver, BuiltInsSerializedResourcePaths) val annotationLoader = AnnotationLoaderForStubBuilderImpl(BuiltInSerializerProtocol) - return ClsStubBuilderComponents(finder, annotationLoader) + return ClsStubBuilderComponents(finder, annotationLoader, file) } companion object { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt index e0f2ca01592..dc7a3a8346d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClsStubBuilder.kt @@ -102,7 +102,7 @@ public open class KotlinClsStubBuilder : ClsStubBuilder() { val classFinder = DirectoryBasedClassFinder(file.getParent()!!, packageFqName) val classDataFinder = DirectoryBasedDataFinder(classFinder, LOG) val annotationLoader = AnnotationLoaderForClassFileStubBuilder(classFinder, LoggingErrorReporter(LOG)) - return ClsStubBuilderComponents(classDataFinder, annotationLoader) + return ClsStubBuilderComponents(classDataFinder, annotationLoader, file) } companion object { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt index 9f344683a10..173803ddf36 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt @@ -82,6 +82,6 @@ public class KotlinJavaScriptStubBuilder : ClsStubBuilder() { file.parent!!, packageFqName, nameResolver, KotlinJavascriptSerializedResourcePaths ) val annotationLoader = AnnotationLoaderForStubBuilderImpl(JsSerializerProtocol) - return ClsStubBuilderComponents(classDataFinder, annotationLoader) + return ClsStubBuilderComponents(classDataFinder, annotationLoader, file) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt index a177af8f00b..d92218f766b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder +import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.PsiElement import com.intellij.psi.stubs.StubElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns @@ -233,10 +234,24 @@ private class ClassClsStubBuilder( } private fun createNestedClassStub(classBody: StubElement, nestedClassId: ClassId) { - val classDataWithSource = c.components.classDataFinder.findClassData(nestedClassId).sure { - "Could not find class data for nested class ${nestedClassId.shortClassName} of class ${nestedClassId.outerClassId}" + val classDataWithSource = c.components.classDataFinder.findClassData(nestedClassId) + if (classDataWithSource == null) { + val rootFile = c.components.virtualFileForDebug + LOG.error( + "Could not find class data for nested class $nestedClassId of class ${nestedClassId.outerClassId}\n" + + "Root file: ${rootFile.canonicalPath}\n" + + "Dir: ${rootFile.parent.canonicalPath}\n" + + "Children:\n" + + "${rootFile.parent.children.sortedBy { it.name }.joinToString(separator = "\n") { + it.name + " (valid: ${it.isValid})" + } }") + return } val (nameResolver, classProto) = classDataWithSource.classData createClassStub(classBody, classProto, nestedClassId, c.child(nameResolver, TypeTable(classProto.typeTable))) } + + companion object { + private val LOG = Logger.getInstance(ClassClsStubBuilder::class.java) + } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt index ad3872f9e7b..1ff45275054 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClsStubBuilderContext.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.decompiler.stubBuilder +import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -30,7 +31,8 @@ data class ClassIdWithTarget(val classId: ClassId, val target: AnnotationUseSite class ClsStubBuilderComponents( val classDataFinder: ClassDataFinder, - val annotationLoader: AnnotationAndConstantLoader + val annotationLoader: AnnotationAndConstantLoader, + val virtualFileForDebug: VirtualFile ) { fun createContext( nameResolver: NameResolver,