From 3c2e206914b14110a5dbd86fc6a6bfa2d3273b4c Mon Sep 17 00:00:00 2001 From: fliiiix Date: Fri, 12 Jul 2024 21:18:23 +0200 Subject: [PATCH 1/2] clang-format --- src/idl_gen_python.cpp | 96 +++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 61 deletions(-) diff --git a/src/idl_gen_python.cpp b/src/idl_gen_python.cpp index 1c814cd53cf..2fbc40d6914 100644 --- a/src/idl_gen_python.cpp +++ b/src/idl_gen_python.cpp @@ -52,9 +52,9 @@ class PythonStubGenerator { public: PythonStubGenerator(const Parser &parser, const std::string &path, const Version &version) - : parser_{parser}, - namer_{WithFlagOptions(kStubConfig, parser.opts, path), - Keywords(version)}, + : parser_{ parser }, + namer_{ WithFlagOptions(kStubConfig, parser.opts, path), + Keywords(version) }, version_(version) {} bool Generate() { @@ -140,8 +140,7 @@ class PythonStubGenerator { return module; } - template - std::string ModuleFor(const T *def) const { + template std::string ModuleFor(const T *def) const { if (parser_.opts.one_file) return ModuleForFile(def->file); return namer_.NamespacedType(*def); } @@ -165,7 +164,7 @@ class PythonStubGenerator { return "None"; } - template + template std::string UnionType(const EnumDef &enum_def, Imports *imports, F type) const { imports->Import("typing"); @@ -181,14 +180,9 @@ class PythonStubGenerator { result += import.name; break; } - case BASE_TYPE_STRING: - result += "str"; - break; - case BASE_TYPE_NONE: - result += "None"; - break; - default: - break; + case BASE_TYPE_STRING: result += "str"; break; + case BASE_TYPE_NONE: result += "None"; break; + default: break; } } return "typing.Union[" + result + "]"; @@ -229,18 +223,14 @@ class PythonStubGenerator { namer_.Type(*type.struct_def)); return import.name; } - case BASE_TYPE_STRING: - return "str"; + case BASE_TYPE_STRING: return "str"; case BASE_TYPE_ARRAY: case BASE_TYPE_VECTOR: { imports->Import("typing"); return "typing.List[" + TypeOf(type.VectorType(), imports) + "]"; } - case BASE_TYPE_UNION: - return UnionType(*type.enum_def, imports); - default: - FLATBUFFERS_ASSERT(0); - return ""; + case BASE_TYPE_UNION: return UnionType(*type.enum_def, imports); + default: FLATBUFFERS_ASSERT(0); return ""; } } @@ -262,8 +252,7 @@ class PythonStubGenerator { namer_.ObjectType(*field_type.struct_def)); return field_name + ": " + import.name + " | None"; } - case BASE_TYPE_STRING: - return field_name + ": str | None"; + case BASE_TYPE_STRING: return field_name + ": str | None"; case BASE_TYPE_ARRAY: case BASE_TYPE_VECTOR: { imports->Import("typing"); @@ -282,8 +271,7 @@ class PythonStubGenerator { case BASE_TYPE_UNION: return field_name + ": " + UnionObjectType(*field->value.type.enum_def, imports); - default: - return field_name; + default: return field_name; } } @@ -424,8 +412,7 @@ class PythonStubGenerator { stub << " def " << name << "(self) -> table.Table | None: ...\n"; break; } - default: - break; + default: break; } } } @@ -469,9 +456,7 @@ class PythonStubGenerator { stub << '\n'; stub << "def Create" + namer_.Type(*struct_def) << "(builder: flatbuffers.Builder"; - for (const std::string &arg : args) { - stub << ", " << arg; - } + for (const std::string &arg : args) { stub << ", " << arg; } stub << ") -> uoffset: ...\n"; } @@ -546,11 +531,10 @@ class PythonStubGenerator { Imports *imports) const { stub << "class " << namer_.Type(*enum_def); - if (version_.major == 3){ + if (version_.major == 3) { imports->Import("enum", "IntEnum"); stub << "(IntEnum)"; - } - else { + } else { stub << "(object)"; } @@ -573,9 +557,7 @@ class PythonStubGenerator { ss << "from __future__ import annotations\n"; ss << '\n'; ss << "import flatbuffers\n"; - if (parser_.opts.python_gen_numpy) { - ss << "import numpy as np\n"; - } + if (parser_.opts.python_gen_numpy) { ss << "import numpy as np\n"; } ss << '\n'; std::set modules; @@ -607,7 +589,8 @@ class PythonStubGenerator { const Parser &parser_; const IdlNamer namer_; const Version version_; -};} // namespace +}; +} // namespace class PythonGenerator : public BaseGenerator { public: @@ -616,8 +599,8 @@ class PythonGenerator : public BaseGenerator { : BaseGenerator(parser, path, file_name, "" /* not used */, "" /* not used */, "py"), float_const_gen_("float('nan')", "float('inf')", "float('-inf')"), - namer_(WithFlagOptions(kConfig, parser.opts, path), - Keywords(version)) {} + namer_(WithFlagOptions(kConfig, parser.opts, path), Keywords(version)) { + } // Most field accessors need to retrieve and test the field offset first, // this is the prefix code for that. @@ -807,9 +790,8 @@ class PythonGenerator : public BaseGenerator { GenReceiver(struct_def, code_ptr); code += namer_.Method(field); - const ImportMapEntry import_entry = { - GenPackageReference(field.value.type), TypeName(field) - }; + const ImportMapEntry import_entry = { GenPackageReference(field.value.type), + TypeName(field) }; if (parser_.opts.python_typing) { const std::string return_type = ReturnType(struct_def, field); @@ -869,9 +851,8 @@ class PythonGenerator : public BaseGenerator { GenReceiver(struct_def, code_ptr); code += namer_.Method(field) + "(self)"; - const ImportMapEntry import_entry = { - GenPackageReference(field.value.type), TypeName(field) - }; + const ImportMapEntry import_entry = { GenPackageReference(field.value.type), + TypeName(field) }; if (parser_.opts.python_typing) { const std::string return_type = ReturnType(struct_def, field); @@ -957,11 +938,8 @@ class PythonGenerator : public BaseGenerator { code += Indent + Indent + "return None\n\n"; } - template - std::string ModuleFor(const T *def) const { - if (!parser_.opts.one_file) { - return namer_.NamespacedType(*def); - } + template std::string ModuleFor(const T *def) const { + if (!parser_.opts.one_file) { return namer_.NamespacedType(*def); } std::string filename = StripExtension(def->file) + parser_.opts.filename_suffix; @@ -991,9 +969,8 @@ class PythonGenerator : public BaseGenerator { GenReceiver(struct_def, code_ptr); code += namer_.Method(field); - const ImportMapEntry import_entry = { - GenPackageReference(field.value.type), TypeName(field) - }; + const ImportMapEntry import_entry = { GenPackageReference(field.value.type), + TypeName(field) }; if (parser_.opts.python_typing) { const std::string return_type = ReturnType(struct_def, field); @@ -1116,8 +1093,7 @@ class PythonGenerator : public BaseGenerator { std::string qualified_name = NestedFlatbufferType(unqualified_name); if (qualified_name.empty()) { qualified_name = nested->constant; } - const ImportMapEntry import_entry = { qualified_name, - unqualified_name }; + const ImportMapEntry import_entry = { qualified_name, unqualified_name }; auto &code = *code_ptr; GenReceiver(struct_def, code_ptr); @@ -2226,9 +2202,9 @@ class PythonGenerator : public BaseGenerator { if (parser_.opts.python_gen_numpy) { code_prefix += GenIndents(3) + "if np is not None and type(self." + - field_field + ") is np.ndarray:"; + field_field + ") is np.ndarray:"; code_prefix += GenIndents(4) + field_field + - " = builder.CreateNumpyVector(self." + field_field + ")"; + " = builder.CreateNumpyVector(self." + field_field + ")"; code_prefix += GenIndents(3) + "else:"; GenPackForScalarVectorFieldHelper(struct_def, field, code_prefix_ptr, 4); code_prefix += "(self." + field_field + "[i])"; @@ -2676,9 +2652,7 @@ class PythonGenerator : public BaseGenerator { } } } - if (parser_.opts.python_gen_numpy) { - code += "np = import_numpy()\n\n"; - } + if (parser_.opts.python_gen_numpy) { code += "np = import_numpy()\n\n"; } } } @@ -2719,7 +2693,7 @@ class PythonGenerator : public BaseGenerator { static bool GeneratePython(const Parser &parser, const std::string &path, const std::string &file_name) { - python::Version version{parser.opts.python_version}; + python::Version version{ parser.opts.python_version }; if (!version.IsValid()) return false; python::PythonGenerator generator(parser, path, file_name, version); From 2a1790ec60ecb689fea16aec41649dd18a81e39f Mon Sep 17 00:00:00 2001 From: fliiiix Date: Fri, 12 Jul 2024 21:18:32 +0200 Subject: [PATCH 2/2] [Python] Fix import in pyi files Importing the Base type for `--gen-object-api` in `.pyi` files eg. `from namespace.Type import Type` can lead to re-export issues depeding on how the generated code is embeded. To prevent this the import is removed since the data Type is always defined just on top. --- src/idl_gen_python.cpp | 11 +++-------- tests/MyGame/Example/ArrayStruct.pyi | 2 -- tests/MyGame/Example/ArrayTable.pyi | 1 - tests/MyGame/Example/NestedStruct.pyi | 2 -- tests/MyGame/Example/NestedUnion/Any.pyi | 1 - tests/MyGame/Example/NestedUnion/NestedUnionTest.pyi | 2 -- tests/MyGame/Example/NestedUnion/Test.pyi | 1 - .../Example/NestedUnion/TestSimpleTableWithEnum.pyi | 2 -- tests/MyGame/Example/NestedUnion/Vec3.pyi | 2 -- tests/MyGame/MonsterExtra.pyi | 1 - 10 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/idl_gen_python.cpp b/src/idl_gen_python.cpp index 2fbc40d6914..6834352dd2e 100644 --- a/src/idl_gen_python.cpp +++ b/src/idl_gen_python.cpp @@ -202,13 +202,11 @@ class PythonStubGenerator { std::string EnumType(const EnumDef &enum_def, Imports *imports) const { imports->Import("typing"); - const Import &import = - imports->Import(ModuleFor(&enum_def), namer_.Type(enum_def)); std::string result = ""; for (const EnumVal *val : enum_def.Vals()) { if (!result.empty()) result += ", "; - result += import.name + "." + namer_.Variant(*val); + result += namer_.Type(enum_def) + "." + namer_.Variant(*val); } return "typing.Literal[" + result + "]"; } @@ -295,15 +293,12 @@ class PythonStubGenerator { stub << " def InitFromPackedBuf(cls, buf: bytes, pos: int = 0) -> " << name << ": ...\n"; - const Import &import = - imports->Import(ModuleFor(struct_def), namer_.Type(*struct_def)); - stub << " @classmethod\n"; stub << " def InitFromObj(cls, " << namer_.Variable(*struct_def) - << ": " + import.name + ") -> " << name << ": ...\n"; + << ": " + namer_.Type(*struct_def) + ") -> " << name << ": ...\n"; stub << " def _UnPack(self, " << namer_.Variable(*struct_def) << ": " - << import.name << ") -> None: ...\n"; + << namer_.Type(*struct_def) << ") -> None: ...\n"; stub << " def Pack(self, builder: flatbuffers.Builder) -> None: ...\n"; diff --git a/tests/MyGame/Example/ArrayStruct.pyi b/tests/MyGame/Example/ArrayStruct.pyi index 29bb83c6762..3453a1ab98d 100644 --- a/tests/MyGame/Example/ArrayStruct.pyi +++ b/tests/MyGame/Example/ArrayStruct.pyi @@ -5,9 +5,7 @@ import numpy as np import flatbuffers import typing -from MyGame.Example.ArrayStruct import ArrayStruct from MyGame.Example.NestedStruct import NestedStruct, NestedStructT -from MyGame.Example.TestEnum import TestEnum uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type diff --git a/tests/MyGame/Example/ArrayTable.pyi b/tests/MyGame/Example/ArrayTable.pyi index 10f2af31951..5d713418d46 100644 --- a/tests/MyGame/Example/ArrayTable.pyi +++ b/tests/MyGame/Example/ArrayTable.pyi @@ -6,7 +6,6 @@ import numpy as np import flatbuffers import typing from MyGame.Example.ArrayStruct import ArrayStruct, ArrayStructT -from MyGame.Example.ArrayTable import ArrayTable uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type diff --git a/tests/MyGame/Example/NestedStruct.pyi b/tests/MyGame/Example/NestedStruct.pyi index 09e6fc68927..f191e21d0ae 100644 --- a/tests/MyGame/Example/NestedStruct.pyi +++ b/tests/MyGame/Example/NestedStruct.pyi @@ -5,8 +5,6 @@ import numpy as np import flatbuffers import typing -from MyGame.Example.NestedStruct import NestedStruct -from MyGame.Example.TestEnum import TestEnum uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type diff --git a/tests/MyGame/Example/NestedUnion/Any.pyi b/tests/MyGame/Example/NestedUnion/Any.pyi index dee0f7f2e38..f4809211b19 100644 --- a/tests/MyGame/Example/NestedUnion/Any.pyi +++ b/tests/MyGame/Example/NestedUnion/Any.pyi @@ -5,7 +5,6 @@ import numpy as np import flatbuffers import typing -from MyGame.Example.NestedUnion.Any import Any from MyGame.Example.NestedUnion.TestSimpleTableWithEnum import TestSimpleTableWithEnum from MyGame.Example.NestedUnion.Vec3 import Vec3 from flatbuffers import table diff --git a/tests/MyGame/Example/NestedUnion/NestedUnionTest.pyi b/tests/MyGame/Example/NestedUnion/NestedUnionTest.pyi index 06a906d4024..a43ec4be284 100644 --- a/tests/MyGame/Example/NestedUnion/NestedUnionTest.pyi +++ b/tests/MyGame/Example/NestedUnion/NestedUnionTest.pyi @@ -5,8 +5,6 @@ import numpy as np import flatbuffers import typing -from MyGame.Example.NestedUnion.Any import Any -from MyGame.Example.NestedUnion.NestedUnionTest import NestedUnionTest from MyGame.Example.NestedUnion.TestSimpleTableWithEnum import TestSimpleTableWithEnumT from MyGame.Example.NestedUnion.Vec3 import Vec3T from flatbuffers import table diff --git a/tests/MyGame/Example/NestedUnion/Test.pyi b/tests/MyGame/Example/NestedUnion/Test.pyi index 2fa64aa8202..f1cfa321f3a 100644 --- a/tests/MyGame/Example/NestedUnion/Test.pyi +++ b/tests/MyGame/Example/NestedUnion/Test.pyi @@ -5,7 +5,6 @@ import numpy as np import flatbuffers import typing -from MyGame.Example.NestedUnion.Test import Test uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type diff --git a/tests/MyGame/Example/NestedUnion/TestSimpleTableWithEnum.pyi b/tests/MyGame/Example/NestedUnion/TestSimpleTableWithEnum.pyi index 117b19d532d..95ab5dbe62b 100644 --- a/tests/MyGame/Example/NestedUnion/TestSimpleTableWithEnum.pyi +++ b/tests/MyGame/Example/NestedUnion/TestSimpleTableWithEnum.pyi @@ -5,8 +5,6 @@ import numpy as np import flatbuffers import typing -from MyGame.Example.NestedUnion.Color import Color -from MyGame.Example.NestedUnion.TestSimpleTableWithEnum import TestSimpleTableWithEnum uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type diff --git a/tests/MyGame/Example/NestedUnion/Vec3.pyi b/tests/MyGame/Example/NestedUnion/Vec3.pyi index c570c20b4c1..0e7d21d43d9 100644 --- a/tests/MyGame/Example/NestedUnion/Vec3.pyi +++ b/tests/MyGame/Example/NestedUnion/Vec3.pyi @@ -5,9 +5,7 @@ import numpy as np import flatbuffers import typing -from MyGame.Example.NestedUnion.Color import Color from MyGame.Example.NestedUnion.Test import Test, TestT -from MyGame.Example.NestedUnion.Vec3 import Vec3 uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type diff --git a/tests/MyGame/MonsterExtra.pyi b/tests/MyGame/MonsterExtra.pyi index 693cc512673..5088cd2765b 100644 --- a/tests/MyGame/MonsterExtra.pyi +++ b/tests/MyGame/MonsterExtra.pyi @@ -5,7 +5,6 @@ import numpy as np import flatbuffers import typing -from MyGame.MonsterExtra import MonsterExtra uoffset: typing.TypeAlias = flatbuffers.number_types.UOffsetTFlags.py_type