From a7503303d5f1e76e010796f6498ddc79209fb01f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 11 Dec 2015 15:55:45 +0100 Subject: [PATCH] diagnostics for EA-73611 --- .../kotlin/cli/jvm/repl/ReplInterpreter.java | 5 +++++ .../kotlin/resolve/lazy/LazyDeclarationResolver.java | 12 ++++++++++-- .../AbstractDeclarationProviderFactory.java | 6 ++++++ .../declarations/DeclarationProviderFactory.java | 3 +++ .../types/expressions/LocalClassifierAnalyzer.kt | 4 ++++ .../resolve/PluginDeclarationProviderFactory.kt | 9 +++++++-- 6 files changed, 35 insertions(+), 4 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java index c6b9e68e1c6..cd1c59d5e9d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.java @@ -492,6 +492,11 @@ public class ReplInterpreter { return this.delegateFactory.getPackageMemberDeclarationProvider(packageFqName); } + @Override + public void diagnoseMissingPackageFragment(KtFile file) { + this.delegateFactory.diagnoseMissingPackageFragment(file); + } + public static class AdaptablePackageMemberDeclarationProvider extends DelegatePackageMemberDeclarationProvider { @NotNull private PackageMemberDeclarationProvider delegateProvider; 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 24c23be248d..ed98c371326 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java @@ -243,9 +243,17 @@ public class LazyDeclarationResolver { KtDeclaration parentDeclaration = KtStubbedPsiUtil.getContainingDeclaration(declaration); boolean isTopLevel = parentDeclaration == null; if (isTopLevel) { // for top level declarations we search directly in package because of possible conflicts with imports - FqName fqName = ((KtFile) declaration.getContainingFile()).getPackageFqName(); + KtFile ktFile = (KtFile) declaration.getContainingFile(); + FqName fqName = ktFile.getPackageFqName(); LazyPackageDescriptor packageDescriptor = topLevelDescriptorProvider.getPackageFragment(fqName); - assert packageDescriptor != null; + if (packageDescriptor == null) { + if (topLevelDescriptorProvider instanceof LazyClassContext) { + ((LazyClassContext) topLevelDescriptorProvider).getDeclarationProviderFactory().diagnoseMissingPackageFragment(ktFile); + } + else { + throw new IllegalStateException("Cannot find package fragment for file " + ktFile.getName() + " with package " + fqName); + } + } return packageDescriptor.getMemberScope(); } else { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractDeclarationProviderFactory.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractDeclarationProviderFactory.java index 40f13b5408f..938d8447559 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractDeclarationProviderFactory.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/AbstractDeclarationProviderFactory.java @@ -20,6 +20,7 @@ import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.storage.MemoizedFunctionToNullable; import org.jetbrains.kotlin.storage.StorageManager; @@ -43,4 +44,9 @@ public abstract class AbstractDeclarationProviderFactory implements DeclarationP public PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName) { return packageDeclarationProviders.invoke(packageFqName); } + + @Override + public void diagnoseMissingPackageFragment(KtFile file) { + throw new IllegalStateException("Cannot find package fragment for file " + file.getName() + " with package " + file.getPackageFqName()); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProviderFactory.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProviderFactory.java index bc018ca90bc..655064e6ca6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProviderFactory.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProviderFactory.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.lazy.declarations; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.resolve.lazy.data.KtClassLikeInfo; public interface DeclarationProviderFactory { @@ -27,4 +28,6 @@ public interface DeclarationProviderFactory { @Nullable PackageMemberDeclarationProvider getPackageMemberDeclarationProvider(@NotNull FqName packageFqName); + + void diagnoseMissingPackageFragment(KtFile file); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt index 42be7b84788..e8ff2e8ec45 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.debugText.getDebugText import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo @@ -133,6 +134,9 @@ class LocalClassDescriptorHolder( throw UnsupportedOperationException("Should not be called for top-level declarations") } + override fun diagnoseMissingPackageFragment(file: KtFile?) { + throw UnsupportedOperationException() + } } override val annotationResolver = this@LocalClassDescriptorHolder.annotationResolver override val lookupTracker: LookupTracker = LookupTracker.DO_NOTHING diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/PluginDeclarationProviderFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/PluginDeclarationProviderFactory.kt index 07cc262b375..562547d2ea8 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/PluginDeclarationProviderFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/PluginDeclarationProviderFactory.kt @@ -18,12 +18,12 @@ package org.jetbrains.kotlin.idea.stubindex.resolve import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.lazy.data.KtClassLikeInfo import org.jetbrains.kotlin.resolve.lazy.declarations.* -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil public class PluginDeclarationProviderFactory( private val project: Project, @@ -53,4 +53,9 @@ public class PluginDeclarationProviderFactory( return StubBasedPackageMemberDeclarationProvider(name, project, indexedFilesScope) } + + override fun diagnoseMissingPackageFragment(file: KtFile) { + throw IllegalStateException("Cannot find package fragment for file ${file.name} with package ${file.packageFqName}, " + + "vFile ${file.virtualFile}, nonIndexed ${file in nonIndexedFiles}") + } }