diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt index 9dc238c1085..c03fc05054f 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/file/structure/FileStructure.kt @@ -123,10 +123,10 @@ internal class FileStructure( val firFile = firFileBuilder.getFirFileResolvedToPhaseWithCaching( container, moduleFileCache, - //TODO: Make resolve whole file into TYPES only for top level declarations or annotations with `file` site - FirResolvePhase.TYPES, + FirResolvePhase.IMPORTS, checkPCE = true ) + firLazyDeclarationResolver.resolveFileAnnotations(firFile, moduleFileCache) RootStructureElement( firFile, container, diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt index f4ecea8c0a9..c631bb6bdf9 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/lazy/resolve/FirLazyDeclarationResolver.kt @@ -18,16 +18,27 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.getNonLocalCo import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider -import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignatedBodyResolveTransformerForIDE +import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.* import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignatedContractsResolveTransformerForIDE import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignatedImplicitTypesTransformerForIDE -import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirDesignation +import org.jetbrains.kotlin.idea.fir.low.level.api.trasformers.FirFileAnnotationsResolveTransformer import org.jetbrains.kotlin.idea.fir.low.level.api.util.* import org.jetbrains.kotlin.psi.* internal class FirLazyDeclarationResolver( private val firFileBuilder: FirFileBuilder ) { + fun resolveFileAnnotations( + firFile: FirFile, + moduleFileCache: ModuleFileCache, + scopeSession: ScopeSession = ScopeSession() + ) { + firFileBuilder.runCustomResolveUnderLock(firFile, moduleFileCache) { + val transformer = FirFileAnnotationsResolveTransformer(firFile.session, scopeSession) + firFile.accept(transformer, ResolutionMode.ContextDependent) + } + } + fun lazyResolveDeclaration( declaration: FirDeclaration, moduleFileCache: ModuleFileCache, @@ -116,7 +127,7 @@ internal class FirLazyDeclarationResolver( ) } if (toPhase <= nonLazyPhase) return - + resolveFileAnnotations(containerFirFile, moduleFileCache) val nonLocalDeclarationToResolve = firDeclarationToResolve.getNonLocalDeclarationToResolve(provider, moduleFileCache) val designation = nonLocalDeclarationToResolve.getDesignation(containerFirFile, provider, moduleFileCache) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirFileAnnotationsResolveTransformer.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirFileAnnotationsResolveTransformer.kt new file mode 100644 index 00000000000..f4293de8401 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirFileAnnotationsResolveTransformer.kt @@ -0,0 +1,40 @@ +package org.jetbrains.kotlin.idea.fir.low.level.api.trasformers + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.resolve.ResolutionMode +import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer +import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession +import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.createReturnTypeCalculatorForIDE +import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult +import org.jetbrains.kotlin.fir.visitors.compose +import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator + +internal class FirFileAnnotationsResolveTransformer( + session: FirSession, + scopeSession: ScopeSession, + implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession(), +) : FirBodyResolveTransformer( + session, + FirResolvePhase.BODY_RESOLVE, + implicitTypeOnly = false, + scopeSession, + createReturnTypeCalculatorForIDE( + session, + scopeSession, + implicitBodyResolveComputationSession, + ::FirIdeDesignatedBodyResolveTransformerForReturnTypeCalculator + ), +) { + override fun transformFile(file: FirFile, data: ResolutionMode): CompositeTransformResult { + return context.withFile(file, components) { + file.transformAnnotations(this, data) + file.compose() + } + } + + override fun needReplacePhase(firDeclaration: FirDeclaration): Boolean = false +} \ No newline at end of file diff --git a/idea/testData/checker/AnnotationOnFile.fir.kt b/idea/testData/checker/AnnotationOnFile.fir.kt index 313cdd269d9..dcae379b3a6 100644 --- a/idea/testData/checker/AnnotationOnFile.fir.kt +++ b/idea/testData/checker/AnnotationOnFile.fir.kt @@ -1,13 +1,13 @@ @file:kotlin.Deprecated("message") -@file:Suppress(BAR) +@file:Suppress(BAR) @file:Suppress(BAZ) @kotlin.Deprecated("message") -@Suppress(BAR) +@Suppress(BAR) @Suppress(BAZ) @file:myAnnotation(1, "string") -@file:boo.myAnnotation(1, BAR) +@file:boo.myAnnotation(1, BAR) @file:myAnnotation(N, BAZ) @myAnnotation(1, "string") diff --git a/idea/testData/checker/recovery/returnInFileAnnotation.fir.kt b/idea/testData/checker/recovery/returnInFileAnnotation.fir.kt index 3d0ffd00af3..02d56c70d32 100644 --- a/idea/testData/checker/recovery/returnInFileAnnotation.fir.kt +++ b/idea/testData/checker/recovery/returnInFileAnnotation.fir.kt @@ -1 +1 @@ -@file:suppress(return a) +@file:suppress(return a) diff --git a/idea/testData/fir/lazyResolve/import/foo/main.txt b/idea/testData/fir/lazyResolve/import/foo/main.txt index 386af2d81b2..74b0e15ee36 100644 --- a/idea/testData/fir/lazyResolve/import/foo/main.txt +++ b/idea/testData/fir/lazyResolve/import/foo/main.txt @@ -1,4 +1,4 @@ FILE: main.kt - public? final? [TYPES] fun foofoo(): R|kotlin/Int| { + public? final? [RAW_FIR] fun foofoo(): Int { ^foofoo barbar#() }