How to print type annotations for a program?

Flow has a handy tool called "flow suggest" which will print out the inferred types of the whole program. for example:

$ cat main.js && echo "-----------" && flow suggest main.js
pow = (a: number): number => Math.pow(a, 2);
mut = (a, b) => pow(a + b);

mut(12.3, 34.5);
-----------
pow = ((a: number): number => Math.pow(a, 2));
mut = ((a: any, b: any): any => pow(a + b));

mut(12.3, 34.5);

I feel certain that rust has an equivalent, but I don't know what it is. How would I do the same thing in a rust program?

I don't know of any tool that does this. But you can annotate your binding with : () and the compiler will tell you what type it thinks it should be:

2 |     let a: () = vec![1u8];
  |                 ^^^^^^^^^ expected (), found struct `std::vec::Vec`

IntelliJ has an option that shows the inferred types in the editor.

  • To annotate a lifetime for yourself or other people reading your code, you can write a type annotation after a binding, even for an empty one! (e.g., let _: type_annotation_here = expression_here;).

    for ref x in &[42_i32, 27] {
        let _: &&i32 = x;
    }
    
  • To get the exact type of an expression, the most used trick is the one @jethrogb showed;

  • But if you really want to have all your code type annotated, I don't know if such a tool currently exists (it definitely could), but you can try to see the generated HIR:

fn main ()
{
   let mut v = Vec::new();
   v.push(42_i32);
}
$ cargo +nightly rustc -- -Zunpretty=hir,typed
fn main() ({    
   let mut v =                
       ((<Vec>::new as                
            fn() -> std::vec::Vec<i32> {<std::vec::Vec<T>><i32>::new})()                
           as std::vec::Vec<i32>);                
   ((v as std::vec::Vec<i32>).push((42i32 as i32)) as ());                
} as ())

But this one sadly does not show, for instance, that the .push() call is taking an &mut Vec<i32>.

So, for a more verbose (but more accurate) output, there is the MIR, which is even available in the playground (top left menu):

$ cargo +nightly rustc -- -Zunpretty=mir-cfg | xdot -

3 Likes

What a great, thorough answer @Yandros!

I don’t know if such a tool currently exists (it definitely could)

I'm not an active rust-type-person, so I can't write it, but I think it would be a super handy debugging/teaching tool!

1 Like