From 2eb17df962e9bbf37658319b34e8bef4d30504b8 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Wed, 5 Aug 2020 16:26:47 +0300 Subject: [PATCH] Do not compute `SamType` too eagerly as it can force member resolution Internally, during creation of `SamType` the compiler checks if a parameter is really can be used as a SAM, so this check involves lookup for abstract members, which can force additional computation of member scopes. This is totally fine for BE but it can be dangerous for light classes computation when not all scopes are processed. Note that this issue appeared quite recently after 16f175612e0475b5d36d3799cebfd2a97d5565a3 #KT-40869 Fixed --- .../codegen/binding/CodegenAnnotatingVisitor.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java index b11ddf1694e..f030af62da3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java @@ -821,20 +821,17 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { Map arguments = newResolvedCall.getValueArguments(); for (ValueParameterDescriptor valueParameter : arguments.keySet()) { - SamType samType = SamType.createByValueParameter(valueParameter); - if (samType == null) continue; - ResolvedValueArgument argument = arguments.get(valueParameter); if (argument instanceof ExpressionValueArgument) { ValueArgument valueArgument = ((ExpressionValueArgument) argument).getValueArgument(); if (valueArgument != null && newResolvedCall.getExpectedTypeForSamConvertedArgument(valueArgument) != null) { - recordSamTypeOnArgumentExpression(samType, valueArgument); + recordSamTypeOnArgumentExpression(valueParameter, valueArgument); } } else if (argument instanceof VarargValueArgument) { VarargValueArgument varargValueArgument = (VarargValueArgument) argument; for (ValueArgument valueArgument : varargValueArgument.getArguments()) { if (valueArgument != null && newResolvedCall.getExpectedTypeForSamConvertedArgument(valueArgument) != null) { - recordSamTypeOnArgumentExpression(samType, valueArgument); + recordSamTypeOnArgumentExpression(valueParameter, valueArgument); } } } @@ -872,6 +869,13 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { } } + private void recordSamTypeOnArgumentExpression(ValueParameterDescriptor valueParameter, ValueArgument valueArgument) { + SamType samType = SamType.createByValueParameter(valueParameter); + if (samType == null) return; + + recordSamTypeOnArgumentExpression(samType, valueArgument); + } + private void recordSamTypeOnArgumentExpression(SamType samType, ValueArgument valueArgument) { KtExpression argumentExpression = valueArgument.getArgumentExpression(); assert argumentExpression != null : valueArgument.asElement().getText();