Support multiple python versions for code generation

This commit is contained in:
Abdelrahman Said 2025-04-20 16:23:23 +01:00
parent 50e23d8a13
commit bf99bef291
4 changed files with 38 additions and 24 deletions

View File

@ -1,3 +1,4 @@
from typing import Dict
from codegen.datatypes import CDataType from codegen.datatypes import CDataType
from codegen.dbl_list.make_dbl_list import DblListData, make_dbl_list from codegen.dbl_list.make_dbl_list import DblListData, make_dbl_list
@ -7,7 +8,7 @@ def main():
def gen_dbl_list(): def gen_dbl_list():
datatypes: dict[CDataType, DblListData] = {} datatypes: Dict[CDataType, DblListData] = {}
make_dbl_list(datatypes) make_dbl_list(datatypes)

View File

@ -1,6 +1,6 @@
from enum import Enum from enum import Enum
from pathlib import Path from pathlib import Path
from typing import Optional, Union from typing import Optional, Union, List
from dataclasses import dataclass, field from dataclasses import dataclass, field
@ -70,7 +70,7 @@ class CEnumVal:
@dataclass @dataclass
class CEnum: class CEnum:
name: str name: str
values: list[CEnumVal] values: List[CEnumVal]
typedef: bool = False typedef: bool = False
def __str__(self) -> str: def __str__(self) -> str:
@ -100,8 +100,8 @@ class CMacro:
@dataclass @dataclass
class CStruct: class CStruct:
name: str name: str
cargs: list["CArg"] cargs: List["CArg"]
typedef_name: str | None = None typedef_name: Optional[str] = None
def __str__(self) -> str: def __str__(self) -> str:
return self.declare() + self.define() return self.declare() + self.define()
@ -145,10 +145,10 @@ class CArg:
class CFunc: class CFunc:
name: str name: str
ret_type: CDataType ret_type: CDataType
args: list[CArg] args: List[CArg]
body: str body: str
pointer: CPointer = field(default_factory=CPointer) pointer: CPointer = field(default_factory=CPointer)
qualifiers: list[CQualifier] = field(default_factory=list) qualifiers: List[CQualifier] = field(default_factory=list)
def __str__(self) -> str: def __str__(self) -> str:
qualifiers = "" qualifiers = ""
@ -203,8 +203,8 @@ class CInclude:
class CFile: class CFile:
name: str name: str
extension: str extension: str
decl_types: list[CStruct] = field(default_factory=list) decl_types: List[CStruct] = field(default_factory=list)
macros: list[CMacro] = field(default_factory=list) macros: List[CMacro] = field(default_factory=list)
def save(self, output_dir: Path): def save(self, output_dir: Path):
output_file = output_dir / f"{self.name}.{self.extension}" output_file = output_dir / f"{self.name}.{self.extension}"
@ -223,9 +223,9 @@ class CFile:
@dataclass @dataclass
class CHeader(CFile): class CHeader(CFile):
extension: str = "h" extension: str = "h"
includes: list[CInclude] = field(default_factory=list) includes: List[CInclude] = field(default_factory=list)
types: list[CUserType] = field(default_factory=list) types: List[CUserType] = field(default_factory=list)
funcs: list[CFunc] = field(default_factory=list) funcs: List[CFunc] = field(default_factory=list)
def __str__(self) -> str: def __str__(self) -> str:
name_upper = self.name.upper() name_upper = self.name.upper()
@ -275,10 +275,10 @@ class CHeader(CFile):
@dataclass @dataclass
class CSource(CFile): class CSource(CFile):
extension: str = "c" extension: str = "c"
includes: list[CInclude] = field(default_factory=list) includes: List[CInclude] = field(default_factory=list)
types: list[CUserType] = field(default_factory=list) types: List[CUserType] = field(default_factory=list)
internal_funcs: list[CFunc] = field(default_factory=list) internal_funcs: List[CFunc] = field(default_factory=list)
funcs: list[CFunc] = field(default_factory=list) funcs: List[CFunc] = field(default_factory=list)
def __str__(self) -> str: def __str__(self) -> str:
includes = _get_includes_string(self.includes) includes = _get_includes_string(self.includes)
@ -333,7 +333,7 @@ def get_datatype_string(_type: CDataType) -> str:
return _type return _type
def _get_includes_string(includes: list[CInclude]) -> str: def _get_includes_string(includes: List[CInclude]) -> str:
output = "" output = ""
for include in sorted(includes, key=lambda inc: inc.local, reverse=True): for include in sorted(includes, key=lambda inc: inc.local, reverse=True):
output += str(include) output += str(include)

View File

@ -1,7 +1,8 @@
from pathlib import Path from pathlib import Path
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import List, Dict
from codegen.constants import WAPP_SRC_ROOT from codegen.constants import WAPP_SRC_ROOT
from codegen.utils import load_func_body_from_file from codegen.utils import load_func_body_from_file, convert_to_relative
from codegen.datatypes import ( from codegen.datatypes import (
CDataType, CDataType,
CMacro, CMacro,
@ -23,11 +24,11 @@ from codegen.datatypes import (
class DblListData: class DblListData:
node_typename: str node_typename: str
list_typename: str list_typename: str
hdr_decl_types: list[CStruct] = field(default_factory=list) hdr_decl_types: List[CStruct] = field(default_factory=list)
src_decl_types: list[CStruct] = field(default_factory=list) src_decl_types: List[CStruct] = field(default_factory=list)
def make_dbl_list(user_datatypes: dict[CDataType, DblListData] = {}): def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
def __format_func_body( def __format_func_body(
filename: Path, filename: Path,
type_string: str, type_string: str,
@ -50,18 +51,18 @@ def make_dbl_list(user_datatypes: dict[CDataType, DblListData] = {}):
common_local_include_files = [ common_local_include_files = [
(WAPP_SRC_ROOT / "common" / "aliases" / "aliases.h") (WAPP_SRC_ROOT / "common" / "aliases" / "aliases.h")
] ]
common_includes: list[CInclude] = [ common_includes: List[CInclude] = [
CInclude(header="stdbool.h") CInclude(header="stdbool.h")
] ]
for local_file in common_local_include_files: for local_file in common_local_include_files:
common_includes.append( common_includes.append(
CInclude( CInclude(
header=str(local_file.relative_to(out_dir, walk_up=True)), header=str(convert_to_relative(local_file, out_dir)),
local=True, local=True,
) )
) )
common_decl_types: list[CStruct] = [] common_decl_types: List[CStruct] = []
datatypes: dict[CDataType, DblListData] = { datatypes: dict[CDataType, DblListData] = {
"Str8": DblListData( "Str8": DblListData(

View File

@ -1,6 +1,18 @@
import os
import sys
from pathlib import Path from pathlib import Path
def load_func_body_from_file(filename: Path) -> str: def load_func_body_from_file(filename: Path) -> str:
with open(filename, "r") as infile: with open(filename, "r") as infile:
return infile.read().rstrip() return infile.read().rstrip()
def convert_to_relative(path: Path, target: Path) -> Path:
major = sys.version_info.major
minor = sys.version_info.minor
if major >= 3 and minor >= 12:
return path.relative_to(target, walk_up=True)
else:
return Path(os.path.relpath(str(path), start=str(target)))