20#include "absl/base/optimization.h"
21#include "absl/strings/ascii.h"
22#include "absl/strings/str_cat.h"
23#include "absl/strings/str_format.h"
24#include "absl/strings/str_join.h"
25#include "absl/strings/string_view.h"
26#include "absl/types/span.h"
40void EmitEnumerators(
const absl::Span<const absl::string_view> names,
42 for (
int i = 0;
i < names.size(); ++
i) {
43 absl::StrAppendFormat(out,
" %s = %i\n", absl::AsciiStrToUpper(names[i]),
49absl::string_view GetAttrPyValueType(
63absl::string_view GetAttrNumpyValueType(
78 PythonEnumsGenerator() : CodeGenerator(GetPythonFunctionInfos()) {}
80 void EmitHeader(std::string* out)
const override {
81 absl::StrAppend(out, R
"(
82'''DO NOT EDIT: This file is autogenerated.'''
85from typing import Generic, TypeVar, Union
91 void EmitElements(absl::Span<const absl::string_view> elements,
92 std::string* out)
const override {
94 absl::StrAppend(out,
"class ElementType(enum.Enum):\n");
95 EmitEnumerators(elements, out);
96 absl::StrAppend(out,
"\n");
99 void EmitAttributes(absl::Span<const CodegenAttrTypeDescriptor> descriptors,
100 std::string* out)
const override {
101 absl::StrAppend(out,
"\n");
105 std::set<absl::string_view> value_types;
106 for (
const auto& descriptor : descriptors) {
107 value_types.insert(GetAttrNumpyValueType(descriptor.value_type));
111 absl::StrAppend(out,
"AttrValueType = TypeVar('AttrValueType', ",
112 absl::StrJoin(value_types,
", "),
")\n");
114 absl::StrAppend(out,
"\n");
116 std::set<absl::string_view> py_value_types;
117 for (
const auto& descriptor : descriptors) {
118 py_value_types.insert(GetAttrPyValueType(descriptor.value_type));
120 absl::StrAppend(out,
"AttrPyValueType = TypeVar('AttrPyValueType', ",
121 absl::StrJoin(py_value_types,
", "),
")\n");
125 absl::StrAppend(out, R
"(
126class Attr(Generic[AttrValueType]):
131 absl::StrAppend(out, R
"(
132class PyAttr(Generic[AttrPyValueType]):
137 for (
const auto& descriptor : descriptors) {
138 absl::StrAppendFormat(
139 out,
"\nclass %s(Attr[%s], PyAttr[%s], int, enum.Enum):\n",
140 descriptor.name, GetAttrNumpyValueType(descriptor.value_type),
141 GetAttrPyValueType(descriptor.value_type));
142 EmitEnumerators(descriptor.attribute_names, out);
143 absl::StrAppend(out,
"\n");
148 out,
"AnyAttr = Union[",
151 [](std::string* out,
const CodegenAttrTypeDescriptor& descriptor) {
152 absl::StrAppend(out, descriptor.name);
161 return std::make_unique<PythonEnumsGenerator>();
std::unique_ptr< CodeGenerator > PythonEnums()
std::array< AttrOpFunctionInfo, kNumAttrOps > AttrOpFunctionInfos