[FIR] Introduce FirResolvedErrorReference node

This commit is contained in:
Dmitriy Novozhilov
2022-12-08 18:25:12 +02:00
committed by Space Team
parent db5913bbb6
commit 9e4e5eed68
11 changed files with 170 additions and 6 deletions
@@ -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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedErrorReference(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformResolvedErrorReference(this, data) as E
}
@@ -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()
}
@@ -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 <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirResolvedErrorReferenceImpl {
return this
}
}
@@ -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<out R, in D> : FirVisitor<R, D>() {
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)
@@ -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)
@@ -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<in D> : FirVisitor<FirElement, D>() {
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<in D> : FirVisitor<FirElement, D>() {
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)
}
@@ -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<out R, in D> {
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)
@@ -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<Unit, Nothing?>() {
visitElement(resolvedNamedReference)
}
open fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference) {
visitElement(resolvedErrorReference)
}
open fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) {
visitElement(delegateFieldReference)
}
@@ -1215,6 +1220,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitResolvedNamedReference(resolvedNamedReference)
}
final override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: Nothing?) {
visitResolvedErrorReference(resolvedErrorReference)
}
final override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: Nothing?) {
visitDelegateFieldReference(delegateFieldReference)
}
@@ -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)
@@ -413,6 +413,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
publicImplementation()
}
impl(resolvedErrorReference) {
defaultNull("candidateSymbol", withGetter = true)
}
impl(resolvedCallableReference) {
defaultNull("candidateSymbol", withGetter = true)
}
@@ -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<Element>, 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<Element>, 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<Element>, 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<Element>, 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()
}
}