Minor: extract variable subject processing to a separate fun
This commit is contained in:
+27
-26
@@ -182,32 +182,8 @@ class PatternMatchingTypingVisitor internal constructor(facade: ExpressionTyping
|
|||||||
val subjectVariable = expression.subjectVariable
|
val subjectVariable = expression.subjectVariable
|
||||||
|
|
||||||
val subject = when {
|
val subject = when {
|
||||||
subjectVariable != null -> {
|
subjectVariable != null -> processVariableSubject(subjectVariable, contextBeforeSubject)
|
||||||
if (!components.languageVersionSettings.supportsFeature(LanguageFeature.VariableDeclarationInWhenSubject)) {
|
subjectExpression != null -> Subject.Expression(subjectExpression, facade.getTypeInfo(subjectExpression, contextBeforeSubject))
|
||||||
trace.report(Errors.UNSUPPORTED_FEATURE.on(
|
|
||||||
subjectVariable,
|
|
||||||
Pair(LanguageFeature.VariableDeclarationInWhenSubject, components.languageVersionSettings)
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
val scopeWithSubjectVariable = ExpressionTypingUtils.newWritableScopeImpl(contextBeforeSubject, LexicalScopeKind.WHEN, components.overloadChecker)
|
|
||||||
|
|
||||||
// Destructuring causes SOE in UAST :(
|
|
||||||
val resolveResult = components.localVariableResolver.process(subjectVariable, contextBeforeSubject, contextBeforeSubject.scope, facade)
|
|
||||||
val typeInfo = resolveResult.first
|
|
||||||
val descriptor = resolveResult.second
|
|
||||||
|
|
||||||
scopeWithSubjectVariable.addVariableDescriptor(descriptor)
|
|
||||||
|
|
||||||
// NB typeInfo returned by 'localVariableResolver.process(...)' treats local variable declaration as a statement,
|
|
||||||
// so 'typeInfo' above it has type 'kotlin.Unit'.
|
|
||||||
// Propagate declared variable type as a "subject expression" type.
|
|
||||||
Subject.Variable(subjectVariable, descriptor, typeInfo.replaceType(descriptor.type), scopeWithSubjectVariable)
|
|
||||||
}
|
|
||||||
|
|
||||||
subjectExpression != null ->
|
|
||||||
Subject.Expression(subjectExpression, facade.getTypeInfo(subjectExpression, contextBeforeSubject))
|
|
||||||
|
|
||||||
else -> Subject.None()
|
else -> Subject.None()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,6 +240,31 @@ class PatternMatchingTypingVisitor internal constructor(facade: ExpressionTyping
|
|||||||
return createTypeInfo(resultType, resultDataFlowInfo, branchesTypeInfo.jumpOutPossible, contextWithExpectedType.dataFlowInfo)
|
return createTypeInfo(resultType, resultDataFlowInfo, branchesTypeInfo.jumpOutPossible, contextWithExpectedType.dataFlowInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun processVariableSubject(subjectVariable: KtProperty, contextBeforeSubject: ExpressionTypingContext): Subject.Variable {
|
||||||
|
val trace = contextBeforeSubject.trace
|
||||||
|
|
||||||
|
if (!components.languageVersionSettings.supportsFeature(LanguageFeature.VariableDeclarationInWhenSubject)) {
|
||||||
|
trace.report(UNSUPPORTED_FEATURE.on(
|
||||||
|
subjectVariable,
|
||||||
|
Pair(LanguageFeature.VariableDeclarationInWhenSubject, components.languageVersionSettings)
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
val scopeWithSubjectVariable = ExpressionTypingUtils.newWritableScopeImpl(contextBeforeSubject, LexicalScopeKind.WHEN, components.overloadChecker)
|
||||||
|
|
||||||
|
// Destructuring causes SOE in UAST :(
|
||||||
|
val resolveResult = components.localVariableResolver.process(subjectVariable, contextBeforeSubject, contextBeforeSubject.scope, facade)
|
||||||
|
val typeInfo = resolveResult.first
|
||||||
|
val descriptor = resolveResult.second
|
||||||
|
|
||||||
|
scopeWithSubjectVariable.addVariableDescriptor(descriptor)
|
||||||
|
|
||||||
|
// NB typeInfo returned by 'localVariableResolver.process(...)' treats local variable declaration as a statement,
|
||||||
|
// so 'typeInfo' above it has type 'kotlin.Unit'.
|
||||||
|
// Propagate declared variable type as a "subject expression" type.
|
||||||
|
return Subject.Variable(subjectVariable, descriptor, typeInfo.replaceType(descriptor.type), scopeWithSubjectVariable)
|
||||||
|
}
|
||||||
|
|
||||||
private fun inferTypeForWhenExpression(
|
private fun inferTypeForWhenExpression(
|
||||||
expression: KtWhenExpression,
|
expression: KtWhenExpression,
|
||||||
contextWithExpectedType: ExpressionTypingContext,
|
contextWithExpectedType: ExpressionTypingContext,
|
||||||
|
|||||||
Reference in New Issue
Block a user