From d9e4b445b9832fc09f07a34eebfb1150f9864ff4 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 25 May 2017 19:46:02 +0300 Subject: [PATCH] Add extra information for EA-76201 --- .../resolve/lazy/LazyDeclarationResolver.java | 23 +++++++++++++++---- .../AbstractPsiBasedDeclarationProvider.kt | 15 +++++++----- ...leBasedPackageMemberDeclarationProvider.kt | 3 ++- .../descriptors/AbstractLazyMemberScope.kt | 4 ++++ 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java index 5f2d027bbd2..7a2b69ba13d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingTrace; +import org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope; import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyPackageDescriptor; import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.storage.LockBasedLazyResolveStorageManager; @@ -92,12 +93,24 @@ public class LazyDeclarationResolver { DeclarationDescriptor descriptor = getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, classObjectOrScript); if (descriptor == null) { + String providerInfoString = null; + if (scope instanceof AbstractLazyMemberScope) { + AbstractLazyMemberScope lazyMemberScope = (AbstractLazyMemberScope) scope; + providerInfoString = lazyMemberScope.toProviderString(); + } throw new IllegalArgumentException( - String.format("Could not find a classifier for %s.\n" + - "Found descriptor: %s (%s).\n", - PsiUtilsKt.getElementTextWithContext(classObjectOrScript), - scopeDescriptor != null ? DescriptorRenderer.DEBUG_TEXT.render(scopeDescriptor) : "null", - scopeDescriptor != null ? (scopeDescriptor.getContainingDeclaration().getClass()) : null)); + String.format( + "Could not find a classifier for %s.\n" + + "Found descriptor: %s (%s).\n" + + "Scope: %s.\n" + + "Provider: %s.", + PsiUtilsKt.getElementTextWithContext(classObjectOrScript), + scopeDescriptor != null ? DescriptorRenderer.DEBUG_TEXT.render(scopeDescriptor) : "null", + scopeDescriptor != null ? (scopeDescriptor.getContainingDeclaration().getClass()) : null, + scope, + providerInfoString != null ? providerInfoString : "null" + ) + ); } return (ClassDescriptor) descriptor; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt index 91272d1c79a..e68a698bd30 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.resolve.lazy.declarations import com.google.common.collect.ArrayListMultimap import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve import org.jetbrains.kotlin.resolve.lazy.data.KtClassInfoUtil import org.jetbrains.kotlin.resolve.lazy.data.KtClassLikeInfo @@ -67,6 +66,8 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage else -> throw IllegalArgumentException("Unknown declaration: " + declaration) } } + + override fun toString() = "allDeclarations: " + allDeclarations.mapNotNull { it.name } } private val index = storageManager.createLazyValue { @@ -77,21 +78,23 @@ abstract class AbstractPsiBasedDeclarationProvider(storageManager: StorageManage protected abstract fun doCreateIndex(index: Index) + internal fun toInfoString() = toString() + ": " + index().toString() + override fun getDeclarations(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): List = index().allDeclarations override fun getFunctionDeclarations(name: Name): List - = index().functions[ResolveSessionUtils.safeNameForLazyResolve(name)].toList() + = index().functions[safeNameForLazyResolve(name)].toList() override fun getPropertyDeclarations(name: Name): List - = index().properties[ResolveSessionUtils.safeNameForLazyResolve(name)].toList() + = index().properties[safeNameForLazyResolve(name)].toList() override fun getDestructuringDeclarationsEntries(name: Name): Collection - = index().destructuringDeclarationsEntries[ResolveSessionUtils.safeNameForLazyResolve(name)].toList() + = index().destructuringDeclarationsEntries[safeNameForLazyResolve(name)].toList() override fun getClassOrObjectDeclarations(name: Name): Collection - = index().classesAndObjects[ResolveSessionUtils.safeNameForLazyResolve(name)] + = index().classesAndObjects[safeNameForLazyResolve(name)] override fun getTypeAliasDeclarations(name: Name): Collection - = index().typeAliases[ResolveSessionUtils.safeNameForLazyResolve(name)] + = index().typeAliases[safeNameForLazyResolve(name)] } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedPackageMemberDeclarationProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedPackageMemberDeclarationProvider.kt index 5924b63b600..a4185be216a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedPackageMemberDeclarationProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedPackageMemberDeclarationProvider.kt @@ -45,5 +45,6 @@ class FileBasedPackageMemberDeclarationProvider( override fun getPackageFiles() = packageFiles - override fun toString() = "Declarations for package $fqName" + override fun toString() = "Declarations for package $fqName with files ${packageFiles.map { it.name }} " + + "with declarations inside ${packageFiles.flatMap { it.declarations }.map { it.name ?: "???"}}" } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt index ab8e5937721..3d638433f39 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/AbstractLazyMemberScope.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.lazy.LazyClassContext import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo +import org.jetbrains.kotlin.resolve.lazy.declarations.AbstractPsiBasedDeclarationProvider import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProvider import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.LexicalScope @@ -219,6 +220,9 @@ protected constructor( // a generic implementation can't do this properly abstract override fun toString(): String + fun toProviderString() = (declarationProvider as? AbstractPsiBasedDeclarationProvider)?.toInfoString() + ?: declarationProvider.toString() + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") p.pushIndent()