Introduced LexicalScope for file top-level to obtain ownerDescriptor

This commit is contained in:
Valentin Kipyatkov
2015-10-26 15:18:58 +03:00
parent 7a33a16481
commit 4fcd35a5a9
8 changed files with 26 additions and 19 deletions
@@ -18,9 +18,10 @@ package org.jetbrains.kotlin.resolve.lazy
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.scopes.ImportingScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
public interface FileScopeProvider {
fun getFileResolutionScope(file: KtFile): ImportingScope
fun getFileResolutionScope(file: KtFile): LexicalScope
fun getImportResolver(file: KtFile): ImportResolver
public object ThrowException : FileScopeProvider {
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.resolve.lazy
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.SubpackagesScope
import org.jetbrains.kotlin.name.FqName
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver
import org.jetbrains.kotlin.resolve.TemporaryBindingTrace
import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope
import org.jetbrains.kotlin.resolve.scopes.ImportingScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope
import org.jetbrains.kotlin.resolve.scopes.utils.withParent
import org.jetbrains.kotlin.storage.StorageManager
@@ -49,11 +51,11 @@ public class FileScopeProviderImpl(
ktImportsFactory.createImportDirectives(moduleDescriptor.defaultImports)
}
private data class FileData(val scopeChain: ImportingScope, val importResolver: ImportResolver)
private class FileData(val scope: LexicalScope, val importResolver: ImportResolver)
private val cache = storageManager.createMemoizedFunction { file: KtFile -> createScopeChainAndImportResolver(file) }
override fun getFileResolutionScope(file: KtFile) = cache(file).scopeChain
override fun getFileResolutionScope(file: KtFile) = cache(file).scope
override fun getImportResolver(file: KtFile) = cache(file).importResolver
@@ -106,7 +108,15 @@ public class FileScopeProviderImpl(
scope = LazyImportScope(scope, packageFragment, aliasImportResolver, LazyImportScope.FilteringKind.ALL, "Alias imports in $debugName")
bindingTrace.recordScope(scope, file)
val lexicalScope = object : LexicalScope by LexicalScope.Empty {
override val parent: LexicalScope?
get() = scope
override val ownerDescriptor: DeclarationDescriptor
get() = packageFragment
}
bindingTrace.recordScope(lexicalScope, file)
val importResolver = object : ImportResolver {
override fun forceResolveAllImports() {
@@ -124,6 +134,6 @@ public class FileScopeProviderImpl(
}
}
return FileData(scope, importResolver)
return FileData(lexicalScope, importResolver)
}
}
@@ -42,8 +42,8 @@ import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotations;
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationsContextImpl;
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyPackageDescriptor;
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor;
import org.jetbrains.kotlin.resolve.scopes.ImportingScope;
import org.jetbrains.kotlin.resolve.scopes.KtScope;
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
import org.jetbrains.kotlin.storage.*;
import javax.inject.Inject;
@@ -208,7 +208,7 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
}
private LazyAnnotations createAnnotations(KtFile file, List<KtAnnotationEntry> annotationEntries) {
ImportingScope scope = fileScopeProvider.getFileResolutionScope(file);
LexicalScope scope = fileScopeProvider.getFileResolutionScope(file);
LazyAnnotationsContextImpl lazyAnnotationContext =
new LazyAnnotationsContextImpl(annotationResolve, storageManager, trace, scope);
return new LazyAnnotations(lazyAnnotationContext, annotationEntries);