FIR: introduce package directive

The package directive is needed for KtElement -> FirElement mapping in IDE.
There should be some FirElement which will be result of mapping of elements
inside KtPackageDirective.
This commit is contained in:
Ilya Kirillov
2021-06-18 15:05:13 +02:00
committed by TeamCityServer
parent bf40c07cc3
commit 51576c70b6
21 changed files with 165 additions and 28 deletions
@@ -112,6 +112,7 @@ internal object FileDiagnosticRetriever : FileStructureElementDiagnosticRetrieve
withSuppressedDiagnostics(file) {
visitWithDeclaration(file) {
file.annotations.forEach { it.accept(this, data) }
file.packageDirective.accept(this, data)
file.imports.forEach { it.accept(this, data) }
// do not visit declarations here
}
@@ -6,9 +6,7 @@
package org.jetbrains.kotlin.idea.references
import com.intellij.psi.tree.TokenSet
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
@@ -17,7 +15,6 @@ import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertySymbol
@@ -46,7 +43,6 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector
import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability
import org.jetbrains.kotlin.utils.addIfNotNull
@@ -184,7 +180,8 @@ internal object FirReferenceResolveHelper {
getSymbolsForResolvedQualifier(fir, expression, session, symbolBuilder)
is FirAnnotationCall -> getSymbolsForAnnotationCall(fir, session, symbolBuilder)
is FirResolvedImport -> getSymbolsByResolvedImport(expression, symbolBuilder, fir, session)
is FirFile -> getSymbolsByFirFile(expression, symbolBuilder, fir)
is FirPackageDirective -> getSymbolsForPackageDirective(expression, symbolBuilder)
is FirFile -> getSymbolsByFirFile(symbolBuilder, fir)
is FirArrayOfCall -> {
// We can't yet find PsiElement for arrayOf, intArrayOf, etc.
emptyList()
@@ -199,6 +196,14 @@ internal object FirReferenceResolveHelper {
}
}
private fun getSymbolsForPackageDirective(
expression: KtSimpleNameExpression,
symbolBuilder: KtSymbolByFirBuilder
): List<KtFirPackageSymbol> {
return listOfNotNull(getPackageSymbolFor(expression, symbolBuilder, forQualifiedType = false))
}
private fun getSymbolByResolvedNameReference(
fir: FirResolvedNamedReference,
session: FirSession,
@@ -319,14 +324,9 @@ internal object FirReferenceResolveHelper {
}
private fun getSymbolsByFirFile(
expression: KtSimpleNameExpression,
symbolBuilder: KtSymbolByFirBuilder,
fir: FirFile
): List<KtSymbol> {
if (expression.getNonStrictParentOfType<KtPackageDirective>() != null) {
// Special: package reference in the middle of package directive
return listOfNotNull(getPackageSymbolFor(expression, symbolBuilder, forQualifiedType = false))
}
return listOf(symbolBuilder.buildSymbol(fir))
}