blob: 8ceff69ab4620926f7d23ff34445ef1d9d31c8b9 [file] [log] [blame]
Googler741ed9c2021-10-01 08:00:49 +00001// Part of the Crubit project, under the Apache License v2.0 with LLVM
2// Exceptions. See /LICENSE for license information.
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4
Dmitri Gribenkoe4e77d02022-03-17 14:09:39 +00005#ifndef CRUBIT_RS_BINDINGS_FROM_CC_IR_FROM_CC_H_
6#define CRUBIT_RS_BINDINGS_FROM_CC_IR_FROM_CC_H_
Googler741ed9c2021-10-01 08:00:49 +00007
Marcel Hlopko7aa38a72021-11-11 07:39:51 +00008#include <string>
9
Lukasz Anforowiczcec7a8a2022-04-27 10:24:51 -070010#include "absl/container/flat_hash_map.h"
11#include "absl/status/statusor.h"
12#include "absl/strings/string_view.h"
13#include "absl/types/span.h"
Marcel Hlopko3b254b32022-03-09 14:10:49 +000014#include "rs_bindings_from_cc/bazel_types.h"
15#include "rs_bindings_from_cc/ir.h"
Googler741ed9c2021-10-01 08:00:49 +000016
Marcel Hlopkof15e8ce2022-04-08 08:46:09 -070017namespace crubit {
Googler741ed9c2021-10-01 08:00:49 +000018
Marcel Hlopko20de6de2022-09-13 05:28:08 -070019// Name of the namespace in which we generate code that triggers class template
20// instantiations.
21static constexpr absl::string_view kInstantiationsNamespaceName =
22 "__cc_template_instantiations";
23
Devin Jeanpierredf4dc8b2021-10-21 12:53:19 +000024// Parses C++ source code into IR.
25//
26// Parameters:
Lukasz Anforowicz121338a2022-11-01 14:28:32 -070027// * `extra_source_code_for_testing`: C++ source code to be written into a
28// virtual header and included in binding generation. Intended for testing
29// only.
Marcel Hlopko7aa38a72021-11-11 07:39:51 +000030// * `current_target`: full label of the target for which we generate bindings.
31// If not specified `//test:testing_target` is used.
32// * `public_headers`: names of headers from which we build the Clang AST. If
Lukasz Anforowicz121338a2022-11-01 14:28:32 -070033// `extra_source_code_for_testing` is specified its header will be added
34// automatically.
35// * `virtual_headers_contents_for_testing`: names and contents of virtual
36// headers that will be created in the virtual filesystem. These headers have
37// to be manually added to `public_headers` if needed.
Marcel Hlopko7aa38a72021-11-11 07:39:51 +000038// * `headers_to_targets`: mapping of headers to the label of the owning target.
39// If `extra_source_code` is specified it's added automatically under
Lukasz Anforowicz121338a2022-11-01 14:28:32 -070040// `//test:testing_target`. Headers from
41// `virtual_headers_contents_for_testing` are not added automatically.
42// * `clang_args`: additional command line arguments for Clang
Devin Jeanpierre96bf0bd2022-10-04 20:32:15 -070043// * `extra_rs_srcs`: A list of paths for additional rust files to include into
44// the crate. This is done via `#[path="..."] mod <...>; pub use <...>::*;`.
Marcel Hlopko2ee23912022-05-09 06:13:55 -070045// * `extra_instantiations`: names of full C++ class template specializations
46// to instantiate and generate bindings from.
Devin Jeanpierredf4dc8b2021-10-21 12:53:19 +000047//
Michael Forster3f323be2021-10-11 07:13:28 +000048absl::StatusOr<IR> IrFromCc(
Lukasz Anforowicz121338a2022-11-01 14:28:32 -070049 absl::string_view extra_source_code_for_testing,
Googler6c3de122022-03-28 11:40:41 +000050 BazelLabel current_target = BazelLabel{"//test:testing_target"},
Marcel Hlopko7aa38a72021-11-11 07:39:51 +000051 absl::Span<const HeaderName> public_headers = {},
52 absl::flat_hash_map<const HeaderName, const std::string>
Lukasz Anforowicz121338a2022-11-01 14:28:32 -070053 virtual_headers_contents_for_testing = {},
Googler6c3de122022-03-28 11:40:41 +000054 absl::flat_hash_map<const HeaderName, const BazelLabel> headers_to_targets =
Googlere05154d2022-01-10 08:39:03 +000055 {},
Devin Jeanpierre96bf0bd2022-10-04 20:32:15 -070056 absl::Span<const std::string> extra_rs_srcs = {},
Lukasz Anforowicz121338a2022-11-01 14:28:32 -070057 absl::Span<const absl::string_view> clang_args = {},
Marcel Hlopko2ee23912022-05-09 06:13:55 -070058 absl::Span<const std::string> extra_instantiations = {});
Googler741ed9c2021-10-01 08:00:49 +000059
Marcel Hlopkof15e8ce2022-04-08 08:46:09 -070060} // namespace crubit
Googler741ed9c2021-10-01 08:00:49 +000061
Dmitri Gribenkoe4e77d02022-03-17 14:09:39 +000062#endif // CRUBIT_RS_BINDINGS_FROM_CC_IR_FROM_CC_H_