[FIR] Add aliasSource to FirImport, FirImportImpl

This commit is contained in:
Ivan Kochurkin
2021-07-16 20:42:53 +03:00
committed by Space
parent 354a06b94a
commit f5d8535dc5
12 changed files with 25 additions and 4 deletions
@@ -169,10 +169,10 @@ class DeclarationsConverter(
} }
} }
private fun convertImportAlias(importAlias: LighterASTNode): String? { private fun convertImportAlias(importAlias: LighterASTNode): Pair<String, FirSourceElement>? {
importAlias.forEachChildren { importAlias.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
IDENTIFIER -> return it.asText IDENTIFIER -> return Pair(it.asText, it.toFirSourceElement())
} }
} }
@@ -186,11 +186,18 @@ class DeclarationsConverter(
var importedFqName: FqName? = null var importedFqName: FqName? = null
var isAllUnder = false var isAllUnder = false
var aliasName: String? = null var aliasName: String? = null
var aliasSource: FirSourceElement? = null
importDirective.forEachChildren { importDirective.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
DOT_QUALIFIED_EXPRESSION, REFERENCE_EXPRESSION -> importedFqName = FqName(it.asText) DOT_QUALIFIED_EXPRESSION, REFERENCE_EXPRESSION -> importedFqName = FqName(it.asText)
MUL -> isAllUnder = true MUL -> isAllUnder = true
IMPORT_ALIAS -> aliasName = convertImportAlias(it) IMPORT_ALIAS -> {
val importAlias = convertImportAlias(it)
if (importAlias != null) {
aliasName = importAlias.first
aliasSource = importAlias.second
}
}
} }
} }
@@ -199,6 +206,7 @@ class DeclarationsConverter(
this.importedFqName = importedFqName this.importedFqName = importedFqName
this.isAllUnder = isAllUnder this.isAllUnder = isAllUnder
this.aliasName = aliasName?.let { Name.identifier(it) } this.aliasName = aliasName?.let { Name.identifier(it) }
this.aliasSource = aliasSource
} }
} }
@@ -810,6 +810,7 @@ open class RawFirBuilder(
importedFqName = importDirective.importedFqName importedFqName = importDirective.importedFqName
isAllUnder = importDirective.isAllUnder isAllUnder = importDirective.isAllUnder
aliasName = importDirective.aliasName?.let { Name.identifier(it) } aliasName = importDirective.aliasName?.let { Name.identifier(it) }
aliasSource = importDirective.alias?.nameIdentifier?.toFirSourceElement()
} }
} }
for (declaration in file.declarations) { for (declaration in file.declarations) {
@@ -24,6 +24,7 @@ abstract class FirErrorImport : FirPureAbstractElement(), FirImport, FirDiagnost
abstract override val importedFqName: FqName? abstract override val importedFqName: FqName?
abstract override val isAllUnder: Boolean abstract override val isAllUnder: Boolean
abstract override val aliasName: Name? abstract override val aliasName: Name?
abstract override val aliasSource: FirSourceElement?
abstract override val diagnostic: ConeDiagnostic abstract override val diagnostic: ConeDiagnostic
abstract val delegate: FirImport abstract val delegate: FirImport
@@ -21,6 +21,7 @@ interface FirImport : FirElement {
val importedFqName: FqName? val importedFqName: FqName?
val isAllUnder: Boolean val isAllUnder: Boolean
val aliasName: Name? val aliasName: Name?
val aliasSource: FirSourceElement?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitImport(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitImport(this, data)
@@ -23,6 +23,7 @@ abstract class FirResolvedImport : FirPureAbstractElement(), FirImport {
abstract override val importedFqName: FqName? abstract override val importedFqName: FqName?
abstract override val isAllUnder: Boolean abstract override val isAllUnder: Boolean
abstract override val aliasName: Name? abstract override val aliasName: Name?
abstract override val aliasSource: FirSourceElement?
abstract val delegate: FirImport abstract val delegate: FirImport
abstract val packageFqName: FqName abstract val packageFqName: FqName
abstract val relativeClassName: FqName? abstract val relativeClassName: FqName?
@@ -23,15 +23,18 @@ import org.jetbrains.kotlin.name.Name
@FirBuilderDsl @FirBuilderDsl
class FirErrorImportBuilder { class FirErrorImportBuilder {
var aliasSource: FirSourceElement? = null
lateinit var diagnostic: ConeDiagnostic lateinit var diagnostic: ConeDiagnostic
lateinit var delegate: FirImport lateinit var delegate: FirImport
fun build(): FirErrorImport { fun build(): FirErrorImport {
return FirErrorImportImpl( return FirErrorImportImpl(
aliasSource,
diagnostic, diagnostic,
delegate, delegate,
) )
} }
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
@@ -26,6 +26,7 @@ class FirImportBuilder {
var importedFqName: FqName? = null var importedFqName: FqName? = null
var isAllUnder: Boolean by kotlin.properties.Delegates.notNull<Boolean>() var isAllUnder: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
var aliasName: Name? = null var aliasName: Name? = null
var aliasSource: FirSourceElement? = null
fun build(): FirImport { fun build(): FirImport {
return FirImportImpl( return FirImportImpl(
@@ -33,6 +34,7 @@ class FirImportBuilder {
importedFqName, importedFqName,
isAllUnder, isAllUnder,
aliasName, aliasName,
aliasSource,
) )
} }
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.visitors.*
*/ */
internal class FirErrorImportImpl( internal class FirErrorImportImpl(
override val aliasSource: FirSourceElement?,
override val diagnostic: ConeDiagnostic, override val diagnostic: ConeDiagnostic,
override var delegate: FirImport, override var delegate: FirImport,
) : FirErrorImport() { ) : FirErrorImport() {
@@ -22,6 +22,7 @@ internal class FirImportImpl(
override val importedFqName: FqName?, override val importedFqName: FqName?,
override val isAllUnder: Boolean, override val isAllUnder: Boolean,
override val aliasName: Name?, override val aliasName: Name?,
override val aliasSource: FirSourceElement?,
) : FirPureAbstractElement(), FirImport { ) : FirPureAbstractElement(), FirImport {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {} override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
@@ -27,6 +27,7 @@ internal class FirResolvedImportImpl(
override val importedFqName: FqName? get() = delegate.importedFqName override val importedFqName: FqName? get() = delegate.importedFqName
override val isAllUnder: Boolean get() = delegate.isAllUnder override val isAllUnder: Boolean get() = delegate.isAllUnder
override val aliasName: Name? get() = delegate.aliasName override val aliasName: Name? get() = delegate.aliasName
override val aliasSource: FirSourceElement? get() = delegate.aliasSource
override val resolvedClassId: ClassId? get() = relativeClassName?.let { ClassId(packageFqName, it, false) } override val resolvedClassId: ClassId? get() = relativeClassName?.let { ClassId(packageFqName, it, false) }
override val importedName: Name? get() = importedFqName?.shortName() override val importedName: Name? get() = importedFqName?.shortName()
@@ -45,7 +45,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
impl(import) impl(import)
impl(resolvedImport) { impl(resolvedImport) {
delegateFields(listOf("aliasName", "importedFqName", "isAllUnder"), "delegate") delegateFields(listOf("aliasName", "aliasSource", "importedFqName", "isAllUnder"), "delegate")
default("source") { default("source") {
delegate = "delegate" delegate = "delegate"
@@ -407,6 +407,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("importedFqName", fqNameType, nullable = true) +field("importedFqName", fqNameType, nullable = true)
+booleanField("isAllUnder") +booleanField("isAllUnder")
+field("aliasName", nameType, nullable = true) +field("aliasName", nameType, nullable = true)
+field("aliasSource", sourceElementType, nullable = true)
} }
resolvedImport.configure { resolvedImport.configure {