FIR IDE: fix unresolved file annotations arguments

This commit is contained in:
Ilya Kirillov
2021-04-06 15:37:32 +02:00
parent 790cafa671
commit a9fc3dd1ea
6 changed files with 61 additions and 10 deletions
@@ -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,
@@ -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)
@@ -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<FirFile> {
return context.withFile(file, components) {
file.transformAnnotations(this, data)
file.compose()
}
}
override fun needReplacePhase(firDeclaration: FirDeclaration): Boolean = false
}
+3 -3
View File
@@ -1,13 +1,13 @@
@file:kotlin.Deprecated("message")
@file:Suppress(BAR)
@file:Suppress(<error descr="[UNRESOLVED_REFERENCE] Unresolved reference: BAR">BAR</error>)
@file:Suppress(BAZ)
@<error descr="Expecting \"file:\" prefix for file annotations">k</error>otlin.Deprecated("message")
@<error descr="Expecting \"file:\" prefix for file annotations">S</error>uppress(BAR)
@<error descr="Expecting \"file:\" prefix for file annotations">S</error>uppress(<error descr="[UNRESOLVED_REFERENCE] Unresolved reference: BAR">BAR</error>)
@<error descr="Expecting \"file:\" prefix for file annotations">S</error>uppress(BAZ)
@file:myAnnotation(1, "string")
@file:boo.myAnnotation(1, BAR)
@file:boo.myAnnotation(1, <error descr="[UNRESOLVED_REFERENCE] Unresolved reference: BAR">BAR</error>)
@file:myAnnotation(N, BAZ)
@<error descr="Expecting \"file:\" prefix for file annotations">m</error>yAnnotation(1, "string")
@@ -1 +1 @@
@file:<error descr="[UNRESOLVED_REFERENCE] Unresolved reference: suppress">suppress</error>(return a)
@file:<error descr="[UNRESOLVED_REFERENCE] Unresolved reference: suppress">suppress</error>(return <error descr="[UNRESOLVED_REFERENCE] Unresolved reference: a">a</error>)
+1 -1
View File
@@ -1,4 +1,4 @@
FILE: main.kt
public? final? [TYPES] fun foofoo(): R|kotlin/Int| {
public? final? [RAW_FIR] fun foofoo(): Int {
^foofoo barbar#()
}