From 9e4e5eed68f7b0524ebdb4755e6180dd5cee675f Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 8 Dec 2022 18:25:12 +0200 Subject: [PATCH] [FIR] Introduce FirResolvedErrorReference node --- .../references/FirResolvedErrorReference.kt | 33 +++++++++++++ .../FirResolvedErrorReferenceBuilder.kt | 49 +++++++++++++++++++ .../impl/FirResolvedErrorReferenceImpl.kt | 35 +++++++++++++ .../kotlin/fir/visitors/FirDefaultVisitor.kt | 3 ++ .../fir/visitors/FirDefaultVisitorVoid.kt | 3 ++ .../kotlin/fir/visitors/FirTransformer.kt | 9 ++++ .../kotlin/fir/visitors/FirVisitor.kt | 3 ++ .../kotlin/fir/visitors/FirVisitorVoid.kt | 9 ++++ .../fir/tree/generator/FirTreeBuilder.kt | 1 + .../generator/ImplementationConfigurator.kt | 4 ++ .../fir/tree/generator/printer/visitor.kt | 27 +++++++--- 11 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/FirResolvedErrorReference.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/builder/FirResolvedErrorReferenceBuilder.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/impl/FirResolvedErrorReferenceImpl.kt diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/FirResolvedErrorReference.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/FirResolvedErrorReference.kt new file mode 100644 index 00000000000..0d41c9c97c0 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/FirResolvedErrorReference.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2022 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.references + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic +import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirResolvedErrorReference : FirResolvedNamedReference(), FirDiagnosticHolder { + abstract override val source: KtSourceElement? + abstract override val name: Name + abstract override val candidateSymbol: FirBasedSymbol<*>? + abstract override val resolvedSymbol: FirBasedSymbol<*> + abstract override val diagnostic: ConeDiagnostic + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitResolvedErrorReference(this, data) + + @Suppress("UNCHECKED_CAST") + override fun transform(transformer: FirTransformer, data: D): E = + transformer.transformResolvedErrorReference(this, data) as E +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/builder/FirResolvedErrorReferenceBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/builder/FirResolvedErrorReferenceBuilder.kt new file mode 100644 index 00000000000..a0054c5d40a --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/builder/FirResolvedErrorReferenceBuilder.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2022 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. + */ + +@file:Suppress("DuplicatedCode") + +package org.jetbrains.kotlin.fir.references.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic +import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference +import org.jetbrains.kotlin.fir.references.impl.FirResolvedErrorReferenceImpl +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.visitors.* +import org.jetbrains.kotlin.name.Name + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +class FirResolvedErrorReferenceBuilder { + var source: KtSourceElement? = null + lateinit var name: Name + lateinit var resolvedSymbol: FirBasedSymbol<*> + lateinit var diagnostic: ConeDiagnostic + + fun build(): FirResolvedErrorReference { + return FirResolvedErrorReferenceImpl( + source, + name, + resolvedSymbol, + diagnostic, + ) + } + +} + +@OptIn(ExperimentalContracts::class) +inline fun buildResolvedErrorReference(init: FirResolvedErrorReferenceBuilder.() -> Unit): FirResolvedErrorReference { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirResolvedErrorReferenceBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/impl/FirResolvedErrorReferenceImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/impl/FirResolvedErrorReferenceImpl.kt new file mode 100644 index 00000000000..83ffdd7b398 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/references/impl/FirResolvedErrorReferenceImpl.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2022 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. + */ + +@file:Suppress("DuplicatedCode") + +package org.jetbrains.kotlin.fir.references.impl + +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic +import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +internal class FirResolvedErrorReferenceImpl( + override val source: KtSourceElement?, + override val name: Name, + override val resolvedSymbol: FirBasedSymbol<*>, + override val diagnostic: ConeDiagnostic, +) : FirResolvedErrorReference() { + override val candidateSymbol: FirBasedSymbol<*>? get() = null + + override fun acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirResolvedErrorReferenceImpl { + return this + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt index adfb98b9b2a..86196bc8104 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt @@ -130,6 +130,7 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference @@ -269,6 +270,8 @@ abstract class FirDefaultVisitor : FirVisitor() { override fun visitResolvedNamedReference(resolvedNamedReference: FirResolvedNamedReference, data: D): R = visitNamedReference(resolvedNamedReference, data) + override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: D): R = visitResolvedNamedReference(resolvedErrorReference, data) + override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): R = visitResolvedNamedReference(delegateFieldReference, data) override fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference, data: D): R = visitResolvedNamedReference(backingFieldReference, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt index 5de946adc2e..b5c57e62acd 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt @@ -130,6 +130,7 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference @@ -269,6 +270,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() { override fun visitResolvedNamedReference(resolvedNamedReference: FirResolvedNamedReference) = visitNamedReference(resolvedNamedReference) + override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference) = visitResolvedNamedReference(resolvedErrorReference) + override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) = visitResolvedNamedReference(delegateFieldReference) override fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference) = visitResolvedNamedReference(backingFieldReference) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index d12006e9b6f..02a99f4ffcf 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -130,6 +130,7 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference @@ -652,6 +653,10 @@ abstract class FirTransformer : FirVisitor() { return transformElement(resolvedNamedReference, data) } + open fun transformResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: D): FirReference { + return transformElement(resolvedErrorReference, data) + } + open fun transformDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): FirReference { return transformElement(delegateFieldReference, data) } @@ -1216,6 +1221,10 @@ abstract class FirTransformer : FirVisitor() { return transformResolvedNamedReference(resolvedNamedReference, data) } + final override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: D): FirReference { + return transformResolvedErrorReference(resolvedErrorReference, data) + } + final override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): FirReference { return transformDelegateFieldReference(delegateFieldReference, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index dffbe9243ff..f8fcfe814c4 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -130,6 +130,7 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference @@ -403,6 +404,8 @@ abstract class FirVisitor { open fun visitResolvedNamedReference(resolvedNamedReference: FirResolvedNamedReference, data: D): R = visitElement(resolvedNamedReference, data) + open fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: D): R = visitElement(resolvedErrorReference, data) + open fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): R = visitElement(delegateFieldReference, data) open fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference, data: D): R = visitElement(backingFieldReference, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index c935df45c33..079b9004d73 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -130,6 +130,7 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference @@ -651,6 +652,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(resolvedNamedReference) } + open fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference) { + visitElement(resolvedErrorReference) + } + open fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) { visitElement(delegateFieldReference) } @@ -1215,6 +1220,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitResolvedNamedReference(resolvedNamedReference) } + final override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: Nothing?) { + visitResolvedErrorReference(resolvedErrorReference) + } + final override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: Nothing?) { visitDelegateFieldReference(delegateFieldReference) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index a8af758a919..c8d1ea956d7 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -158,6 +158,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val controlFlowGraphReference by element(Reference, reference) val resolvedNamedReference by element(Reference, namedReference) + val resolvedErrorReference by element(Reference, resolvedNamedReference, diagnosticHolder) val delegateFieldReference by element(Reference, resolvedNamedReference) val backingFieldReference by element(Reference, resolvedNamedReference) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 92ca7a02bfc..0a9e609b40c 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -413,6 +413,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() publicImplementation() } + impl(resolvedErrorReference) { + defaultNull("candidateSymbol", withGetter = true) + } + impl(resolvedCallableReference) { defaultNull("candidateSymbol", withGetter = true) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/visitor.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/visitor.kt index 3fccbf4b63c..d3b29d1e183 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/visitor.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/visitor.kt @@ -5,12 +5,28 @@ package org.jetbrains.kotlin.fir.tree.generator.printer +import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.model.Element import org.jetbrains.kotlin.util.SmartPrinter import org.jetbrains.kotlin.util.withIndent import java.io.File +private val elementsWithMultipleSupertypesForDefaultVisitor = mapOf( + FirTreeBuilder.resolvedErrorReference to FirTreeBuilder.resolvedNamedReference +) + +private fun Element.isAcceptableForDefaultVisiting(): Boolean { + if (this == AbstractFirTreeBuilder.baseFirElement) return false + val hasSingleSupertype = parents.size == 1 && parents.single().name != "Element" + return hasSingleSupertype || this in elementsWithMultipleSupertypesForDefaultVisitor +} + +private fun Element.getNameOfSupertypeForDefaultVisiting(): String { + val parentForDefaultVisiting = parents.singleOrNull() ?: elementsWithMultipleSupertypesForDefaultVisitor.getValue(this) + return parentForDefaultVisiting.name +} + fun printVisitor(elements: List, generationPath: File, visitSuperTypeByDefault: Boolean): GeneratedFile { val className = if (visitSuperTypeByDefault) "FirDefaultVisitor" else "FirVisitor" val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/")) @@ -35,9 +51,8 @@ fun printVisitor(elements: List, generationPath: File, visitSuperTypeBy println("abstract fun visitElement(element: FirElement, data: D): R\n") } for (element in elements) { - if (element == AbstractFirTreeBuilder.baseFirElement || - visitSuperTypeByDefault && (element.parents.size != 1 || element.parents.single().name == "Element") - ) continue + if (element == AbstractFirTreeBuilder.baseFirElement) continue + if (visitSuperTypeByDefault && !element.isAcceptableForDefaultVisiting()) continue with(element) { val varName = safeDecapitalizedName if (visitSuperTypeByDefault) { @@ -47,7 +62,7 @@ fun printVisitor(elements: List, generationPath: File, visitSuperTypeBy } print(" fun ${typeParameters}visit$name($varName: $typeWithArguments, data: D): R${multipleUpperBoundsList()} = visit") if (visitSuperTypeByDefault) { - print(parents.single().name) + print(element.getNameOfSupertypeForDefaultVisiting()) } else { print("Element") } @@ -126,10 +141,10 @@ fun printDefaultVisitorVoid(elements: List, generationPath: File): Gene pushIndent() for (element in elements) { - if (element == AbstractFirTreeBuilder.baseFirElement || element.parents.size != 1 || element.parents.single().name == "Element") continue + if (!element.isAcceptableForDefaultVisiting()) continue with(element) { val varName = safeDecapitalizedName - println("override fun ${typeParameters}visit$name($varName: $typeWithArguments)${multipleUpperBoundsList()} = visit${parents.first().name}($varName)") + println("override fun ${typeParameters}visit$name($varName: $typeWithArguments)${multipleUpperBoundsList()} = visit${element.getNameOfSupertypeForDefaultVisiting()}($varName)") println() } }