Convert RsTypeKind to a cheaply-clonable type with `Rc` inside.

The immediate reason for this is to allow it to be returned by a Salsa query.
Either the query returns an `RsTypeKind` by value, in which case it should be cheaply clonable,
or it returns an `Rc<RsTypeKind>`, in which case the recursive data structure should use `Rc`
inside to avoid excessive copying. No matter how we design the query, `RsTypeKind` becomes as so.

However, in fact I've wanted this change for a long time before that, and I think it's
good even on its own merits.

Suppose I want to format `x` as a pointer. The current way to do it is something like
`quote!{*const #x}`. But this is "lossy" -- this isn't a structured datatype that says "a pointer to `x`",
it's just a code snippet. But if `x` were cheaply clonable, we could simply do
`RsTypeKind::Pointer {pointee: Rc::new(x.clone()), mutability: Mutability::Const}`.
And so rather than building up token streams in stringly-typed code, we can build up `RsTypeKind` objects.

This does occur in practice, e.g. `format_mut_ref_as_uninitialized` formats a `RsTypeKind` as a
`MaybeUninit`, returning a `TokenStream`. But after this change, it could instead be implemented to return
a new `RsTypeKind`, containing a reference to the old one, and preserving structure -- at least, if
we wanted to. I'm not sure where else this occurs, though, which is part of why I hadn't actually
proposed this change until now, where it becomes desirable for Salsa.

PiperOrigin-RevId: 459454675
3 files changed
tree: 6569ae1846fd26044c529e77bcafe33583d74c9b
  1. .bazelci/
  2. bazel/
  3. cc_template/
  4. common/
  5. docs/
  6. lifetime_analysis/
  7. lifetime_annotations/
  8. migrator/
  9. nullability_verification/
  10. rs_bindings_from_cc/
  11. .bazelrc
  12. .gitignore
  13. BUILD
  14. Cargo.Bazel.lock
  15. CODE_OF_CONDUCT
  16. CONTRIBUTING
  17. LICENSE
  18. README.md
  19. WORKSPACE
README.md

Crubit: C++/Rust Bidirectional Interop Tool

Build status

Extremely experimental interop tooling for C++ and Rust.

Please don‘t use, this is an experiment and we don’t yet know where will it take us. There will be breaking changes without warning. Unfortunately, we can't take contributions at this point.

Building Crubit

$ apt install clang lld bazel
$ git clone git@github.com:google/crubit.git
$ cd crubit
$ bazel build --linkopt=-fuse-ld=/usr/bin/ld.lld //rs_bindings_from_cc:rs_bindings_from_cc_impl

Using a prebuilt LLVM tree

$ git clone https://github.com/llvm/llvm-project
$ cd llvm-project
$ CC=clang CXX=clang++ cmake -S llvm -B build -DLLVM_ENABLE_PROJECTS='clang' -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install
$ cmake --build build -j
$ # wait...
$ cmake --install build
$ cd ../crubit
$ LLVM_INSTALL_PATH=../llvm-project/install bazel build //rs_bindings_from_cc:rs_bindings_from_cc_impl