From c93de933329a13f1cb5a9ffe8385501875ea0e2f Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Sat, 24 Oct 2015 12:36:27 +0300 Subject: [PATCH] FileScopeProvider.AdditionalScopes return ImportingScope's --- .../kotlin/cli/jvm/repl/ReplInterpreter.java | 8 ++++++-- .../synthetic/JavaSyntheticPropertiesScope.kt | 17 +++++++---------- .../synthetic/SamAdapterFunctionsScope.kt | 9 +++++++-- .../kotlin/resolve/lazy/FileScopeProvider.kt | 3 +-- .../resolve/lazy/FileScopeProviderImpl.kt | 4 +++- .../kotlin/resolve/scopes/utils/ScopeUtils.kt | 12 ++++++++++++ .../UsePropertyAccessSyntaxIntention.kt | 5 ++--- .../ReplaceWithAnnotationAnalyzer.kt | 11 ++++++----- 8 files changed, 44 insertions(+), 25 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 9b6810f26d1..fd9d4dbaa4e 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 @@ -68,7 +68,9 @@ import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider; import org.jetbrains.kotlin.resolve.lazy.ResolveSession; import org.jetbrains.kotlin.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.kotlin.resolve.lazy.declarations.*; +import org.jetbrains.kotlin.resolve.scopes.ImportingScope; import org.jetbrains.kotlin.resolve.scopes.KtScope; +import org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; import org.jetbrains.org.objectweb.asm.Type; @@ -130,8 +132,10 @@ public class ReplInterpreter { FileScopeProvider.AdditionalScopes scopeProvider = new FileScopeProvider.AdditionalScopes() { @NotNull @Override - public List getScopes() { - return lastLineScope != null ? new SmartList(lastLineScope) : Collections.emptyList(); + public List getScopes() { + return lastLineScope != null + ? new SmartList(ScopeUtilsKt.memberScopeAsImportingScope(lastLineScope)) + : Collections.emptyList(); } }; diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt index 2082e73fb6f..6e12b5e5836 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt @@ -28,8 +28,9 @@ import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.KtScope -import org.jetbrains.kotlin.resolve.scopes.KtScopeImpl +import org.jetbrains.kotlin.resolve.scopes.ImportingScope +import org.jetbrains.kotlin.resolve.scopes.LexicalScope +import org.jetbrains.kotlin.resolve.scopes.utils.collectAllFromImportingScopes import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf @@ -46,7 +47,7 @@ interface SyntheticJavaPropertyDescriptor : PropertyDescriptor { val setMethod: FunctionDescriptor? companion object { - fun findByGetterOrSetter(getterOrSetter: FunctionDescriptor, resolutionScope: KtScope): SyntheticJavaPropertyDescriptor? { + fun findByGetterOrSetter(getterOrSetter: FunctionDescriptor, resolutionScope: LexicalScope): SyntheticJavaPropertyDescriptor? { val name = getterOrSetter.getName() if (name.isSpecial()) return null val identifier = name.getIdentifier() @@ -55,7 +56,7 @@ interface SyntheticJavaPropertyDescriptor : PropertyDescriptor { val owner = getterOrSetter.getContainingDeclaration() as? ClassDescriptor ?: return null val originalGetterOrSetter = getterOrSetter.original - return resolutionScope.getSyntheticExtensionProperties(listOf(owner.getDefaultType())) + return resolutionScope.collectAllFromImportingScopes { it.getSyntheticExtensionProperties(listOf(owner.defaultType)) } .filterIsInstance() .firstOrNull { originalGetterOrSetter == it.getMethod || originalGetterOrSetter == it.setMethod } } @@ -68,7 +69,7 @@ interface SyntheticJavaPropertyDescriptor : PropertyDescriptor { } } -class JavaSyntheticPropertiesScope(storageManager: StorageManager) : KtScopeImpl() { +class JavaSyntheticPropertiesScope(storageManager: StorageManager) : ImportingScope by ImportingScope.Empty { private val syntheticPropertyInClass = storageManager.createMemoizedFunctionWithNullableValues, PropertyDescriptor> { pair -> syntheticPropertyInClassNotCached(pair.first, pair.second) } @@ -223,11 +224,7 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager) : KtScopeImpl return Name.identifier("set" + identifier.removePrefix(prefix)) } - override fun getContainingDeclaration(): DeclarationDescriptor { - throw UnsupportedOperationException() - } - - override fun printScopeStructure(p: Printer) { + override fun printStructure(p: Printer) { p.println(javaClass.simpleName) } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index 632b6f1e5e9..b23ef2d329b 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -27,9 +27,10 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.KtScope +import org.jetbrains.kotlin.resolve.scopes.ImportingScope import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.utils.Printer import java.util.* import kotlin.properties.Delegates @@ -37,7 +38,7 @@ interface SamAdapterExtensionFunctionDescriptor : FunctionDescriptor { val sourceFunction: FunctionDescriptor } -class SamAdapterFunctionsScope(storageManager: StorageManager) : KtScope by KtScope.Empty { +class SamAdapterFunctionsScope(storageManager: StorageManager) : ImportingScope by ImportingScope.Empty { private val extensionForFunction = storageManager.createMemoizedFunctionWithNullableValues { function -> extensionForFunctionNotCached(function) } @@ -81,6 +82,10 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : KtScope by KtSc } } + override fun printStructure(p: Printer) { + p.println(javaClass.simpleName) + } + private class MyFunctionDescriptor( containingDeclaration: DeclarationDescriptor, original: SimpleFunctionDescriptor?, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProvider.kt index c516f1e701f..d587e503703 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProvider.kt @@ -18,7 +18,6 @@ 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.KtScope public interface FileScopeProvider { fun getFileScopeChain(file: KtFile): ImportingScope @@ -30,7 +29,7 @@ public interface FileScopeProvider { } public interface AdditionalScopes { - public val scopes: List + public val scopes: List } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProviderImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProviderImpl.kt index c0a5fbafd6b..de107629a7e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProviderImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProviderImpl.kt @@ -30,6 +30,7 @@ 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.utils.memberScopeAsImportingScope +import org.jetbrains.kotlin.resolve.scopes.utils.withParent import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.utils.sure @@ -86,7 +87,8 @@ public class FileScopeProviderImpl( "All under imports in $debugName (invisible classes only)") for (additionalScope in additionalScopes.flatMap { it.scopes }) { - scope = additionalScope.memberScopeAsImportingScope(scope) + assert(additionalScope.parent == null) + scope = additionalScope.withParent(scope) } scope = LazyImportScope(scope, packageFragment, defaultAllUnderImportResolver, LazyImportScope.FilteringKind.VISIBLE_CLASSES, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt index 860d6e31b5d..d28147ee887 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtils.kt @@ -290,6 +290,11 @@ fun LexicalScope.addImportScope(importScope: ImportingScope): LexicalScope { } fun ImportingScope.withParent(newParent: ImportingScope?): ImportingScope { + // TODO: it's a hack for Repl + if (this is MemberScopeToImportingScopeAdapter) { + return MemberScopeToImportingScopeAdapter(newParent, memberScope) + } + return object: ImportingScope by this { override val parent: ImportingScope? get() = newParent @@ -317,3 +322,10 @@ private class LexicalScopeWrapper(val delegate: LexicalScope, val newImportingSc } } +fun chainImportingScopes(scopes: List): ImportingScope? { + return scopes.asReversed() + .fold(null) { current, scope -> + assert(scope.parent == null) + scope.withParent(current) + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt index 025cb73a927..b6122bcebf9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt @@ -48,7 +48,6 @@ import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.util.DelegatingCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.resolve.scopes.KtScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.asKtScope import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor @@ -87,7 +86,7 @@ class UsePropertyAccessSyntaxIntention : JetSelfTargetingOffsetIndependentIntent val function = resolvedCall.getResultingDescriptor() as? FunctionDescriptor ?: return null val resolutionScope = callExpression.getResolutionScope(bindingContext, resolutionFacade) - val property = findSyntheticProperty(function, resolutionScope.asKtScope()) ?: return null + val property = findSyntheticProperty(function, resolutionScope) ?: return null val dataFlowInfo = bindingContext.getDataFlowInfo(callee) val qualifiedExpression = callExpression.getQualifiedExpressionForSelectorOrThis() @@ -143,7 +142,7 @@ class UsePropertyAccessSyntaxIntention : JetSelfTargetingOffsetIndependentIntent return result.isSuccess && result.resultingDescriptor.original == property } - private fun findSyntheticProperty(function: FunctionDescriptor, resolutionScope: KtScope): SyntheticJavaPropertyDescriptor? { + private fun findSyntheticProperty(function: FunctionDescriptor, resolutionScope: LexicalScope): SyntheticJavaPropertyDescriptor? { SyntheticJavaPropertyDescriptor.findByGetterOrSetter(function, resolutionScope)?.let { return it } for (overridden in function.getOverriddenDescriptors()) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt index 847ccb409b3..8c37c1724e7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt @@ -46,7 +46,8 @@ import org.jetbrains.kotlin.resolve.lazy.descriptors.ClassResolutionScopesSuppor import org.jetbrains.kotlin.resolve.scopes.* import org.jetbrains.kotlin.resolve.scopes.receivers.ThisReceiver import org.jetbrains.kotlin.resolve.scopes.utils.asKtScope -import org.jetbrains.kotlin.resolve.scopes.utils.asLexicalScope +import org.jetbrains.kotlin.resolve.scopes.utils.chainImportingScopes +import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices @@ -95,7 +96,7 @@ object ReplaceWithAnnotationAnalyzer { val explicitImportsScope = buildExplicitImportsScope(annotation, resolutionFacade, module) val additionalScopes = resolutionFacade.getFrontendService(FileScopeProvider.AdditionalScopes::class.java) val scope = getResolutionScope(symbolDescriptor, symbolDescriptor, - listOf(explicitImportsScope.asKtScope()) + additionalScopes.scopes) ?: return null + listOf(explicitImportsScope) + additionalScopes.scopes) ?: return null var bindingContext = analyzeInContext(expression, module, scope, resolutionFacade) @@ -179,7 +180,7 @@ object ReplaceWithAnnotationAnalyzer { val module = symbolDescriptor.module val explicitImportsScope = buildExplicitImportsScope(annotation, resolutionFacade, module) - val scope = getResolutionScope(symbolDescriptor, symbolDescriptor, listOf(explicitImportsScope.asKtScope())) ?: return null + val scope = getResolutionScope(symbolDescriptor, symbolDescriptor, listOf(explicitImportsScope)) ?: return null val typeResolver = resolutionFacade.getFrontendService(TypeResolver::class.java) val bindingTrace = BindingTraceContext() @@ -237,7 +238,7 @@ object ReplaceWithAnnotationAnalyzer { return traceContext.bindingContext } - private fun getResolutionScope(descriptor: DeclarationDescriptor, ownerDescriptor: DeclarationDescriptor, additionalScopes: Collection): LexicalScope? { + private fun getResolutionScope(descriptor: DeclarationDescriptor, ownerDescriptor: DeclarationDescriptor, additionalScopes: Collection): LexicalScope? { return when (descriptor) { is PackageFragmentDescriptor -> { val moduleDescriptor = descriptor.containingDeclaration @@ -245,7 +246,7 @@ object ReplaceWithAnnotationAnalyzer { } is PackageViewDescriptor -> - ChainedScope(ownerDescriptor, "ReplaceWith resolution scope", descriptor.memberScope, *additionalScopes.toTypedArray()).asLexicalScope() + chainImportingScopes(listOf(descriptor.memberScope.memberScopeAsImportingScope()) + additionalScopes) is ClassDescriptor -> { val outerScope = getResolutionScope(descriptor.containingDeclaration, ownerDescriptor, additionalScopes) ?: return null