20#include "absl/strings/ascii.h"
21#include "absl/strings/str_cat.h"
22#include "absl/strings/str_format.h"
23#include "absl/strings/str_join.h"
24#include "absl/strings/string_view.h"
25#include "absl/types/span.h"
39void EmitEnumerators(
const absl::Span<const absl::string_view> names,
41 for (
int i = 0;
i < names.size(); ++
i) {
42 absl::StrAppendFormat(out,
" %s = %i\n", absl::AsciiStrToUpper(names[i]),
48absl::string_view GetAttrPyValueType(
61absl::string_view GetAttrNumpyValueType(
75 PythonEnumsGenerator() : CodeGenerator(GetPythonFunctionInfos()) {}
77 void EmitHeader(std::string* out)
const override {
78 absl::StrAppend(out, R
"(
79'''DO NOT EDIT: This file is autogenerated.'''
82from typing import Generic, TypeVar, Union
88 void EmitElements(absl::Span<const absl::string_view> elements,
89 std::string* out)
const override {
91 absl::StrAppend(out,
"class ElementType(enum.Enum):\n");
92 EmitEnumerators(elements, out);
93 absl::StrAppend(out,
"\n");
96 void EmitAttributes(absl::Span<const CodegenAttrTypeDescriptor> descriptors,
97 std::string* out)
const override {
98 absl::StrAppend(out,
"\n");
102 std::set<absl::string_view> value_types;
103 for (
const auto& descriptor : descriptors) {
104 value_types.insert(GetAttrNumpyValueType(descriptor.value_type));
108 absl::StrAppend(out,
"AttrValueType = TypeVar('AttrValueType', ",
109 absl::StrJoin(value_types,
", "),
")\n");
111 absl::StrAppend(out,
"\n");
113 std::set<absl::string_view> py_value_types;
114 for (
const auto& descriptor : descriptors) {
115 py_value_types.insert(GetAttrPyValueType(descriptor.value_type));
117 absl::StrAppend(out,
"AttrPyValueType = TypeVar('AttrPyValueType', ",
118 absl::StrJoin(py_value_types,
", "),
")\n");
122 absl::StrAppend(out, R
"(
123class Attr(Generic[AttrValueType]):
128 absl::StrAppend(out, R
"(
129class PyAttr(Generic[AttrPyValueType]):
134 for (
const auto& descriptor : descriptors) {
135 absl::StrAppendFormat(
136 out,
"\nclass %s(Attr[%s], PyAttr[%s], int, enum.Enum):\n",
137 descriptor.name, GetAttrNumpyValueType(descriptor.value_type),
138 GetAttrPyValueType(descriptor.value_type));
139 EmitEnumerators(descriptor.attribute_names, out);
140 absl::StrAppend(out,
"\n");
145 out,
"AnyAttr = Union[",
148 [](std::string* out,
const CodegenAttrTypeDescriptor& descriptor) {
149 absl::StrAppend(out, descriptor.name);
158 return std::make_unique<PythonEnumsGenerator>();
The code generator interface.
Language-agnostic utilities for Elemental codegen.
std::unique_ptr< CodeGenerator > PythonEnums()
std::array< AttrOpFunctionInfo, kNumAttrOps > AttrOpFunctionInfos
ValueType
The value type of the attribute.