| // Part of the Crubit project, under the Apache License v2.0 with LLVM |
| // Exceptions. See /LICENSE for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| #ifndef CRUBIT_LIFETIME_ANNOTATIONS_FUNCTION_LIFETIMES_H_ |
| #define CRUBIT_LIFETIME_ANNOTATIONS_FUNCTION_LIFETIMES_H_ |
| |
| #include <iosfwd> |
| #include <string> |
| |
| #include "lifetime_annotations/type_lifetimes.h" |
| #include "third_party/llvm/llvm-project/llvm/include/llvm/ADT/SmallVector.h" |
| |
| namespace devtools_rust { |
| |
| // Lifetimes for the signature of a function. |
| struct FunctionLifetimes { |
| // Lifetimes for the parameters. |
| // These are the same number and order as FunctionDecl::parameters(). |
| llvm::SmallVector<TypeLifetimes> param_lifetimes; |
| |
| // Lifetimes for the return type. |
| TypeLifetimes return_lifetimes; |
| |
| // Lifetimes for the `this` parameter for non-static member functions. |
| TypeLifetimes this_lifetimes; |
| |
| // Returns whether this object contains any lifetimes. |
| // Note that this returns false if `param_lifetimes` is non-empty but only |
| // contains empty TypeLifetimes. |
| bool ContainsLifetimes(); |
| |
| // Returns if the two FunctionLifetimes have the same structures, without |
| // requiring them to have the same exact Lifetimes. They have the same |
| // structure if unique vs reoccuring Lifetimes in `this` and `other` are found |
| // in the same positions. |
| bool IsIsomorphic(const FunctionLifetimes& other) const; |
| |
| // Returns a human-readable representation of `func_lifetimes`. Formats |
| // lifetimes using `formatter`, or Lifetime::DebugString() if `formatter` is |
| // null. |
| std::string DebugString(LifetimeFormatter formatter = [](Lifetime l) { |
| return l.DebugString(); |
| }) const; |
| }; |
| |
| std::ostream& operator<<(std::ostream& os, |
| const FunctionLifetimes& func_lifetimes); |
| |
| } // namespace devtools_rust |
| |
| #endif // CRUBIT_LIFETIME_ANNOTATIONS_FUNCTION_LIFETIMES_H_ |