[FIR] Enhance diagnostic DSL to be able to use concrete factories

Before this commit, things like DiagnosticFactory0<KtDeclaration>
were effectively unusable.
This commit is contained in:
Mikhail Glukhikh
2020-03-25 14:43:44 +03:00
parent a1d81aa15f
commit 2f63c8a46a
10 changed files with 142 additions and 123 deletions
@@ -21,7 +21,7 @@ sealed class FirSourceElement {
abstract val endOffset: Int
}
class FirPsiSourceElement(val psi: PsiElement) : FirSourceElement() {
class FirPsiSourceElement<P : PsiElement>(val psi: P) : FirSourceElement() {
override val elementType: IElementType
get() = psi.node.elementType
@@ -42,19 +42,19 @@ class FirLightSourceElement(
get() = element.tokenType
}
val FirSourceElement?.psi: PsiElement? get() = (this as? FirPsiSourceElement)?.psi
val FirSourceElement?.psi: PsiElement? get() = (this as? FirPsiSourceElement<*>)?.psi
val FirElement.psi: PsiElement? get() = (source as? FirPsiSourceElement)?.psi
val FirElement.psi: PsiElement? get() = (source as? FirPsiSourceElement<*>)?.psi
@Suppress("NOTHING_TO_INLINE")
inline fun PsiElement.toFirSourceElement(): FirPsiSourceElement = FirPsiSourceElement(this)
inline fun PsiElement.toFirSourceElement(): FirPsiSourceElement<*> = FirPsiSourceElement(this)
val FirSourceElement?.lightNode: LighterASTNode? get() = (this as? FirLightSourceElement)?.element
fun FirSourceElement?.getModifierList(): FirModifierList? {
return when (this) {
null -> null
is FirPsiSourceElement -> (psi as? KtModifierListOwner)?.modifierList?.let { FirPsiModifierList(it) }
is FirPsiSourceElement<*> -> (psi as? KtModifierListOwner)?.modifierList?.let { FirPsiModifierList(it) }
is FirLightSourceElement -> {
val kidsRef = Ref<Array<LighterASTNode?>>()
tree.getChildren(element, kidsRef)