[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.FirThisReference
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference 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.FirDelegateFieldReference
import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference 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 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 visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): R = visitResolvedNamedReference(delegateFieldReference, data)
override fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference, data: D): R = visitResolvedNamedReference(backingFieldReference, 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.FirThisReference
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference 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.FirDelegateFieldReference
import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference
@@ -269,6 +270,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitResolvedNamedReference(resolvedNamedReference: FirResolvedNamedReference) = visitNamedReference(resolvedNamedReference) override fun visitResolvedNamedReference(resolvedNamedReference: FirResolvedNamedReference) = visitNamedReference(resolvedNamedReference)
override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference) = visitResolvedNamedReference(resolvedErrorReference)
override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) = visitResolvedNamedReference(delegateFieldReference) override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) = visitResolvedNamedReference(delegateFieldReference)
override fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference) = visitResolvedNamedReference(backingFieldReference) 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.FirThisReference
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference 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.FirDelegateFieldReference
import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference
@@ -652,6 +653,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(resolvedNamedReference, data) return transformElement(resolvedNamedReference, data)
} }
open fun transformResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: D): FirReference {
return transformElement(resolvedErrorReference, data)
}
open fun transformDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): FirReference { open fun transformDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): FirReference {
return transformElement(delegateFieldReference, data) return transformElement(delegateFieldReference, data)
} }
@@ -1216,6 +1221,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformResolvedNamedReference(resolvedNamedReference, data) 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 { final override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): FirReference {
return transformDelegateFieldReference(delegateFieldReference, data) 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.FirThisReference
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference 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.FirDelegateFieldReference
import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference 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 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 visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: D): R = visitElement(delegateFieldReference, data)
open fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference, data: D): R = visitElement(backingFieldReference, 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.FirThisReference
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference 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.FirDelegateFieldReference
import org.jetbrains.kotlin.fir.references.FirBackingFieldReference import org.jetbrains.kotlin.fir.references.FirBackingFieldReference
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference
@@ -651,6 +652,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(resolvedNamedReference) visitElement(resolvedNamedReference)
} }
open fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference) {
visitElement(resolvedErrorReference)
}
open fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) { open fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference) {
visitElement(delegateFieldReference) visitElement(delegateFieldReference)
} }
@@ -1215,6 +1220,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitResolvedNamedReference(resolvedNamedReference) visitResolvedNamedReference(resolvedNamedReference)
} }
final override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: Nothing?) {
visitResolvedErrorReference(resolvedErrorReference)
}
final override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: Nothing?) { final override fun visitDelegateFieldReference(delegateFieldReference: FirDelegateFieldReference, data: Nothing?) {
visitDelegateFieldReference(delegateFieldReference) visitDelegateFieldReference(delegateFieldReference)
} }
@@ -158,6 +158,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val controlFlowGraphReference by element(Reference, reference) val controlFlowGraphReference by element(Reference, reference)
val resolvedNamedReference by element(Reference, namedReference) val resolvedNamedReference by element(Reference, namedReference)
val resolvedErrorReference by element(Reference, resolvedNamedReference, diagnosticHolder)
val delegateFieldReference by element(Reference, resolvedNamedReference) val delegateFieldReference by element(Reference, resolvedNamedReference)
val backingFieldReference by element(Reference, resolvedNamedReference) val backingFieldReference by element(Reference, resolvedNamedReference)
@@ -413,6 +413,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
publicImplementation() publicImplementation()
} }
impl(resolvedErrorReference) {
defaultNull("candidateSymbol", withGetter = true)
}
impl(resolvedCallableReference) { impl(resolvedCallableReference) {
defaultNull("candidateSymbol", withGetter = true) defaultNull("candidateSymbol", withGetter = true)
} }
@@ -5,12 +5,28 @@
package org.jetbrains.kotlin.fir.tree.generator.printer 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.context.AbstractFirTreeBuilder
import org.jetbrains.kotlin.fir.tree.generator.model.Element import org.jetbrains.kotlin.fir.tree.generator.model.Element
import org.jetbrains.kotlin.util.SmartPrinter import org.jetbrains.kotlin.util.SmartPrinter
import org.jetbrains.kotlin.util.withIndent import org.jetbrains.kotlin.util.withIndent
import java.io.File 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 { fun printVisitor(elements: List<Element>, generationPath: File, visitSuperTypeByDefault: Boolean): GeneratedFile {
val className = if (visitSuperTypeByDefault) "FirDefaultVisitor" else "FirVisitor" val className = if (visitSuperTypeByDefault) "FirDefaultVisitor" else "FirVisitor"
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/")) 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") println("abstract fun visitElement(element: FirElement, data: D): R\n")
} }
for (element in elements) { for (element in elements) {
if (element == AbstractFirTreeBuilder.baseFirElement || if (element == AbstractFirTreeBuilder.baseFirElement) continue
visitSuperTypeByDefault && (element.parents.size != 1 || element.parents.single().name == "Element") if (visitSuperTypeByDefault && !element.isAcceptableForDefaultVisiting()) continue
) continue
with(element) { with(element) {
val varName = safeDecapitalizedName val varName = safeDecapitalizedName
if (visitSuperTypeByDefault) { 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") print(" fun ${typeParameters}visit$name($varName: $typeWithArguments, data: D): R${multipleUpperBoundsList()} = visit")
if (visitSuperTypeByDefault) { if (visitSuperTypeByDefault) {
print(parents.single().name) print(element.getNameOfSupertypeForDefaultVisiting())
} else { } else {
print("Element") print("Element")
} }
@@ -126,10 +141,10 @@ fun printDefaultVisitorVoid(elements: List<Element>, generationPath: File): Gene
pushIndent() pushIndent()
for (element in elements) { for (element in elements) {
if (element == AbstractFirTreeBuilder.baseFirElement || element.parents.size != 1 || element.parents.single().name == "Element") continue if (!element.isAcceptableForDefaultVisiting()) continue
with(element) { with(element) {
val varName = safeDecapitalizedName 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() println()
} }
} }