Commit Graph
3266 Commits
Author SHA1 Message Date
aleksandrina-streltsova 9548486b55 [FIR] don't transform analyzed lambda
Inside `transformDeclarationContent` current tower data context is saved. Previously, stored context could be incomplete, because `dataFlowAnalyzer.enterFunction(function)` wasn't called in all cases.
^KTIJ-26419 Fixed
2023-08-03 07:54:24 +00:00
Egor Kulikov 673ac2227a [FIR] Refactor getFir to return only sane option or null
Merge-request: KT-MR-11138
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
2023-08-02 18:24:57 +00:00
Dmitrii Gridin 77344c0845 [LL FIR] add checks about resolved context receivers
^KT-60728
^KT-60519
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 0e0847bc9d [LL FIR] support lazy bodies in scripts
Also, it adds guards to avoid problems with PCE

^KT-60728 Fixed
^KT-60519 Fixed
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 2c932c9e1d [LL FIR] add proper lazy resolve support for script dependent declarations
Such declarations (only `ResultProperty` for now) should delegate
resolution to the script, because they depend on its content

^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin f549712912 [FIR] FirCallableSymbol: introduce calculateReturnType
It will help to avoid copy-pasted logic there it is needed

^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 32e3b67416 [LL FIR] LLFirTargetResolver: add default implementation to withFile and withRegularClassImpl
To drop redundant implementations in resolvers

^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin de48a51711 [LL FIR] avoid redundant context collection
We assume that declaration context will be collected
during `LLFirAnnotationArgumentsTargetResolver`, so other
`LLFirAbstractBodyTargetResolver` shouldn't repeat this process

^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 1a3b0fa9d5 [LL FIR] provide script scopes to declarations
All transformations inside a script should be
under the script context for proper resolution

^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 544341412a [LL FIR] extract LLFirResolveTargetWithDedicatedElement
It is required to simplify the logic in the next commit.
Also, it drops redundant inheritance from [firFile] and [path] properties

^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin dc347e2aa6 [LL FIR] add tests on specific cases in scripts resolve
* args
* $$result

^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 63c6c38952 [LL FIR] LLFirPhaseUpdater: update phases inside delegate expression
^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 7a2dad5ca5 [LL FIR] create separate FileStructureElement for script
It is required to avoid duplication visiting on declarations

^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 97e330997b [LL FIR] support scripts in BODY_RESOLVE transformer
^KT-60728
2023-08-02 16:50:45 +00:00
Dmitrii Gridin 6cb1142210 [LL FIR] support scripts in annotation transformers
^KT-60728
2023-08-02 16:50:44 +00:00
Dmitrii Gridin efc6ca27b2 [LL FIR] support scripts in TYPES transformer
^KT-60728
2023-08-02 16:50:44 +00:00
Dmitrii Gridin 64bdcc1131 [LL FIR] support scripts in COMPILER_REQUIRED_ANNOTATIONS transformer
^KT-60728
2023-08-02 16:50:44 +00:00
Dmitrii Gridin 95e04c97cc [LL FIR] LLFirWholeFileResolveTarget should process script declarations
^KT-60728
2023-08-02 16:50:44 +00:00
Dmitrii Gridin 3686bf7ff9 [LL FIR] allow independent resolve for declarations in scripts
^KT-60728
2023-08-02 16:50:44 +00:00
Dmitrii Gridin 61981f6026 [LL FIR] skip FirScript resolve in transformers
It is a temporary step to be able to implement
granular scripts support

^KT-60728
2023-08-02 16:50:44 +00:00
Ivan Kochurkin f31786c2a0 [FIR] Resolve <implicit> to FirErrorTypeRef for unresolved synthetic arrayOf call 2023-08-02 16:23:36 +00:00
Ivan Kochurkin 4d7e54b2bb [FIR] Add a test to make sure that arrayOf function is always presented
Because it's located in builtins but not in stdlib.

It should work even if no runtime is specified.

^KTIJ-26465
2023-08-02 16:23:35 +00:00
Alexander Udalov 3e313bca78 K2: remove dependency fir-deserialization -> compiler.common.jvm
- Rename DeserializedClassConfigurator -> FirDeserializationExtension to
  abstract the existing behavior (about the Serializable supertype), as
  well as any future JVM-specific deserialization behavior.
- Rename JvmDeserializedClassConfigurator ->
  FirJvmDeserializationExtension and move it to fir:java.
2023-08-02 14:50:10 +00:00
Roman Efremov 11ccad7e40 [FE, IR] Add expect actual annotations incompatibility info into diagnostic
This is needed for more beautiful reporting and easier
implementation of quick fix in IDE.

^KT-58551
2023-08-02 13:12:31 +00:00
Kirill Rakhman ade1354a84 [FIR] If callable reference can't be resolved with expected type, try resolving with Any
In positions outside of calls (e.g. property initializers)
we resolve callable references using a synthetic outer call with the
expected type as parameter type.
If this fails, we previously returned an unresolved reference.
After this commit, we additionally try to resolve the callable reference
with expected type Any.
This lets us report more precise diagnostics like type mismatches or
when multiple overloads exist NONE_APPLICABLE.

#KT-55373 Fixed
#KT-55955 Fixed
2023-08-02 08:00:33 +00:00
Nikolay Lunyak 61d2e338a4 [FIR] Prevent compiler crash on lambdas in annotations
^KT-59110 Fixed
2023-08-01 14:58:52 +00:00
aleksandrina-streltsova d9736ec88c [AA] Consider context receivers KtFirCompletionCandidateChecker
^KTIJ-26384 Fixed
2023-07-31 16:37:11 +00:00
Anna Kozlova 8fb9461276 [Fir] get candidate from missed type args diagnostics in annotation call
Otherwise, navigation to unresolved reference is impossible ^ KTIJ-26441

In order to avoid duplicated diagnostic, wrapper is still used.
Symbol collector is updated to retrieve symbols from that wrapper.


Merge-request: KT-MR-11381
Merged-by: Anna Kozlova <Anna.Kozlova@jetbrains.com>
2023-07-31 16:12:17 +00:00
Marco Pennekamp 9c3fa5e878 [LL FIR] KT-58257 Restore invalidation of KtFirAnalysisSession via the project-wide OOBM tracker
- `KtReadActionConfinementLifetimeToken` tracks its validity via the
  project-wide out-of-block modification tracker. Out-of-block
  invalidation of some LL FIR session will cause the lifetime tokens of
  all analysis sessions to become invalid, including unrelated sessions,
  because of this project-wide tracking.
- If `KtFirAnalysisSession`s are only invalidated when their underlying
  LL FIR session is invalidated, the cache may expose analysis sessions
  which contain invalid lifetime tokens after out-of-block modification.
  Even though an analysis session will still be practically valid if its
  underlying LL FIR session is valid, the lifetime token will *think*
  that the PSI has changed and throw an "access to invalid token"
  exception.
- Hence, we cannot currently invalidate `KtFirAnalysisSession`
  granularly and project-wide OOBM tracking needs to be restored.

^KT-60272
2023-07-31 15:58:01 +00:00
Marco Pennekamp 2ba42b8677 [LL FIR] KT-58257 Remove LLFirSession.invalidate
- Due to problematic timing in `LLFirSession.invalidate` when the
  function is called from a read action, it's better to remove the
  function altogether.
- The function's only usage was session invalidation after exceptions
  from resolve when FIR tree guards were turned off. Because FIR tree
  guards are stable enough, the flag that turned them off can be
  removed. This also allows removing `LLFirSession.invalidate`.
- The alternative to removing `LLFirSession.invalidate` would be to
  rewrite session invalidation to be independent of write actions. That
  would require additional locking in `LLFirSessionCache`, which we want
  to avoid.

^KT-59297
2023-07-31 15:58:01 +00:00
Marco Pennekamp 03c8654fe3 [AA] KT-58257 Improve modification event API and documentation
- Module state modification events now have a modification kind, which
  allows adding additional kinds of modification in the future (e.g.
  separating module property and content root updates, if the workspace
  model ever supports it).
  - Splitting off modification kinds was also a good opportunity to
    better document when module state modification occurs.
- Changed the documentation of modification events to be (1) less
  reliant on the IDE implementation and (2) more detailed in the
  intended effect of each event.
- Removed the notion of "stable" modules again and replaced it with
  "libraries". Even though an SDK is technically not a library, the
  term "library modules" should be more friendly to API consumers.
2023-07-31 15:58:01 +00:00
Marco Pennekamp d2b05b8f4f [AA] KT-58257 Restore timing guarantees of module state modification events
- Specifically for non-global module state modification, we can
  guarantee that the event is published before the module is modified.
  This allows subscribers to use the provided `KtModule` without needing
  to fear that the module has already been disposed (in case of
  removal).
2023-07-31 15:58:01 +00:00
Marco Pennekamp 2023c08459 [SLC] KT-58257 Rewrite SLC equality tests to publish global modification events
- `KtFirAnalysisSession` does not need to depend on project out-of-block
  and project root modification trackers anymore, as its underlying
  use-site session determines validity. To ensure that use-site sessions
  are invalidated in SLC equality tests, modification events also need
  to be published.
2023-07-31 15:58:01 +00:00
Marco Pennekamp 7f4af06ac7 [LL FIR] KT-58257 Turn LLFirSession.isValid into a volatile variable
- We do not need `AtomicBoolean` here, because setting `_isValid` to a
  constant `false` suffices.
- Also replace the public setter of `isValid` with `markInvalid` to
  prohibit setting `isValid` to `true` again.
2023-07-31 15:58:01 +00:00
Marco Pennekamp 62a71b1559 [AA] KT-58257 Remove global out-of-block modification events
- Out-of-block modification of stable modules is meaningless, because
  stable modules should not be affected by out-of-block modification.
  Hence, only global *source* out-of-block modification makes sense and
  global out-of-block modification events can be removed.
2023-07-31 15:58:01 +00:00
Marco Pennekamp 42c879a53c [LL FIR] KT-58257 Invalidate library sessions depending on anchor modules on global source modification
- Any time an anchor module's session is invalidated, we need to make
  sure that all its dependents are also invalidated. Because those
  dependents may include libraries, invalidation after global source
  modification needs to invalidate such libraries, even if other stable
  module sessions should remain untouched.
2023-07-31 15:58:01 +00:00
Marco Pennekamp 24045067bf [LL FIR] KT-58257 Keep library (source) sessions on global source invalidation
- `LLFirSessionCache.sourceCache` can contain library and library
  sources sessions. However, global source modification events should
  not remove such sessions from the cache, because they belong to
  "stable" modules.
- The commit introduces the term "stable module" as a combined term for
  binary and library source modules. Library sources are not binaries,
  but nevertheless they cannot cause nor be affected by out-of-block
  modification.
- The term "source modules" as used by global "source" modification is
  slightly imprecise, as it does *not* include library sources, but for
  the sake of conciseness, I don't plan to change that.
2023-07-31 15:58:01 +00:00
Marco Pennekamp edadfd0daa [LL FIR] KT-58257 Fix session project leak in invokeLater lambda
- The lambda passed to `invokeLater` in `LLFirSession.invalidate` might
  survive beyond project disposal (especially in tests), so me must not
  capture a hard reference to the session that can leak its `project`.
2023-07-31 15:58:01 +00:00
Marco Pennekamp bb92d19b47 [LL FIR] KT-58257 Invalidate script sessions globally (as a workaround)
- Until the IDE module dependents provider has been implemented for
  script dependents (see KTIJ-25620), we must assume that any script
  modification may lead to any other script session being out of date.
  Hence, script modification now leads to the removal of all script
  sessions.
- Because the IDE module dependents provider doesn't provide script
  dependents for libraries yet, library modification must also lead to
  global script session invalidation.
2023-07-31 15:58:01 +00:00
Marco Pennekamp efabd55646 [LL FIR] KT-58257 Don't invalidate dependent sessions when root session is absent
- We don't need to invalidate dependent sessions when the root session
  isn't in the session cache, or if the session is already marked as
  invalid, because any dependent sessions that might exist won't be
  referencing entities from the root session at that point.
2023-07-31 15:58:00 +00:00
Marco Pennekamp abc1be2ee0 [LL FIR] KT-57743 Build dependency symbol providers lazily
- Because `KtModule`s and thereby sessions may depend on each other
  cyclically, we must not create a session during the creation of
  another session. Otherwise, let's say session A and B depend on each
  other. Then we get the following nested creation: session A -> session
  B -> session A -> session B, and so on.
- Dependency symbol providers are in part taken from dependency
  sessions. Hence, we have to create dependency symbol providers lazily.
- For the creation of dependency symbol providers we only need to access
  the non-dependency symbol providers of a session dependency, so we
  don't need to access the dependency's dependency symbol providers.
  Hence, the lazy construction won't run into issues with cycles later
  on.

^KT-57743 fixed
2023-07-31 15:58:00 +00:00
Marco Pennekamp 2d279c5f25 [AA] KT-58257 Remove timing guarantees of Kotlin modification events
- Kotlin modification events are published before or after the
  modification, depending on the underlying cause. For example, PSI tree
  change events in the IDE can occur both before and after the change,
  so module and global out-of-block modification events must not make
  timing guarantees. Similarly, module state modification events
  published by the IDE can both happen before and after a module change,
  with most events happening before the change.
2023-07-31 15:58:00 +00:00
Marco Pennekamp 9983abea4c [AA] Don't use a weak-value map in KtFirAnalysisSessionProvider
- The values stored in `CachedValue`s are already soft. We don't gain
  any benefit from making the `CachedValue` a weak reference as well.
2023-07-31 15:58:00 +00:00
Marco Pennekamp e76692ef8d [LL FIR] KT-58257 Implement active session invalidation
- This commit replaces session modification trackers with event-based
  session invalidation. The removal of modification trackers should
  improve overall performance, because session invalidation events
  happen less frequently than sessions are accessed. Getting rid of
  modification trackers also allows sessions to refer to other sessions
  lazily, which is essential when cyclic dependencies occur.
- The new `LLFirSession` validity tracker has constant complexity and
  will not cause the same kind of performance issues as dependency
  modification trackers. It is a bridge to support modification trackers
  in certain parts of the code (e.g. for `CachedValue`s), while being
  backed by event-based invalidation.
- `LLFirSessionInvalidationService` is the bridge between modification
  events and `LLFirSessionCache`. It finds out which modules should be
  invalidated and instructs the session cache to remove the associated
  sessions.
- Session invalidation must always happen in a write action to preserve
  consistency between sessions. Otherwise, while a session A is already
  removed from the cache, it might still be referenced by a dependent
  session B which is in the process of being invalidated. Such a session
  must never be returned from `getSession`.

^KT-57515 fixed
2023-07-31 15:58:00 +00:00
Marco Pennekamp 1f556589a2 [AA] KT-58257 Add module dependents exception for KtBuiltinsModule and KtSdkModule
- The IDE implementation of `KotlinModuleDependentsProvider` cannot
  easily find all dependents for a builtins or SDK module. Instead,
  builtins and SDK changes can be handled via global module state
  modification events, because most modules will depend on builtins and
  SDK modules.
2023-07-31 15:58:00 +00:00
Marco Pennekamp 027fd5600f [AA] KT-58257 Implement KtStaticModuleDependentsProvider (standalone) 2023-07-31 15:58:00 +00:00
Marco Pennekamp fe3f7feae4 [AA] KT-58257 Introduce KotlinModuleDependentsProvider
- Event-based session invalidation requires knowledge about the
  dependents of a `KtModule`. This is because, when the session for a
  module is invalidated, all sessions for modules which depend on that
  module, directly or indirectly, must also be invalidated.
- Note that the approach with modification trackers relied on module
  dependencies. Events have an opposite flow of information compared to
  modification trackers: Modification trackers request whether a change
  occurred, while events publish that a change occurred. Thus, the
  modules which need to be incorporated into the invalidation dynamic
  are also flipped: dependents instead of dependencies.
- `KotlinModuleDependentsProvider` is designed to work generally. It can
  be used for purposes beyond session invalidation.
2023-07-31 15:58:00 +00:00
Marco Pennekamp 7fd8e4d0fd [AA] Standalone Analysis API: Introduce KtStaticProjectStructureProvider
- `registerServicesForProjectEnvironment` relied on lists of all modules
  and source files, which the standalone project structure providers
  would have already been able to provide with the right interface.
- In `StandaloneAnalysisAPISessionBuilder.build`, to get all modules and
  source files, `projectStructureProvider` had to be hard-casted to
  `KtModuleProviderImpl`.
- This commit introduces `KtStaticProjectStructureProvider`, a shared
  interface for project structure providers with static module
  structures that know about their modules and source files.
2023-07-31 15:58:00 +00:00
Marco Pennekamp e3d803de8b [AA] KT-58257 Prepare KtResolveExtension API for active invalidation
- `KtResolveExtension`s need to participate in active invalidation,
  because LL FIR sessions depend on changes in resolve extension files.
- The resolve extension will simply be able to use the
  `KotlinModificationSubscriptionService`, which is part of the Analysis
  API surface for **API implementors**, to publish modification events.
2023-07-31 15:58:00 +00:00
Marco Pennekamp 0c94a3131c [AA] KT-58257 Add API for subscription-directed invalidation
- The commit refactors some modification trackers previously provided by
  `KotlinModificationTrackerFactory` to a subscription-directed
  mechanism implemented via `MessageBus` and `KotlinTopics`. The
  following modification trackers are affected:
  - Module out-of-block modification: The FE10 Analysis API doesn't use
    these modification trackers, so the effect is limited to LL FIR.
  - Module state: Likewise, FE10 doesn't use this modification tracker,
    so again the effect is limited to LL FIR.
- Project and library modifications trackers remain, because many small
  objects in e.g. light classes depend on these trackers (making
  listener management unfeasible), and they are not relevant for
  `LLFirSession` invalidation.
- This new API paves the way for a session invalidation service to
  subscribe to out-of-block and module state changes as events. This
  removes the need to iterate through modification trackers.
  - Also note that the out-of-block modification provided by the new
    subscription mechanism is intended to work for _any_ `KtModule`, as
    long as it makes sense to have out-of-block modifications. For
    example, the subscription should work for script modules. The OOB
    modification tracker previously only supported `KtSourceModule`s,
    which required separate single-file modification trackers for script
    and not-under-content-root modules.
- `MessageBus` is a general utility provided by IntelliJ, but usually it
  is retrieved from `project`. To keep these two concerns decoupled,
  `project.messageBus` should not be used directly. Instead, the commit
  adds a `KotlinMessageBusProvider`, which for now just provides the
  project message bus with its standard implementation, but allows
  swapping out the message bus implementation later.
- Global changes are also supported by the new subscription API. Such
  global changes may for example occur during cache invalidation in
  tests, on global PSI tree changes, or when an SDK is removed.
- Test-only invalidation has been moved from
  `KotlinModificationTrackerFactory` to a new
  `KotlinGlobalModificationService`. This creates one central service
  for invalidation between tests, which is easier from an implementation
  and a usage perspective than calling multiple scattered services and
  providers.
2023-07-31 15:58:00 +00:00