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
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.argumentMapping import org.jetbrains.kotlin.fir.expressions.argumentMapping
import org.jetbrains.kotlin.fir.packageFqName
import org.jetbrains.kotlin.fir.resolve.fqName import org.jetbrains.kotlin.fir.resolve.fqName
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic
import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.packageFqName
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.signaturer.FirMangler import org.jetbrains.kotlin.fir.signaturer.FirMangler
@@ -7,12 +7,9 @@ package org.jetbrains.kotlin.fir.java
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirVisibilityChecker
import org.jetbrains.kotlin.fir.NoMutableState
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.getOwnerId
import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
@@ -90,10 +90,13 @@ class DeclarationsConverter(
val importList = mutableListOf<FirImport>() val importList = mutableListOf<FirImport>()
val firDeclarationList = mutableListOf<FirDeclaration>() val firDeclarationList = mutableListOf<FirDeclaration>()
context.packageFqName = FqName.ROOT context.packageFqName = FqName.ROOT
var packageDirective: FirPackageDirective? = null
file.forEachChildren { file.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
FILE_ANNOTATION_LIST -> fileAnnotationList += convertFileAnnotationList(it) FILE_ANNOTATION_LIST -> fileAnnotationList += convertFileAnnotationList(it)
PACKAGE_DIRECTIVE -> context.packageFqName = convertPackageName(it) PACKAGE_DIRECTIVE -> {
packageDirective = convertPackageDirective(it).also { context.packageFqName = it.packageFqName }
}
IMPORT_LIST -> importList += convertImportDirectives(it) IMPORT_LIST -> importList += convertImportDirectives(it)
CLASS -> firDeclarationList += convertClass(it) CLASS -> firDeclarationList += convertClass(it)
FUN -> firDeclarationList += convertFunctionDeclaration(it) as FirDeclaration FUN -> firDeclarationList += convertFunctionDeclaration(it) as FirDeclaration
@@ -108,7 +111,7 @@ class DeclarationsConverter(
origin = FirDeclarationOrigin.Source origin = FirDeclarationOrigin.Source
moduleData = baseModuleData moduleData = baseModuleData
name = fileName name = fileName
packageFqName = context.packageFqName this.packageDirective = packageDirective ?: buildPackageDirective { packageFqName = context.packageFqName }
annotations += fileAnnotationList annotations += fileAnnotationList
imports += importList imports += importList
declarations += firDeclarationList declarations += firDeclarationList
@@ -151,7 +154,7 @@ class DeclarationsConverter(
/** /**
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parsePackageName * @see org.jetbrains.kotlin.parsing.KotlinParsing.parsePackageName
*/ */
private fun convertPackageName(packageNode: LighterASTNode): FqName { private fun convertPackageDirective(packageNode: LighterASTNode): FirPackageDirective {
var packageName: FqName = FqName.ROOT var packageName: FqName = FqName.ROOT
packageNode.forEachChildren { packageNode.forEachChildren {
when (it.tokenType) { when (it.tokenType) {
@@ -159,7 +162,10 @@ class DeclarationsConverter(
DOT_QUALIFIED_EXPRESSION, REFERENCE_EXPRESSION -> packageName = FqName(it.getAsStringWithoutBacktick()) DOT_QUALIFIED_EXPRESSION, REFERENCE_EXPRESSION -> packageName = FqName(it.getAsStringWithoutBacktick())
} }
} }
return packageName return buildPackageDirective {
packageFqName = packageName
source = packageNode.toFirSourceElement()
}
} }
private fun convertImportAlias(importAlias: LighterASTNode): String? { private fun convertImportAlias(importAlias: LighterASTNode): String? {
@@ -740,7 +740,10 @@ open class RawFirBuilder(
moduleData = baseModuleData moduleData = baseModuleData
origin = FirDeclarationOrigin.Source origin = FirDeclarationOrigin.Source
name = file.name name = file.name
packageFqName = context.packageFqName packageDirective = buildPackageDirective {
packageFqName = context.packageFqName
source = file.packageDirective?.toFirPsiSourceElement()
}
for (annotationEntry in file.annotationEntries) { for (annotationEntry in file.annotationEntries) {
annotations += annotationEntry.convert<FirAnnotationCall>() annotations += annotationEntry.convert<FirAnnotationCall>()
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.packageFqName
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2021 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
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirPackageDirective : FirPureAbstractElement(), FirElement {
abstract override val source: FirSourceElement?
abstract val packageFqName: FqName
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitPackageDirective(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformPackageDirective(this, data) as E
}
@@ -0,0 +1,41 @@
/*
* Copyright 2010-2021 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.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.impl.FirPackageDirectiveImpl
import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.name.FqName
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
class FirPackageDirectiveBuilder {
var source: FirSourceElement? = null
lateinit var packageFqName: FqName
fun build(): FirPackageDirective {
return FirPackageDirectiveImpl(
source,
packageFqName,
)
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildPackageDirective(init: FirPackageDirectiveBuilder.() -> Unit): FirPackageDirective {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
return FirPackageDirectiveBuilder().apply(init).build()
}
@@ -7,10 +7,10 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
/* /*
@@ -25,10 +25,10 @@ abstract class FirFile : FirAnnotatedDeclaration() {
abstract override val origin: FirDeclarationOrigin abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotationCall> abstract override val annotations: List<FirAnnotationCall>
abstract val packageDirective: FirPackageDirective
abstract val imports: List<FirImport> abstract val imports: List<FirImport>
abstract val declarations: List<FirDeclaration> abstract val declarations: List<FirDeclaration>
abstract val name: String abstract val name: String
abstract val packageFqName: FqName
abstract override val symbol: FirFileSymbol abstract override val symbol: FirFileSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitFile(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitFile(this, data)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.declarations.builder
import kotlin.contracts.* import kotlin.contracts.*
import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
@@ -20,7 +21,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirFileImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.name.FqName
/* /*
* This file was generated automatically * This file was generated automatically
@@ -35,10 +35,10 @@ class FirFileBuilder : FirAnnotationContainerBuilder {
lateinit var origin: FirDeclarationOrigin lateinit var origin: FirDeclarationOrigin
var attributes: FirDeclarationAttributes = FirDeclarationAttributes() var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
override val annotations: MutableList<FirAnnotationCall> = mutableListOf() override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
lateinit var packageDirective: FirPackageDirective
val imports: MutableList<FirImport> = mutableListOf() val imports: MutableList<FirImport> = mutableListOf()
val declarations: MutableList<FirDeclaration> = mutableListOf() val declarations: MutableList<FirDeclaration> = mutableListOf()
lateinit var name: String lateinit var name: String
lateinit var packageFqName: FqName
override fun build(): FirFile { override fun build(): FirFile {
return FirFileImpl( return FirFileImpl(
@@ -48,10 +48,10 @@ class FirFileBuilder : FirAnnotationContainerBuilder {
origin, origin,
attributes, attributes,
annotations, annotations,
packageDirective,
imports, imports,
declarations, declarations,
name, name,
packageFqName,
) )
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
@@ -15,7 +16,6 @@ import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
/* /*
@@ -30,10 +30,10 @@ internal class FirFileImpl(
override val origin: FirDeclarationOrigin, override val origin: FirDeclarationOrigin,
override val attributes: FirDeclarationAttributes, override val attributes: FirDeclarationAttributes,
override val annotations: MutableList<FirAnnotationCall>, override val annotations: MutableList<FirAnnotationCall>,
override var packageDirective: FirPackageDirective,
override val imports: MutableList<FirImport>, override val imports: MutableList<FirImport>,
override val declarations: MutableList<FirDeclaration>, override val declarations: MutableList<FirDeclaration>,
override val name: String, override val name: String,
override val packageFqName: FqName,
) : FirFile() { ) : FirFile() {
override val symbol: FirFileSymbol = FirFileSymbol() override val symbol: FirFileSymbol = FirFileSymbol()
@@ -43,12 +43,14 @@ internal class FirFileImpl(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) } annotations.forEach { it.accept(visitor, data) }
packageDirective.accept(visitor, data)
imports.forEach { it.accept(visitor, data) } imports.forEach { it.accept(visitor, data) }
declarations.forEach { it.accept(visitor, data) } declarations.forEach { it.accept(visitor, data) }
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirFileImpl { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirFileImpl {
transformAnnotations(transformer, data) transformAnnotations(transformer, data)
packageDirective = packageDirective.transform(transformer, data)
transformImports(transformer, data) transformImports(transformer, data)
transformDeclarations(transformer, data) transformDeclarations(transformer, data)
return this return this
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2021 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.impl
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
internal class FirPackageDirectiveImpl(
override val source: FirSourceElement?,
override val packageFqName: FqName,
) : FirPackageDirective() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirPackageDirectiveImpl {
return this
}
}
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
@@ -291,6 +292,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(file, data) return transformElement(file, data)
} }
open fun transformPackageDirective(packageDirective: FirPackageDirective, data: D): FirPackageDirective {
return transformElement(packageDirective, data)
}
open fun transformAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: D): FirStatement { open fun transformAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: D): FirStatement {
return transformElement(anonymousFunction, data) return transformElement(anonymousFunction, data)
} }
@@ -803,6 +808,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformFile(file, data) return transformFile(file, data)
} }
final override fun visitPackageDirective(packageDirective: FirPackageDirective, data: D): FirPackageDirective {
return transformPackageDirective(packageDirective, data)
}
final override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: D): FirStatement { final override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: D): FirStatement {
return transformAnonymousFunction(anonymousFunction, data) return transformAnonymousFunction(anonymousFunction, data)
} }
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
@@ -216,6 +217,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitFile(file: FirFile, data: D): R = visitElement(file, data) open fun visitFile(file: FirFile, data: D): R = visitElement(file, data)
open fun visitPackageDirective(packageDirective: FirPackageDirective, data: D): R = visitElement(packageDirective, data)
open fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: D): R = visitElement(anonymousFunction, data) open fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: D): R = visitElement(anonymousFunction, data)
open fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression, data: D): R = visitElement(anonymousFunctionExpression, data) open fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression, data: D): R = visitElement(anonymousFunctionExpression, data)
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
@@ -290,6 +291,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(file) visitElement(file)
} }
open fun visitPackageDirective(packageDirective: FirPackageDirective) {
visitElement(packageDirective)
}
open fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) { open fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
visitElement(anonymousFunction) visitElement(anonymousFunction)
} }
@@ -802,6 +807,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitFile(file) visitFile(file)
} }
final override fun visitPackageDirective(packageDirective: FirPackageDirective, data: Nothing?) {
visitPackageDirective(packageDirective)
}
final override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Nothing?) { final override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Nothing?) {
visitAnonymousFunction(anonymousFunction) visitAnonymousFunction(anonymousFunction)
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.types.FirDynamicTypeRef import org.jetbrains.kotlin.fir.types.FirDynamicTypeRef
@@ -14,6 +15,7 @@ import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.builder.* import org.jetbrains.kotlin.fir.types.builder.*
import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.name.FqName
fun ModuleInfo.dependenciesWithoutSelf(): Sequence<ModuleInfo> = dependencies().asSequence().filter { it != this } fun ModuleInfo.dependenciesWithoutSelf(): Sequence<ModuleInfo> = dependencies().asSequence().filter { it != this }
@@ -87,3 +89,6 @@ fun FirSourceElement.getWholeQualifierSourceIfPossible(stepsToWholeQualifier: In
} }
} }
} }
val FirFile.packageFqName: FqName
get() = packageDirective.packageFqName
@@ -56,6 +56,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val propertyAccessor = element("PropertyAccessor", Declaration, function, contractDescriptionOwner, typeParametersOwner) val propertyAccessor = element("PropertyAccessor", Declaration, function, contractDescriptionOwner, typeParametersOwner)
val constructor = element("Constructor", Declaration, function, typeParameterRefsOwner) val constructor = element("Constructor", Declaration, function, typeParameterRefsOwner)
val file = element("File", Declaration, annotatedDeclaration) val file = element("File", Declaration, annotatedDeclaration)
val packageDirective = element("PackageDirective", Other)
val anonymousFunction = element("AnonymousFunction", Declaration, function, typeParametersOwner) val anonymousFunction = element("AnonymousFunction", Declaration, function, typeParametersOwner)
val anonymousFunctionExpression = element("AnonymousFunctionExpression", Expression, expression) val anonymousFunctionExpression = element("AnonymousFunctionExpression", Expression, expression)
@@ -389,13 +389,17 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
} }
file.configure { file.configure {
+field("packageDirective", packageDirective)
+fieldList(import).withTransform() +fieldList(import).withTransform()
+declarations.withTransform() +declarations.withTransform()
+stringField("name") +stringField("name")
+field("packageFqName", fqNameType)
+symbol("FirFileSymbol") +symbol("FirFileSymbol")
} }
packageDirective.configure {
+field("packageFqName", fqNameType)
}
import.configure { import.configure {
+field("importedFqName", fqNameType, nullable = true) +field("importedFqName", fqNameType, nullable = true)
+booleanField("isAllUnder") +booleanField("isAllUnder")
@@ -112,6 +112,7 @@ internal object FileDiagnosticRetriever : FileStructureElementDiagnosticRetrieve
withSuppressedDiagnostics(file) { withSuppressedDiagnostics(file) {
visitWithDeclaration(file) { visitWithDeclaration(file) {
file.annotations.forEach { it.accept(this, data) } file.annotations.forEach { it.accept(this, data) }
file.packageDirective.accept(this, data)
file.imports.forEach { it.accept(this, data) } file.imports.forEach { it.accept(this, data) }
// do not visit declarations here // do not visit declarations here
} }
@@ -6,9 +6,7 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.psi.tree.TokenSet import com.intellij.psi.tree.TokenSet
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.buildImport import org.jetbrains.kotlin.fir.declarations.builder.buildImport
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty 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.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.declarations.utils.isStatic
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertySymbol 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.name.FqName
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType 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.getQualifiedExpressionForSelector
import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
@@ -184,7 +180,8 @@ internal object FirReferenceResolveHelper {
getSymbolsForResolvedQualifier(fir, expression, session, symbolBuilder) getSymbolsForResolvedQualifier(fir, expression, session, symbolBuilder)
is FirAnnotationCall -> getSymbolsForAnnotationCall(fir, session, symbolBuilder) is FirAnnotationCall -> getSymbolsForAnnotationCall(fir, session, symbolBuilder)
is FirResolvedImport -> getSymbolsByResolvedImport(expression, symbolBuilder, fir, session) 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 -> { is FirArrayOfCall -> {
// We can't yet find PsiElement for arrayOf, intArrayOf, etc. // We can't yet find PsiElement for arrayOf, intArrayOf, etc.
emptyList() 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( private fun getSymbolByResolvedNameReference(
fir: FirResolvedNamedReference, fir: FirResolvedNamedReference,
session: FirSession, session: FirSession,
@@ -319,14 +324,9 @@ internal object FirReferenceResolveHelper {
} }
private fun getSymbolsByFirFile( private fun getSymbolsByFirFile(
expression: KtSimpleNameExpression,
symbolBuilder: KtSymbolByFirBuilder, symbolBuilder: KtSymbolByFirBuilder,
fir: FirFile fir: FirFile
): List<KtSymbol> { ): 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)) return listOf(symbolBuilder.buildSymbol(fir))
} }
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.extensions.FirDeclarationGenerationExtension
import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate
import org.jetbrains.kotlin.fir.extensions.predicate.has import org.jetbrains.kotlin.fir.extensions.predicate.has
import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.packageFqName
import org.jetbrains.kotlin.fir.plugin.fqn import org.jetbrains.kotlin.fir.plugin.fqn
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.GeneratedClass import org.jetbrains.kotlin.fir.resolve.transformers.plugin.GeneratedClass
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol