comparison Resources/CodeGeneration/stonegentool.py @ 494:fc17251477d6 bgo-commands-codegen

TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
author bgo-osimis
date Sat, 23 Feb 2019 10:18:13 +0100
parents 6fbf2eae7c88
children 8b6ceae45ba0
comparison
equal deleted inserted replaced
493:6fbf2eae7c88 494:fc17251477d6
1 import json 1 import json
2 import yaml 2 import yaml
3 import re 3 import re
4 import os
4 import sys 5 import sys
5 from jinja2 import Template 6 from jinja2 import Template
6 from typing import ( 7 from typing import (
7 Any, 8 Any,
8 Dict, 9 Dict,
115 # replace float32 by float 116 # replace float32 by float
116 # replace float64 by double 117 # replace float64 by double
117 retVal: str = canonicalTypename 118 retVal: str = canonicalTypename
118 retVal = retVal.replace("map", "std::map") 119 retVal = retVal.replace("map", "std::map")
119 retVal = retVal.replace("vector", "std::vector") 120 retVal = retVal.replace("vector", "std::vector")
121 retVal = retVal.replace("string", "std::string")
120 retVal = retVal.replace("int32", "int32_t") 122 retVal = retVal.replace("int32", "int32_t")
121 retVal = retVal.replace("float32", "float") 123 retVal = retVal.replace("float32", "float")
122 retVal = retVal.replace("float64", "double") 124 retVal = retVal.replace("float64", "double")
123 return retVal 125 return retVal
124 126
135 retVal = retVal.replace("float32", "number") 137 retVal = retVal.replace("float32", "number")
136 retVal = retVal.replace("float64", "number") 138 retVal = retVal.replace("float64", "number")
137 retVal = retVal.replace("bool", "boolean") 139 retVal = retVal.replace("bool", "boolean")
138 return retVal 140 return retVal
139 141
140 def NeedsConstruction(canonTypename): 142 def NeedsTsConstruction(enums: Dict, tsType: str):
143 if tsType == 'boolean':
144 return False
145 elif tsType == 'number':
146 return False
147 elif tsType == 'string':
148 return False
149 else:
150 enumNames = []
151 for enum in enums:
152 enumNames.append(enum['name'])
153 if tsType in enumNames:
154 return False
141 return True 155 return True
156
157 def NeedsCppConstruction(canonTypename):
158 return False
142 159
143 def RegisterTemplateFunction(template,func): 160 def RegisterTemplateFunction(template,func):
144 """Makes a function callable by a jinja2 template""" 161 """Makes a function callable by a jinja2 template"""
145 template.globals[func.__name__] = func 162 template.globals[func.__name__] = func
146 return func 163 return func
147 164
148 def MakeTemplate(templateStr): 165 def MakeTemplate(templateStr):
149 template = Template(templateStr) 166 template = Template(templateStr)
150 RegisterTemplateFunction(template,CanonToCpp) 167 RegisterTemplateFunction(template,CanonToCpp)
151 RegisterTemplateFunction(template,CanonToTs) 168 RegisterTemplateFunction(template,CanonToTs)
152 RegisterTemplateFunction(template,NeedsConstruction) 169 RegisterTemplateFunction(template,NeedsTsConstruction)
170 RegisterTemplateFunction(template,NeedsCppConstruction)
153 return template 171 return template
154 172
155 def MakeTemplateFromFile(templateFileName): 173 def MakeTemplateFromFile(templateFileName):
156 templateFile = open(templateFileName, "r") 174 templateFile = open(templateFileName, "r")
157 templateFileContents = templateFile.read() 175 templateFileContents = templateFile.read()
474 only, 1 == some verbosity, 2 == nerd 492 only, 1 == some verbosity, 2 == nerd
475 mode""", 493 mode""",
476 ) 494 )
477 495
478 args = parser.parse_args() 496 args = parser.parse_args()
479 inputSchemaFilename = args.input_schema 497 schemaFile = args.input_schema
480 outDir = args.out_dir 498 outDir = args.out_dir
481 499
482 schema: Dict = LoadSchema(inputSchemaFilename) 500 tdico: Dict = GetTemplatingDictFromSchemaFilename(schemaFile)
483 genOrder: List[str] = ComputeRequiredDeclarationOrder(schema) 501
484 processedSchema: Dict = ProcessSchema(schema,genOrder) 502 tsTemplateFile = \
503 os.path.join(os.path.dirname(__file__), 'template.in.ts')
504 template = MakeTemplateFromFile(tsTemplateFile)
505 renderedTsCode: str = template.render(**tdico)
506 outputTsFile = os.path.join( \
507 outDir,f"{tdico['rootName']}_generated.ts")
508 with open(outputTsFile,"wt",encoding='utf8') as outFile:
509 outFile.write(renderedTsCode)
510
511 cppTemplateFile = \
512 os.path.join(os.path.dirname(__file__), 'template.in.h')
513 template = MakeTemplateFromFile(cppTemplateFile)
514 renderedCppCode: str = template.render(**tdico)
515 outputCppFile = os.path.join( \
516 outDir,f"{tdico['rootName']}_generated.hpp")
517 with open(outputCppFile,"wt",encoding='utf8') as outFile:
518 outFile.write(renderedCppCode)
485 519
486 520
487 # def GenEnumDecl(genc: GenCode, fullName: str, schema: Dict) -> None: 521 # def GenEnumDecl(genc: GenCode, fullName: str, schema: Dict) -> None:
488 # """Writes the enumerations in genc""" 522 # """Writes the enumerations in genc"""
489 # enumDict:Dict=schema[fullName] 523 # enumDict:Dict=schema[fullName]