From eb5a12925336ba6e09f7a23c22cca1a4e6a9ac70 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Fri, 25 Sep 2015 12:55:07 +0300 Subject: [PATCH] Created util function recordScope and record scope for file and value parameters. --- .../kotlin/resolve/BindingContextUtils.kt | 20 ++++++++++++++----- .../resolve/FunctionDescriptorResolver.kt | 4 ++++ .../jetbrains/kotlin/resolve/TypeResolver.kt | 5 ++--- .../kotlin/resolve/calls/CallResolver.java | 9 +++++---- .../resolve/lazy/FileScopeProviderImpl.kt | 5 ++++- .../resolve/scopes/LexicalWritableScope.kt | 2 +- .../resolve/scopes/receivers/Qualifier.kt | 6 +++--- .../BasicExpressionTypingVisitor.java | 6 +++--- .../ExpressionTypingVisitorDispatcher.java | 8 ++++++-- 9 files changed, 43 insertions(+), 22 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt index 41452a214e4..48a0d3eea7f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContextUtils.kt @@ -25,10 +25,12 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION import org.jetbrains.kotlin.resolve.BindingContext.LABEL_TARGET +import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo +import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.asJetScope import org.jetbrains.kotlin.resolve.scopes.utils.takeSnapshot import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo @@ -57,13 +59,9 @@ public fun JetExpression.isUsedAsExpression(context: BindingContext): Boolean = public fun JetExpression.isUsedAsStatement(context: BindingContext): Boolean = !isUsedAsExpression(context) -public fun > ResolutionContext.recordScopeAndDataFlowInfo(expression: JetExpression?) { +public fun > ResolutionContext.recordDataFlowInfo(expression: JetExpression?) { if (expression == null) return - val scopeToRecord = scope.takeSnapshot() - trace.record(BindingContext.RESOLUTION_SCOPE, expression, scopeToRecord.asJetScope()) - trace.record(BindingContext.LEXICAL_SCOPE, expression, scopeToRecord) - val typeInfo = trace.get(BindingContext.EXPRESSION_TYPE_INFO, expression) if (typeInfo != null) { trace.record(BindingContext.EXPRESSION_TYPE_INFO, expression, typeInfo.replaceDataFlowInfo(dataFlowInfo)) @@ -74,6 +72,18 @@ public fun > ResolutionContext.recordScopeAndDataFlo } } +public fun BindingTrace.recordScope(scope: LexicalScope, element: JetElement?) { + if (element == null) return + + val scopeToRecord = scope.takeSnapshot() + record(BindingContext.LEXICAL_SCOPE, element, scopeToRecord) + + // todo: remove it later + if (element is JetExpression) { + record(BindingContext.RESOLUTION_SCOPE, element, scopeToRecord.asJetScope()) + } +} + public fun BindingContext.getDataFlowInfo(expression: JetExpression?): DataFlowInfo = expression?.let { this[BindingContext.EXPRESSION_TYPE_INFO, it]?.dataFlowInfo } ?: DataFlowInfo.EMPTY diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index cdf1a998253..1ea9d15e820 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils.isFunctionExpression import org.jetbrains.kotlin.resolve.DescriptorUtils.isFunctionLiteral import org.jetbrains.kotlin.resolve.ModifiersChecker.resolveModalityFromModifiers import org.jetbrains.kotlin.resolve.ModifiersChecker.resolveVisibilityFromModifiers +import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.resolve.scopes.LexicalScope @@ -203,6 +204,9 @@ class FunctionDescriptorResolver( trace.report(EXPECTED_PARAMETERS_NUMBER_MISMATCH.on(function, expectedParameterTypes.size(), expectedParameterTypes)) } } + + trace.recordScope(innerScope, function.valueParameterList) + return resolveValueParameters( functionDescriptor, innerScope, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 395726b4bab..db57a2f2933 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -28,19 +28,18 @@ import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo import org.jetbrains.kotlin.psi.debugText.getDebugText import org.jetbrains.kotlin.resolve.PossiblyBareType.type import org.jetbrains.kotlin.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider +import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.resolve.lazy.LazyEntity import org.jetbrains.kotlin.resolve.scopes.JetScope import org.jetbrains.kotlin.resolve.scopes.LazyScopeAdapter import org.jetbrains.kotlin.resolve.scopes.LexicalScope -import org.jetbrains.kotlin.resolve.scopes.utils.asJetScope import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.Variance.INVARIANT import org.jetbrains.kotlin.types.Variance.IN_VARIANCE import org.jetbrains.kotlin.types.Variance.OUT_VARIANCE -import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull public class TypeResolver( private val annotationResolver: AnnotationResolver, @@ -109,7 +108,7 @@ public class TypeResolver( val typeElement = typeReference.getTypeElement() val type = resolveTypeElement(c, annotations, typeElement) - c.trace.record(BindingContext.LEXICAL_SCOPE, typeReference, c.scope) + c.trace.recordScope(c.scope, typeReference) if (!type.isBare) { for (argument in type.actualType.arguments) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java index 6984f3fb8fc..27cb0ba9d26 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolver.java @@ -49,10 +49,8 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage; import org.jetbrains.kotlin.resolve.scopes.LexicalScope; import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; -import org.jetbrains.kotlin.resolve.scopes.utils.UtilsPackage; import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.TypeSubstitutor; -import org.jetbrains.kotlin.types.TypeUtils; import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext; import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices; import org.jetbrains.kotlin.types.expressions.ExpressionTypingVisitorDispatcher; @@ -66,7 +64,8 @@ import java.util.Collections; import java.util.List; import static org.jetbrains.kotlin.diagnostics.Errors.*; -import static org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage.recordScopeAndDataFlowInfo; +import static org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage.recordDataFlowInfo; +import static org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage.recordScope; import static org.jetbrains.kotlin.resolve.calls.callResolverUtil.ResolveArgumentsMode.RESOLVE_FUNCTION_ARGUMENTS; import static org.jetbrains.kotlin.resolve.calls.callResolverUtil.ResolveArgumentsMode.SHAPE_FUNCTION_ARGUMENTS; import static org.jetbrains.kotlin.resolve.calls.context.CandidateResolveMode.EXIT_ON_FIRST_ERROR; @@ -469,7 +468,9 @@ public class CallResolver { TemporaryBindingTrace traceToResolveCall = TemporaryBindingTrace.create(context.trace, "trace to resolve call", call); BasicCallResolutionContext newContext = context.replaceBindingTrace(traceToResolveCall); - recordScopeAndDataFlowInfo(newContext, newContext.call.getCalleeExpression()); + recordScope(newContext.trace, newContext.scope, newContext.call.getCalleeExpression()); + recordDataFlowInfo(newContext, newContext.call.getCalleeExpression()); + OverloadResolutionResultsImpl results = doResolveCall(newContext, prioritizedTasks, callTransformer, tracing); DelegatingBindingTrace deltasTraceForTypeInference = ((OverloadResolutionResultsImpl) results).getTrace(); if (deltasTraceForTypeInference != null) { 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 b984d8f991e..9e1a7198974 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProviderImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeProviderImpl.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.psi.JetCodeFragment import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetImportsFactory import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope import org.jetbrains.kotlin.resolve.scopes.JetScope import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.get @@ -85,6 +86,8 @@ public class FileScopeProviderImpl( scopeChain.add(LazyImportScope(packageFragment, allUnderImportResolver, LazyImportScope.FilteringKind.INVISIBLE_CLASSES, "All under imports in $debugName (invisible classes only)")) scopeChain.add(LazyImportScope(packageFragment, defaultAllUnderImportResolver, LazyImportScope.FilteringKind.INVISIBLE_CLASSES, "Default all under imports in $debugName (invisible classes only)")) - return LazyFileScope(scopeChain, aliasImportResolver, allUnderImportResolver, packageFragment, debugName) + val lazyFileScope = LazyFileScope(scopeChain, aliasImportResolver, allUnderImportResolver, packageFragment, debugName) + bindingTrace.recordScope(lazyFileScope, file) + return lazyFileScope } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope.kt index f75fb912342..b27fc1f38ba 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope.kt @@ -112,7 +112,7 @@ class LexicalWritableScope( override fun getDeclaredFunctions(name: Name, location: LookupLocation) = this@LexicalWritableScope.getDeclaredFunctions(name, descriptorLimit) - override fun toString(): String = "Snapshot for $debugName" + override fun toString(): String = "Snapshot($descriptorLimit) for $debugName" override fun printStructure(p: Printer) { p.println("Snapshot with descriptorLimit = $descriptorLimit for scope:") diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt index dbfeb31deba..eb520c3ad74 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier.kt @@ -30,7 +30,7 @@ import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET import org.jetbrains.kotlin.resolve.BindingContext.SHORT_REFERENCE_TO_COMPANION_OBJECT import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName -import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScopeAndDataFlowInfo +import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope import org.jetbrains.kotlin.resolve.descriptorUtil.classObjectType import org.jetbrains.kotlin.resolve.descriptorUtil.hasClassObjectType import org.jetbrains.kotlin.resolve.scopes.ChainedScope @@ -41,7 +41,7 @@ import org.jetbrains.kotlin.resolve.validation.SymbolUsageValidator import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext import org.jetbrains.kotlin.utils.addIfNotNull -import java.util.ArrayList +import java.util.* import kotlin.properties.Delegates public interface Qualifier: ReceiverValue { @@ -126,7 +126,7 @@ fun createQualifier( if (packageViewDescriptor == null && classifierDescriptor == null) return null - context.recordScopeAndDataFlowInfo(expression) + context.trace.recordScope(context.scope, expression) val qualifier = QualifierReceiver(expression, packageViewDescriptor, classifierDescriptor) context.trace.record(QUALIFIER, qualifier.expression, qualifier) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index 16eaf73a2fa..360b6e24133 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.lexer.JetTokens; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.*; +import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage; import org.jetbrains.kotlin.resolve.callableReferences.CallableReferencesPackage; import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver; import org.jetbrains.kotlin.resolve.calls.CallExpressionResolver; @@ -428,9 +429,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { context.trace.recordType(expression.getInstanceReference(), result); context.trace.record(BindingContext.REFERENCE_TARGET, expression.getInstanceReference(), result.getConstructor().getDeclarationDescriptor()); } - if (superTypeQualifier != null) { - context.trace.record(BindingContext.LEXICAL_SCOPE, superTypeQualifier, context.scope); - } + + BindingContextUtilPackage.recordScope(context.trace, context.scope, superTypeQualifier); return result; } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java index 2b7c164bc87..dc89c4d7310 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java @@ -37,7 +37,8 @@ import org.jetbrains.kotlin.util.ReenteringLazyValueComputationException; import org.jetbrains.kotlin.utils.KotlinFrontEndException; import static org.jetbrains.kotlin.diagnostics.Errors.TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM; -import static org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage.recordScopeAndDataFlowInfo; +import static org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage.recordDataFlowInfo; +import static org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage.recordScope; public abstract class ExpressionTypingVisitorDispatcher extends JetVisitor implements ExpressionTypingInternals { @@ -185,7 +186,10 @@ public abstract class ExpressionTypingVisitorDispatcher extends JetVisitor