From 4e4fe9f7196a491fae206eab0b78791aab535538 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Sun, 2 Aug 2020 14:46:26 +0300 Subject: [PATCH] [FIR] Support some kinds of fake sources in light builder --- .../kotlin/fir/lightTree/converter/BaseConverter.kt | 2 +- .../fir/lightTree/converter/DeclarationsConverter.kt | 12 ++++++++---- .../src/org/jetbrains/kotlin/fir/FirSourceElement.kt | 5 +++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt index fbeb1ad7224..7e46150e7f2 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/BaseConverter.kt @@ -31,7 +31,7 @@ open class BaseConverter( override fun LighterASTNode.toFirSourceElement(kind: FirFakeSourceElementKind?): FirLightSourceElement { val startOffset = offset + tree.getStartOffset(this) val endOffset = offset + tree.getEndOffset(this) - return toFirLightSourceElement(startOffset, endOffset, tree) + return toFirLightSourceElement(startOffset, endOffset, tree, kind ?: FirRealSourceElementKind) } override val LighterASTNode.elementType: IElementType diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index eb47c057d7f..9bea916828f 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -457,7 +457,7 @@ class DeclarationsConverter( ) //parse primary constructor val primaryConstructorWrapper = convertPrimaryConstructor( - primaryConstructor, classWrapper, delegatedConstructorSource, + primaryConstructor, classNode, classWrapper, delegatedConstructorSource, delegationSpecifiers?.primaryConstructorBody ) val firPrimaryConstructor = primaryConstructorWrapper?.firConstructor @@ -564,7 +564,7 @@ class DeclarationsConverter( superTypeCallEntry = superTypeCallEntry ) //parse primary constructor - convertPrimaryConstructor(primaryConstructor, classWrapper, delegatedConstructorSource, primaryConstructorBody) + convertPrimaryConstructor(primaryConstructor, objectLiteral, classWrapper, delegatedConstructorSource, primaryConstructorBody) ?.let { this.declarations += it.firConstructor } //parse declarations @@ -635,7 +635,9 @@ class DeclarationsConverter( superTypeCallEntry = enumSuperTypeCallEntry ) superTypeRefs += enumClassWrapper.delegatedSuperTypeRef - convertPrimaryConstructor(null, enumClassWrapper, null)?.let { declarations += it.firConstructor } + convertPrimaryConstructor(null, enumEntry, enumClassWrapper, null)?.let { + declarations += it.firConstructor + } classBodyNode?.also { declarations += convertClassBody(it, enumClassWrapper) } } } @@ -683,6 +685,7 @@ class DeclarationsConverter( */ private fun convertPrimaryConstructor( primaryConstructor: LighterASTNode?, + classNode: LighterASTNode, classWrapper: ClassWrapper, delegatedConstructorSource: FirLightSourceElement?, body: FirBlock? = null @@ -719,6 +722,7 @@ class DeclarationsConverter( return PrimaryConstructor( buildPrimaryConstructor { source = primaryConstructor?.toFirSourceElement() + ?: classNode.toFirSourceElement(FirFakeSourceElementKind.ImplicitConstructor) session = baseSession origin = FirDeclarationOrigin.Source returnTypeRef = classWrapper.delegatedSelfTypeRef @@ -1343,7 +1347,7 @@ class DeclarationsConverter( delegatedSuperTypeRef = first superTypeRefs += first superTypeCallEntry += second - delegateConstructorSource = it.toFirSourceElement() + delegateConstructorSource = it.toFirSourceElement(FirFakeSourceElementKind.DelegatingConstructorCall) } DELEGATED_SUPER_TYPE_ENTRY -> { superTypeRefs += convertExplicitDelegation(it, delegateNumber, delegateFields, initializeDelegateStatements, containerSymbol, delegatedTypeRef) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt index 22291a1f0aa..acbe8e78de9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt @@ -201,7 +201,8 @@ inline fun PsiElement.toFirPsiSourceElement(kind: FirSourceElementKind = FirReal @Suppress("NOTHING_TO_INLINE") inline fun LighterASTNode.toFirLightSourceElement( startOffset: Int, endOffset: Int, - tree: FlyweightCapableTreeStructure -): FirLightSourceElement = FirLightSourceElement(this, startOffset, endOffset, tree) + tree: FlyweightCapableTreeStructure, + kind: FirSourceElementKind = FirRealSourceElementKind +): FirLightSourceElement = FirLightSourceElement(this, startOffset, endOffset, tree, kind) val FirSourceElement?.lightNode: LighterASTNode? get() = (this as? FirLightSourceElement)?.element