| # Inference |
| |
| Currently, this document contains some basic terms that are common for different specific inference types. |
| Lately, it might be extended to include some basic description of how inference works. |
| |
| ## Glossary |
| ### TV = type variable |
| To avoid confusion with type parameter types, we mostly use `Tv` for referencing type variable based on a type parameter named `T` |
| ### CS = Constraint system |
| - Mostly, it’s just a collection of TVs and the constraints for them in a form of `Xi <: SomeType` or `SomeType <: Xi` or `Xi = SomeType` |
| - Represented as an instance of `org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl` |
| |
| ### Related TVs |
| |
| See `TypeVariableDependencyInformationProvider` for details. |
| |
| #### Shallow relation |
| Two variables `Xv` and `Yv` are shallowly related if there is some chain of a constraints |
| `Xv ~ a_1 ~ .. ~ a_n ~ Yv` where (`~` is either `<:` or `>:`) |
| |
| #### Deep relation |
| Two variables `Xv` and `Yv` are deeply related if there is some chain of a constraints |
| `a_1 ~ .. ~ a_n` where (`~` is either `<:` or `>:`) **and** `a_1` contains `Xv` while `a_n` contains `Yv`. |
| |
| ### Call-tree |
| A tree of calls, in which constraint systems are joined and solved(completed) together |
| ### Proper constraint |
| A constraint that doesn't reference any type variables |
| ### Input types of a lambda |
| - Receiver type |
| - Value parameter types |
| |
| **Completion** is a process that for a given call, its CS and postponed atoms (lambdas and callable references) tries to infer some TV and analyze some lambdas |
| |
| **Completion mode** |
| |
| Completion mode (`ConstraintSystemCompletionMode`) defines how actively/forcefully the given call is being completed |
| * `PARTIAL` — used for calls that are other calls arguments |
| * It prevents from fixing TV that are related somehow to return types because their actual result depends on the chosen outer call |
| * Otherwise, it tries to infer as much as possible, but doesn’t lead to reporting not-inferred-type-parameter or running PCLA lambdas |
| * On one hand, we might’ve not run that kind of completion at all, and just accumulate nested argument calls into an outer as is, |
| * but inferring something allows disambiguating outer candidates |
| * ``` |
| val x: Int = 1 |
| fun main() { |
| x.plus(run { x }) |
| } |
| ``` |
| * `FULL` — used for top statement-level calls and receivers |
| * It tries to fix/analyze everything we have |
| * And start PCLA analysis if necessary |
| * Reports errors if for some TV there’s no enough information to infer them |
| * `UNTIL_FIRST_LAMBDA` — used for OverloadByLambdaReturnType |
| * Similar to FULL, but stops after first lambda analyzed |
| * `PCLA_POSTPONED_CALL` — see [pcla.md](pcla.md). |
| |
| ## Inference session |
| |
| A set of callbacks related to inference that being called during function body transformations. |
| See `FirInferenceSession`. |