Created util function recordScope and record scope for file and value parameters.
This commit is contained in:
@@ -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 <C : ResolutionContext<C>> ResolutionContext<C>.recordScopeAndDataFlowInfo(expression: JetExpression?) {
|
||||
public fun <C : ResolutionContext<C>> ResolutionContext<C>.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 <C : ResolutionContext<C>> ResolutionContext<C>.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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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<F> results = doResolveCall(newContext, prioritizedTasks, callTransformer, tracing);
|
||||
DelegatingBindingTrace deltasTraceForTypeInference = ((OverloadResolutionResultsImpl) results).getTrace();
|
||||
if (deltasTraceForTypeInference != null) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:")
|
||||
|
||||
@@ -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)
|
||||
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+6
-2
@@ -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<JetTypeInfo, ExpressionTypingContext> implements ExpressionTypingInternals {
|
||||
|
||||
@@ -185,7 +186,10 @@ public abstract class ExpressionTypingVisitorDispatcher extends JetVisitor<JetTy
|
||||
}
|
||||
|
||||
context.trace.record(BindingContext.PROCESSED, expression);
|
||||
recordScopeAndDataFlowInfo(context.replaceDataFlowInfo(result.getDataFlowInfo()), expression);
|
||||
|
||||
// todo save scope before analyze and fix debugger: see CodeFragmentAnalyzer.correctContextForExpression
|
||||
recordScope(context.trace, context.scope, expression);
|
||||
recordDataFlowInfo(context.replaceDataFlowInfo(result.getDataFlowInfo()), expression);
|
||||
return result;
|
||||
}
|
||||
catch (ProcessCanceledException e) {
|
||||
|
||||
Reference in New Issue
Block a user