1. When calling a non-callable expression the error span is on the call target not on the whole call
2. When calling a method, the error for overload resolution now includes the arguments (this was previously regressed by #31414)
* Added --noImplicitThis code fix for functions used as object properties
Before trying out all the various possibilities for where these functions could be used, I figured I'd start out with a relatively simple use case to verify this is the right approach. Is it? 😄
Starts on #28964.
* Fixed function expression names; included new baselines
* Got JSDocs to work, hooray!
* Added test for 'any' case of no function uses
* Refactored for inferFunctionReferencesFromUsage
* Fixed inference bug: undefined references cause parameters to default
* Removed dead code comments
* add action for enabling experimentalDescorators option in user config file, change error message for this case #29035
* add missing changes in tests
* Add "experimental decorators" tests for jsconfig file
Starts on #29035 by creating a codefix to enable the `experimentalDecorators` setting in a user's config file, if one exists. The issue's discussion also mentions giving a more precise error message if the user has a jsconfig or tsconfig or creating one if not; I'd rather tackle those in separate PRs to keep this one small.
Doesn't create the code action if no config file is present. Otherwise keeps to the precedent of returning without action when the config file contents aren't the expected JSON structure (looking at `fixCannotFindModule.ts`). Moves a couple JSON helpers from that file into the sibling `helpers.ts` so both codefixes can use them.
* Infer from arrows from usage.
Previously only function expressions were, and only those with an easily
accessible name. Now any arrow function or function expression will
infer from usage.
* remove isApplicableFunctionForInference
*all* functions are applicable for inference now.
* constructor functions infer from call+construct
Also fix an incorrect combining of inferences for rest parameters: the
inferred types will be arrays in the body of the function and the
arguments from outside the function will be the element type.
* All functions infer from call+construct contexts
* Initial version, doesn't work for primitives yet.
Need to find out why.
* Primitives now work, plus improve error message
null and void don't even parse without parameter names so they are not
tested.
* Codefix: Add names to nameless parameters
* Improve error wording
* Add detail to error message
* string|number inferences are low priority
Also, refactor unifyFromContext to explicitly handle priorities
* string/number/strnum are not mutually exclusive
* Assert that high/low can't apply to same element
* Slightly improve missing property errors
* Add missing quote
* Fix jsx case
* Add related span
* Fix crash (why can declarations be undefined)
* Only skip top elaboration when no variant message is provided
In case of private attribute and private constructor parameter with
assignment in the constructor body, the parameter is flagged as unused.
This is caused by the private modifier which is shadowed by the
explicity assignment in the body.
This commit updates the codefix to just remove the private modifier in
this cases.
Closes#24931
* Parameters infer from body usage and call sites
* Function expressions infer from variable decl usages
If the function expression is the initialiser of a variable declaration.
* Update isApplicableFunctionForInference too
* Update baseline
* infer from usage's unification uses multiple passes
Previously, the unification step of infer-from-usage codefix would stop
as soon an answer was found. Now it continues if the result is
*incomplete*, with the idea that later passes may provide a better
inference.
Currently, an *incomplete* inference is
1. The type any.
2. The empty object type `{}` or a union or intersection that contains
`{}`.
In the checker, any takes priority over other types since it basically
shuts down type checking. For type inference, however, any is one of the least
useful inferences.
`{}` is not a good inference for a similar reason; as a parameter
inference, it doesn't tell the caller much about what is expected, and
it doesn't allow the function author to use an object as expected. But
currently it's inferred whenever there's an initialisation with the
value `{}`. With this change, subsequent property assignments to the
same parameter will replace the `{}` with a specific anonymous type. For
example:
```js
function C(config) {
if (config === undefined) config = {};
this.x = config.x;
this.y = config.y;
this.z = config.z;
}
```
* Unify all passes of inference from usage
In the previous commit, I changed inference from usage to continue
inference if a the result was *incomplete*. This commit now runs all 4
inference passes and combines them in a unification step. Currently the
unification step is simple, it:
1. Gathers all inferences in a list.
2. Makes properties of anonymous types optional if there is an empty
object in the inference list.
3. Removes *vacuous* inferences.
4. Combines the type in a union.
An inference is *vacuous* if it:
1. Is any or void, when a non-any, non-void type is also inferred.
2. Is the empty object type, when an object type that is not empty is
also inferred.
3. Is an anonymous type, when a non-nullable, non-any, non-void,
non-anonymous type is also inferred.
I think I might eventually want a concept of priorities, like the
compiler's type parameter inference, but I don't have enough examples to
be sure yet.
Eventually, unification should have an additional step that examines the
whole inference list to see if its contents are collectively
meaningless. A good example is `null | undefined`, which is not useful.
* Remove isNumberOrString
* Unify anonymous types
@andy-ms pointed out that my empty object code was a special case of
merging all anonymous types from an inference and making properties
optional that are not in all the anonymous type. So I did that instead.
* Use getTypeOfSymbolAtLocation instead of Symbol.type!
* Unify parameter call-site inferences too
Because they still have a separate code path, they didn't use the new
unification code.
Also some cleanup from PR comments.
* Add object type unification test
Also remove dead code.
* Only use fallback if no inferences were found
Instead of relying on the unification code to remove the fallback.