From 1af7063a47668440466b3fc000b6451c6d7423ee Mon Sep 17 00:00:00 2001 From: Ivan Cilcic Date: Fri, 26 Jul 2019 15:29:27 +0300 Subject: [PATCH] Made primary constructor wrapper to avoid recreating value parameter instances --- .../converter/DeclarationsConverter.kt | 71 +++++++++---------- .../fir/lightTree/fir/PrimaryConstructor.kt | 13 ++++ 2 files changed, 46 insertions(+), 38 deletions(-) create mode 100644 compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/PrimaryConstructor.kt diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 3c106af1377..9777d1d336c 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -33,10 +33,7 @@ import org.jetbrains.kotlin.fir.lightTree.converter.ConverterUtil.isClassLocal import org.jetbrains.kotlin.fir.lightTree.converter.DataClassUtil.generateComponentFunctions import org.jetbrains.kotlin.fir.lightTree.converter.DataClassUtil.generateCopyFunction import org.jetbrains.kotlin.fir.lightTree.converter.FunctionUtil.removeLast -import org.jetbrains.kotlin.fir.lightTree.fir.ClassWrapper -import org.jetbrains.kotlin.fir.lightTree.fir.DestructuringDeclaration -import org.jetbrains.kotlin.fir.lightTree.fir.TypeConstraint -import org.jetbrains.kotlin.fir.lightTree.fir.ValueParameter +import org.jetbrains.kotlin.fir.lightTree.fir.* import org.jetbrains.kotlin.fir.lightTree.fir.modifier.Modifier import org.jetbrains.kotlin.fir.lightTree.fir.modifier.TypeModifier import org.jetbrains.kotlin.fir.lightTree.fir.modifier.TypeParameterModifier @@ -104,17 +101,15 @@ class DeclarationsConverter( * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseBlockExpression */ fun convertBlockExpression(block: LighterASTNode): FirBlock { - val firStatements = mutableListOf() - block.forEachChildren { - when (it.tokenType) { - CLASS -> firStatements += convertClass(it) as FirStatement - FUN -> firStatements += convertFunctionDeclaration(it) as FirStatement - PROPERTY -> firStatements += convertPropertyDeclaration(it) as FirStatement - DESTRUCTURING_DECLARATION -> firStatements += convertDestructingDeclaration(it).toFirDestructingDeclaration(session) - TYPEALIAS -> firStatements += convertTypeAlias(it) as FirStatement - OBJECT_DECLARATION -> firStatements += convertClass(it) as FirStatement - CLASS_INITIALIZER -> firStatements += convertAnonymousInitializer(it) as FirStatement - else -> if (it.isExpression()) firStatements += expressionConverter.getAsFirExpression(it) + val firStatements = block.forEachChildrenReturnList { node, container -> + when (node.tokenType) { + CLASS, OBJECT_DECLARATION -> container += convertClass(node) as FirStatement + FUN -> container += convertFunctionDeclaration(node) as FirStatement + PROPERTY -> container += convertPropertyDeclaration(node) as FirStatement + DESTRUCTURING_DECLARATION -> container += convertDestructingDeclaration(node).toFirDestructingDeclaration(session) + TYPEALIAS -> container += convertTypeAlias(node) as FirStatement + CLASS_INITIALIZER -> container += convertAnonymousInitializer(node) as FirStatement + else -> if (node.isExpression()) container += expressionConverter.getAsFirExpression(node) } } return FirBlockImpl(session, null).apply { @@ -407,15 +402,14 @@ class DeclarationsConverter( toDelegatedSelfType(firClass), delegatedSuperTypeRef ?: defaultDelegatedSuperTypeRef, superTypeCallEntry ) //parse primary constructor - val firPrimaryConstructor = convertPrimaryConstructor(primaryConstructor, classWrapper) + val primaryConstructorWrapper = convertPrimaryConstructor(primaryConstructor, classWrapper) + val firPrimaryConstructor = primaryConstructorWrapper?.firConstructor firPrimaryConstructor?.let { firClass.declarations += it } val properties = mutableListOf() if (primaryConstructor != null && firPrimaryConstructor != null) { //parse properties - properties += primaryConstructor - .getChildNodesByType(VALUE_PARAMETER_LIST) - .flatMap { convertValueParameters(it) } + properties += primaryConstructorWrapper.valueParameters .filter { it.hasValOrVar() } .map { it.toFirProperty() } firClass.addDeclarations(properties) @@ -478,8 +472,7 @@ class DeclarationsConverter( superTypeCallEntry = superTypeCallEntry ) //parse primary constructor - val firPrimaryConstructor = convertPrimaryConstructor(primaryConstructor, classWrapper) - firPrimaryConstructor?.let { this.declarations += it } + convertPrimaryConstructor(primaryConstructor, classWrapper)?.let { this.declarations += it.firConstructor } //parse declarations classBody?.let { @@ -535,8 +528,8 @@ class DeclarationsConverter( superTypeCallEntry = enumSuperTypeCallEntry ) firEnumEntry.superTypeRefs += enumClassWrapper.delegatedSuperTypeRef - convertPrimaryConstructor(null, enumClassWrapper)?.let { firEnumEntry.addDeclaration(it) } - classBodyNode?.also { firDeclarations += convertClassBody(it, /*classWrapper*/enumClassWrapper) } + convertPrimaryConstructor(null, enumClassWrapper)?.let { firEnumEntry.addDeclaration(it.firConstructor) } + classBodyNode?.also { firDeclarations += convertClassBody(it, enumClassWrapper) } firDeclarations.forEach { firEnumEntry.addDeclaration(it) } return@withChildClassName firEnumEntry @@ -582,7 +575,7 @@ class DeclarationsConverter( * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject * primaryConstructor branch */ - private fun convertPrimaryConstructor(primaryConstructor: LighterASTNode?, classWrapper: ClassWrapper): FirConstructorImpl? { + private fun convertPrimaryConstructor(primaryConstructor: LighterASTNode?, classWrapper: ClassWrapper): PrimaryConstructor? { if (primaryConstructor == null && classWrapper.hasSecondaryConstructor) return null if (classWrapper.isInterface()) return null @@ -603,20 +596,22 @@ class DeclarationsConverter( isThis = false ).extractArgumentsFrom(classWrapper.superTypeCallEntry, stubMode) - return FirPrimaryConstructorImpl( - session, - null, - FirConstructorSymbol(ClassNameUtil.callableIdForClassConstructor()), - if (primaryConstructor != null) modifiers.getVisibility() else defaultVisibility, - modifiers.hasExpect(), - modifiers.hasActual(), - classWrapper.delegatedSelfTypeRef, - firDelegatedCall - ).apply { - annotations += modifiers.annotations - this.typeParameters += ConverterUtil.typeParametersFromSelfType(classWrapper.delegatedSelfTypeRef) - this.valueParameters += valueParameters.map { it.firValueParameter } - } + return PrimaryConstructor( + FirPrimaryConstructorImpl( + session, + null, + FirConstructorSymbol(ClassNameUtil.callableIdForClassConstructor()), + if (primaryConstructor != null) modifiers.getVisibility() else defaultVisibility, + modifiers.hasExpect(), + modifiers.hasActual(), + classWrapper.delegatedSelfTypeRef, + firDelegatedCall + ).apply { + annotations += modifiers.annotations + this.typeParameters += ConverterUtil.typeParametersFromSelfType(classWrapper.delegatedSelfTypeRef) + this.valueParameters += valueParameters.map { it.firValueParameter } + }, valueParameters + ) } /** diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/PrimaryConstructor.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/PrimaryConstructor.kt new file mode 100644 index 00000000000..5eec39897c6 --- /dev/null +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/PrimaryConstructor.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.lightTree.fir + +import org.jetbrains.kotlin.fir.declarations.impl.FirConstructorImpl + +data class PrimaryConstructor( + val firConstructor: FirConstructorImpl, + val valueParameters: List +) \ No newline at end of file