From 4fe894c03d2b38fb80fd90691e9d9288698dd52c Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 20 Oct 2017 16:39:09 +0300 Subject: [PATCH] Minor: extract variable subject processing to a separate fun --- .../PatternMatchingTypingVisitor.kt | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.kt index d45608fe3bc..d4c665ba9c6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.kt @@ -182,32 +182,8 @@ class PatternMatchingTypingVisitor internal constructor(facade: ExpressionTyping val subjectVariable = expression.subjectVariable val subject = when { - subjectVariable != null -> { - if (!components.languageVersionSettings.supportsFeature(LanguageFeature.VariableDeclarationInWhenSubject)) { - 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)) - + subjectVariable != null -> processVariableSubject(subjectVariable, contextBeforeSubject) + subjectExpression != null -> Subject.Expression(subjectExpression, facade.getTypeInfo(subjectExpression, contextBeforeSubject)) else -> Subject.None() } @@ -264,6 +240,31 @@ class PatternMatchingTypingVisitor internal constructor(facade: ExpressionTyping 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( expression: KtWhenExpression, contextWithExpectedType: ExpressionTypingContext,