diff options
author | Amir Gonnen <amirgonnen@gmail.com> | 2019-03-26 14:53:19 +0200 |
---|---|---|
committer | Eli Bendersky <eliben@users.noreply.github.com> | 2019-03-26 05:53:19 -0700 |
commit | 96059858252ea3673226a9a4d03a356bd51ba47e (patch) | |
tree | b9372d42024d60bac15c6aa9a8aa66ca24498e5b | |
parent | 992715f12aef69eb1351308f14fb5f1ff972ce57 (diff) | |
download | pycparser-96059858252ea3673226a9a4d03a356bd51ba47e.tar.gz |
Fix array type generation (#312) (#313)
* Fix array type generation (#312)
Also added dim_quals handling to _generate_type
Exmaple:
>>> ast = parser.parse('int g(const int a[const 20]){}')
>>> gen.visit(ast.ext[0].decl.type.args.params[0])
'const int a[const 20]'
>>> gen.visit(ast.ext[0].decl.type.args.params[0].type)
'int[const 20]'
* Added TypeDecl generation. Added tests
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | pycparser/c_generator.py | 18 | ||||
-rw-r--r-- | tests/test_c_generator.py | 6 |
3 files changed, 24 insertions, 2 deletions
@@ -14,4 +14,4 @@ parser.out .tox utils/z.c *.egg-info - +*.swp diff --git a/pycparser/c_generator.py b/pycparser/c_generator.py index f789742..bc22946 100644 --- a/pycparser/c_generator.py +++ b/pycparser/c_generator.py @@ -291,6 +291,20 @@ class CGenerator(object): def visit_FuncDecl(self, n): return self._generate_type(n) + def visit_ArrayDecl(self, n): + s = '' + s += self.visit(n.type) + '[' + if n.dim_quals: s += ' '.join(n.dim_quals) + ' ' + if n.dim: s += self.visit(n.dim) + s += ']' + return s + + def visit_TypeDecl(self, n): + s = '' + if n.quals: s += ' '.join(n.quals) + ' ' + s += self.visit(n.type) + return s + def _generate_struct_union_enum(self, n, name): """ Generates code for structs, unions, and enums. name should be 'struct', 'union', or 'enum'. @@ -382,7 +396,9 @@ class CGenerator(object): if isinstance(modifier, c_ast.ArrayDecl): if (i != 0 and isinstance(modifiers[i - 1], c_ast.PtrDecl)): nstr = '(' + nstr + ')' - nstr += '[' + self.visit(modifier.dim) + ']' + nstr += '[' + if modifier.dim_quals: nstr += ' '.join(modifier.dim_quals) + ' ' + nstr += self.visit(modifier.dim) + ']' elif isinstance(modifier, c_ast.FuncDecl): if (i != 0 and isinstance(modifiers[i - 1], c_ast.PtrDecl)): nstr = '(' + nstr + ')' diff --git a/tests/test_c_generator.py b/tests/test_c_generator.py index 3727f91..e2f7bee 100644 --- a/tests/test_c_generator.py +++ b/tests/test_c_generator.py @@ -332,6 +332,12 @@ class TestCtoC(unittest.TestCase): name='', ) + def test_array_decl(self): + self._assert_ctoc_correct('int g(const int a[const 20]){}') + ast = parse_to_ast('const int a[const 20];') + generator = c_generator.CGenerator() + self.assertEqual(generator.visit(ast.ext[0].type), 'const int[const 20]') + self.assertEqual(generator.visit(ast.ext[0].type.type), 'const int') if __name__ == "__main__": unittest.main() |