This module contains the IR data structure, as well as many utilities and common code around it.

Some sources are generated by [tree.generator](tree.generator).

There are two implementations of IR:
- Regular - `Ir*Impl` classes.
- Lazy IR - it may be used for external code (i.e. code from other modules than the currently compiled one, such as libraries). It's lazy not to load and deserialize the entire library, when only a portion of it is actually referenced, and therefore needed for compilation.
  
  Lazy IR generally does not have function bodies. It may have them for inline functions.

  Lazy IR is generally not being lowered, and therefore immutable, however this is a gray area.

  Because lazy IR uses frontend directly to load and translate the data on the fly, it itself has two implementations:
  - for K1: [`Lazy*Ir`](`src/org/jetbrains/kotlin/ir/declarations/lazy`)
  - for K2: [`Fir2IrLazy*`](../../fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy)