aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir
Commit message (Collapse)AuthorAgeFilesLines
* show names for record fields in enum completionadamrk2020-02-162-0/+6
|
* Revert source_analyzer changesKirill Bulatov2020-02-122-55/+6
|
* Fix post-rebase issuesKirill Bulatov2020-02-121-11/+12
|
* Support trait method call autoimportsKirill Bulatov2020-02-121-1/+5
|
* Trait location draftKirill Bulatov2020-02-121-11/+7
|
* Resolve methods and functions betterKirill Bulatov2020-02-121-6/+54
|
* Add more hir APIs for associated itemsAleksey Kladov2020-02-122-14/+64
|
* Merge #3050bors[bot]2020-02-092-12/+24
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 3050: Refactor type parameters, implement argument position impl trait r=matklad a=flodiebold I wanted to implement APIT by lowering to type parameters because we need to do that anyway for correctness and don't need Chalk support for it; this grew into some more wide-ranging refactoring of how type parameters are handled :sweat_smile: - use Ty::Bound instead of Ty::Param to represent polymorphism, and explicitly count binders. This gets us closer to Chalk's way of doing things, and means that we now only use Param as a placeholder for an unknown type, e.g. within a generic function. I.e. we're never using Param in a situation where we want to substitute it, and the method to do that is gone; `subst` now always works on bound variables. (This changes how the types of generic functions print; previously, you'd get something like `fn identity<i32>(T) -> T`, but now we display the substituted signature `fn identity<i32>(i32) -> i32`, which I think makes more sense.) - once we do this, it's more natural to represent `Param` by a globally unique ID; the use of indices was mostly to make substituting easier. This also means we fix the bug where `Param` loses its name when going through Chalk. - I would actually like to rename `Param` to `Placeholder` to better reflect its use and get closer to Chalk, but I'll leave that to a follow-up. - introduce a context for type lowering, to allow lowering `impl Trait` to different things depending on where we are. And since we have that, we can also lower type parameters directly to variables instead of placeholders. Also, we'll be able to use this later to collect diagnostics. - implement argument position impl trait by lowering it to type parameters. I've realized that this is necessary to correctly implement it; e.g. consider `fn foo(impl Display) -> impl Something`. It's observable that the return type of e.g. `foo(1u32)` unifies with itself, but doesn't unify with e.g. `foo(1i32)`; so the return type needs to be parameterized by the argument type. This fixes a few bugs as well: - type parameters 'losing' their name when they go through Chalk, as mentioned above (i.e. getting `[missing name]` somewhere) - impl trait not being considered as implementing the super traits (very noticeable for the `db` in RA) - the fact that argument impl trait was only turned into variables when the function got called caused type mismatches when the function was used as a value (fixes a few type mismatches in RA) The one thing I'm not so happy with here is how we're lowering `impl Trait` types to variables; since `TypeRef`s don't have an identity currently, we just count how many of them we have seen while going through the function signature. That's quite fragile though, since we have to do it while desugaring generics and while lowering the type signature, and in the exact same order in both cases. We could consider either giving only `TypeRef::ImplTrait` a local id, or maybe just giving all `TypeRef`s an identity after all (we talked about this before)... Follow-up tasks: - handle return position impl trait; we basically need to create a variable and some trait obligations for that variable - rename `Param` to `Placeholder` Co-authored-by: Florian Diebold <[email protected]> Co-authored-by: Florian Diebold <[email protected]>
| * FormattingFlorian Diebold2020-02-071-6/+4
| |
| * Fix compilation of other cratesFlorian Diebold2020-02-071-10/+15
| |
| * wip lower impl trait to type argsFlorian Diebold2020-02-071-1/+1
| |
| * Add impl trait lowering modeFlorian Diebold2020-02-072-8/+9
| |
| * Introduce TyLoweringContextFlorian Diebold2020-02-072-6/+14
| |
* | Remove ImportResolver-related stubsKirill Bulatov2020-02-091-2/+1
|/
* Remove the leftovers after ImportLocator removalKirill Bulatov2020-02-061-1/+0
|
* Merge #2982bors[bot]2020-02-021-1/+2
|\ | | | | | | | | | | | | | | 2982: Merge imports when auto importing r=flodiebold a=SomeoneToIgnore Co-authored-by: Kirill Bulatov <[email protected]>
| * Code review fixesKirill Bulatov2020-02-021-1/+1
| |
| * Require ModPath for importingKirill Bulatov2020-02-021-1/+2
| |
* | Auto import functionsKirill Bulatov2020-02-011-6/+11
|/
* Re-sync queries for memory usage measurnmentAleksey Kladov2020-01-291-9/+13
|
* Code review fixesKirill Bulatov2020-01-271-3/+2
|
* Adjust the testsKirill Bulatov2020-01-261-0/+1
|
* Have a better trait interfaceKirill Bulatov2020-01-261-1/+2
|
* Initial auto import action implementationKirill Bulatov2020-01-261-1/+1
|
* Fix commentAleksey Kladov2020-01-161-3/+1
|
* Correctly discover module containersAleksey Kladov2020-01-161-11/+15
|
* Create modules via SourceBinderAleksey Kladov2020-01-163-58/+28
|
* Move module to SourceBinderAleksey Kladov2020-01-162-34/+48
|
* Cache source for genericsAleksey Kladov2020-01-161-1/+20
|
* Move more stuff to SourceBinderAleksey Kladov2020-01-162-64/+68
|
* More natural trait setupAleksey Kladov2020-01-162-22/+44
|
* Removed FromSourceAleksey Kladov2020-01-161-165/+16
|
* Make FromSource privateAleksey Kladov2020-01-163-18/+53
|
* TyposAleksey Kladov2020-01-151-1/+1
|
* Make syntax highlighting linearAleksey Kladov2020-01-151-3/+5
|
* Flip genericsAleksey Kladov2020-01-151-12/+12
|
* Store DB in SourceBinderAleksey Kladov2020-01-153-32/+33
|
* Introduce SourceBinderAleksey Kladov2020-01-153-99/+215
|
* Don't parse child modules when doing diagnosticsAleksey Kladov2020-01-151-3/+3
|
* Move Type API to typeAleksey Kladov2020-01-142-66/+78
|
* Push resolver further upAleksey Kladov2020-01-141-2/+16
|
* Move impls_future to Type, where it belongsAleksey Kladov2020-01-142-25/+19
|
* Use lang-items to resolve future traitAleksey Kladov2020-01-141-10/+9
|
* Move utility functions downAleksey Kladov2020-01-141-58/+58
|
* Rename fileAleksey Kladov2020-01-142-2/+2
|
* Use attr location for builtin macro goto-impEdwin Cheng2020-01-121-1/+23
|
* Apply review suggestionsFlorian Diebold2020-01-112-2/+4
|
* Qualify some paths in 'add missing impl members'Florian Diebold2020-01-113-0/+33
|
* Split `infer` query into two for better profilingMichal Terepeta2020-01-031-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is the same change as we did with `crate_def_map` and it does seem that we mostly spend time in salsa, without recomputing much on rust-analyzer side. Example output: ``` 233ms - handle_inlay_hints 163ms - get_inlay_hints 163ms - SourceAnalyzer::new 67ms - def_with_body_from_child_node 67ms - analyze_container 67ms - analyze_container 67ms - Module::from_definition 67ms - Module::from_file 67ms - crate_def_map 0ms - parse_macro_query (6 calls) 0ms - raw_items_query (1 calls) 66ms - ??? 0ms - crate_def_map (1 calls) 0ms - crate_def_map (1 calls) 96ms - infer 2ms - trait_solve_query (2 calls) 94ms - ??? 0ms - body_with_source_map_query (1 calls) 0ms - crate_def_map (1 calls) [...] ``` Signed-off-by: Michal Terepeta <[email protected]>
* Split `crate_def_map` into two methodsMichal Terepeta2020-01-031-5/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change: - introduces `compute_crate_def_map` query and renames `CrateDefMap::crate_def_map_query` for consistency, - annotates `crate_def_map` as `salsa::transparent` and adds a top-level `crate_def_map` wrapper function around that starts the profiler and immediately calls into `compute_crate_def_map` query. This allows us to better understand where we spent the time, in particular, how much is spent in the recomputaiton and how much in salsa. Example output (where we don't actually re-compute anything, but the query still takes a non-trivial amount of time): ``` 211ms - handle_inlay_hints 150ms - get_inlay_hints 150ms - SourceAnalyzer::new 65ms - def_with_body_from_child_node 65ms - analyze_container 65ms - analyze_container 65ms - Module::from_definition 65ms - Module::from_file 65ms - crate_def_map 1ms - parse_macro_query (6 calls) 0ms - raw_items_query (1 calls) 64ms - ??? ``` Signed-off-by: Michal Terepeta <[email protected]>