[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 {
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 isAllUnder = false
var aliasName: String? = null
var aliasSource: FirSourceElement? = null
importDirective.forEachChildren {
when (it.tokenType) {
DOT_QUALIFIED_EXPRESSION, REFERENCE_EXPRESSION -> importedFqName = FqName(it.asText)
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.isAllUnder = isAllUnder
this.aliasName = aliasName?.let { Name.identifier(it) }
this.aliasSource = aliasSource
}
}
@@ -810,6 +810,7 @@ open class RawFirBuilder(
importedFqName = importDirective.importedFqName
isAllUnder = importDirective.isAllUnder
aliasName = importDirective.aliasName?.let { Name.identifier(it) }
aliasSource = importDirective.alias?.nameIdentifier?.toFirSourceElement()
}
}
for (declaration in file.declarations) {
@@ -24,6 +24,7 @@ abstract class FirErrorImport : FirPureAbstractElement(), FirImport, FirDiagnost
abstract override val importedFqName: FqName?
abstract override val isAllUnder: Boolean
abstract override val aliasName: Name?
abstract override val aliasSource: FirSourceElement?
abstract override val diagnostic: ConeDiagnostic
abstract val delegate: FirImport
@@ -21,6 +21,7 @@ interface FirImport : FirElement {
val importedFqName: FqName?
val isAllUnder: Boolean
val aliasName: Name?
val aliasSource: FirSourceElement?
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 isAllUnder: Boolean
abstract override val aliasName: Name?
abstract override val aliasSource: FirSourceElement?
abstract val delegate: FirImport
abstract val packageFqName: FqName
abstract val relativeClassName: FqName?
@@ -23,15 +23,18 @@ import org.jetbrains.kotlin.name.Name
@FirBuilderDsl
class FirErrorImportBuilder {
var aliasSource: FirSourceElement? = null
lateinit var diagnostic: ConeDiagnostic
lateinit var delegate: FirImport
fun build(): FirErrorImport {
return FirErrorImportImpl(
aliasSource,
diagnostic,
delegate,
)
}
}
@OptIn(ExperimentalContracts::class)
@@ -26,6 +26,7 @@ class FirImportBuilder {
var importedFqName: FqName? = null
var isAllUnder: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
var aliasName: Name? = null
var aliasSource: FirSourceElement? = null
fun build(): FirImport {
return FirImportImpl(
@@ -33,6 +34,7 @@ class FirImportBuilder {
importedFqName,
isAllUnder,
aliasName,
aliasSource,
)
}
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.visitors.*
*/
internal class FirErrorImportImpl(
override val aliasSource: FirSourceElement?,
override val diagnostic: ConeDiagnostic,
override var delegate: FirImport,
) : FirErrorImport() {
@@ -22,6 +22,7 @@ internal class FirImportImpl(
override val importedFqName: FqName?,
override val isAllUnder: Boolean,
override val aliasName: Name?,
override val aliasSource: FirSourceElement?,
) : FirPureAbstractElement(), FirImport {
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 isAllUnder: Boolean get() = delegate.isAllUnder
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 importedName: Name? get() = importedFqName?.shortName()
@@ -45,7 +45,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
impl(import)
impl(resolvedImport) {
delegateFields(listOf("aliasName", "importedFqName", "isAllUnder"), "delegate")
delegateFields(listOf("aliasName", "aliasSource", "importedFqName", "isAllUnder"), "delegate")
default("source") {
delegate = "delegate"
@@ -407,6 +407,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field("importedFqName", fqNameType, nullable = true)
+booleanField("isAllUnder")
+field("aliasName", nameType, nullable = true)
+field("aliasSource", sourceElementType, nullable = true)
}
resolvedImport.configure {