Optimize memory footprint related to empty/single element collections

^KT-47926 Related
This commit is contained in:
Denis.Zharkov
2021-08-04 16:15:19 +03:00
committed by TeamCityServer
parent 112af9b145
commit 019001ca20
6 changed files with 25 additions and 11 deletions
@@ -48,7 +48,6 @@ import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor
import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstant
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
import org.jetbrains.kotlin.resolve.diagnostics.MutableDiagnosticsWithSuppression
import org.jetbrains.kotlin.resolve.scopes.receivers.CastImplicitClassReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
@@ -64,9 +63,8 @@ import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
import org.jetbrains.kotlin.types.typeUtil.makeNullable
import org.jetbrains.kotlin.utils.SmartList
import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.addToStdlib.compactIfPossible
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.util.*
import kotlin.collections.LinkedHashMap
class KotlinToResolvedCallTransformer(
private val callCheckers: Iterable<CallChecker>,
@@ -677,7 +675,7 @@ sealed class NewAbstractResolvedCall<D : CallableDescriptor>() : ResolvedCall<D>
result[parameter] = argument
}
}
}
}.compactIfPossible()
}
@@ -21,13 +21,13 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.Call
import org.jetbrains.kotlin.psi.KtReferenceExpression
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor
import org.jetbrains.kotlin.resolve.TemporaryBindingTrace
import org.jetbrains.kotlin.resolve.calls.CallResolver
import org.jetbrains.kotlin.resolve.calls.CallTransformer
@@ -61,8 +61,8 @@ import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.types.isDynamic
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.compactIfPossible
import org.jetbrains.kotlin.utils.sure
import java.util.*
class NewResolutionOldInference(
private val candidateResolver: CandidateResolver,
@@ -601,7 +601,7 @@ fun transformToReceiverWithSmartCastInfo(
val dataFlowValue = dataFlowValueFactory.createDataFlowValue(receiver, bindingContext, containingDescriptor)
return ReceiverValueWithSmartCastInfo(
receiver,
dataFlowInfo.getCollectedTypes(dataFlowValue, languageVersionSettings),
dataFlowInfo.getCollectedTypes(dataFlowValue, languageVersionSettings).compactIfPossible(),
dataFlowValue.isStable
)
}
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.expressions.*
import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
import org.jetbrains.kotlin.utils.addToStdlib.compactIfPossible
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import java.util.*
@@ -542,7 +543,7 @@ class PSICallResolver(
dataFlowValueFactory.createDataFlowValue(variableReceiver, temporaryTrace.bindingContext, context.scope.ownerDescriptor)
return ReceiverValueWithSmartCastInfo(
variableReceiver,
context.dataFlowInfo.getCollectedTypes(dataFlowValue, context.languageVersionSettings),
context.dataFlowInfo.getCollectedTypes(dataFlowValue, context.languageVersionSettings).compactIfPossible(),
dataFlowValue.isStable
).prepareReceiverRegardingCaptureTypes()
}
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.model.*
import java.util.*
import org.jetbrains.kotlin.utils.addToStdlib.compactIfPossible
class ArgumentsToParametersMapper(
languageVersionSettings: LanguageVersionSettings
@@ -63,7 +63,7 @@ class ArgumentsToParametersMapper(
}
processor.processDefaultsAndRunChecks()
return ArgumentMapping(processor.result, processor.getDiagnostics())
return ArgumentMapping(processor.result.compactIfPossible(), processor.getDiagnostics())
}
}
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
import org.jetbrains.kotlin.types.typeUtil.makeNullable
import org.jetbrains.kotlin.utils.SmartList
import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.addToStdlib.compactIfPossible
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
internal object CheckVisibility : ResolutionPart() {
@@ -96,7 +97,7 @@ internal object ArgumentsToCandidateParameterDescriptor : ResolutionPart() {
map[argument] = valueParameter
}
}
resolvedCall.argumentToCandidateParameter = map
resolvedCall.argumentToCandidateParameter = map.compactIfPossible()
}
}
@@ -185,6 +185,20 @@ inline fun <K, V, VA : V> MutableMap<K, V>.getOrPut(key: K, defaultValue: (K) ->
}
}
fun <T> Set<T>.compactIfPossible(): Set<T> =
when (size) {
0 -> emptySet()
1 -> setOf(single())
else -> this
}
fun <K, V> Map<K, V>.compactIfPossible(): Map<K, V> =
when (size) {
0 -> emptyMap()
1 -> Collections.singletonMap(keys.single(), values.single())
else -> this
}
inline fun <T> T.applyIf(`if`: Boolean, body: T.() -> T): T =
if (`if`) body() else this