5 addNode("ArrayType", "Expr", "len", "Expr", "elt", "Expr")
15 addNode("BadDecl", "Decl")
16 addNode("BadExpr", "Expr")
17 addNode("BadStmt", "Stmt")
18 addNode("BasicLit", "Expr", "value", "Token")
19 addNode("BinaryExpr", "Expr", "x", "Expr", "y", "Expr", "op", "TokenType")
20 addNode("BlockStmt", "Stmt", "list", "[]Stmt")
21 addNode("Ident", "Expr", "name", "Token")
22 addNode("BranchStmt", "Stmt", "label", "Ident", "tok", "TokenType")
32 addNode("CaseClause", "Stmt", "list", "[]Expr", "body", "[]Stmt")
33 addNode("ChanType", "Expr", "dir", "ChanDir", "value", "Expr")
34 addNode("CommClause", "Stmt", "comm", "Stmt", "body", "[]Stmt")
35 addNode("CompositeLit", "Expr", "type", "Expr", "elts", "[]Expr")
36 addNode("DeclStmt", "Stmt", "decl", "Decl")
37 addNode("DeferStmt", "Stmt", "call", "CallExpr")
38 addNode("Ellipsis", "Expr", "elt", "Expr")
39 addNode("EmptyStmt", "Stmt")
40 addNode("ExprStmt", "Stmt", "x", "Expr")
50 addNode("FieldList", "Node", "list", "[]Field")
62 addNode("FuncType", "Expr", "params", "FieldList", "results", "FieldList")
74 addNode("FuncLit", "Expr", "type", "FuncType", "body", "BlockStmt")
75 addNode("GenDecl", "Decl", "tok", "TokenType", "specs", "[]Spec")
76 addNode("GoStmt", "Stmt", "call", "CallExpr")
88 addNode("ImportSpec", "Spec", "name", "Ident", "path", "BasicLit")
89 addNode("IncDecStmt", "Stmt", "x", "Expr", "tok", "TokenType")
90 addNode("IndexExpr", "Expr", "x", "Expr", "index", "Expr")
91 addNode("InterfaceType", "Expr", "methods", "FieldList")
92 addNode("KeyValueExpr", "Expr", "key", "Expr", "value", "Expr")
93 addNode("LabeledStmt", "Stmt", "label", "Ident", "stmt", "Stmt")
94 addNode("MapType", "Expr", "key", "Expr", "value", "Expr")
95 addNode("ParenExpr", "Expr", "x", "Expr")
109 addNode("ReturnStmt", "Stmt", "results", "[]Expr")
110 addNode("SelectStmt", "Stmt", "body", "BlockStmt")
111 addNode("SelectorExpr", "Expr", "x", "Expr", "sel", "Ident")
112 addNode("SendStmt", "Stmt", "chan", "Expr", "value", "Expr")
126 addNode("StarExpr", "Expr", "x", "Expr")
127 addNode("StructType", "Expr", "fields", "FieldList")
137 addNode("TypeAssertExpr", "Expr", "x", "Expr", "type", "Expr")
138 addNode("TypeSpec", "Spec", "name", "Ident", "type", "Expr")
148 addNode("UnaryExpr", "Expr", "op", "TokenType", "x", "Expr")
158 addParent("Decl", "Node")
159 addParent("Expr", "Node")
160 addParent("Spec", "Node")
161 addParent("Stmt", "Node")
164 class Member(object):
166 def __init__(self, name, typename):
167 self.title = name.title()
169 self.mname = 'm_' + name
170 self.is_list = typename.startswith("[]")
171 self.is_value = isValueType(typename)
173 self.argtype = typename
174 self.mtype = typename
176 self.argtype = 'GoAST' + typename[2:]
177 self.mtype = 'std::vector<std::unique_ptr<%s> >' % self.argtype
179 self.argtype = 'GoAST' + typename
180 self.mtype = 'std::unique_ptr<%s>' % self.argtype
181 self.mname = self.mname + '_up'
185 parentClasses = StringIO.StringIO()
186 childClasses = StringIO.StringIO()
187 walker = StringIO.StringIO()
190 def startClass(name, parent, out):
192 class GoAST%s : public GoAST%s
195 """ % (name, parent))
198 def endClass(name, out):
200 %(name)s(const %(name)s &) = delete;
201 const %(name)s &operator=(const %(name)s &) = delete;
203 """ % {'name': 'GoAST' + name})
206 def addNode(name, parent, *children):
207 startClass(name, parent, childClasses)
208 l = kinds.setdefault(parent, [])
210 children = createMembers(name, children)
211 addConstructor(name, parent, children)
212 childClasses.write("""
214 GetKindName() const override
220 classof(const GoASTNode *n)
222 return n->GetKind() == e%(name)s;
224 """ % {'name': name})
225 addChildren(name, children)
226 endClass(name, childClasses)
229 def isValueType(typename):
230 if typename[0].islower():
232 if typename[0].isupper():
233 return typename.startswith('Token') or typename == 'ChanDir'
237 def createMembers(name, children):
240 raise Exception("Invalid children for %s: %s" % (name, children))
241 return [Member(children[i], children[i + 1]) for i in xrange(0, l, 2)]
244 def addConstructor(name, parent, children):
247 children = [x for x in children if x.is_value]
249 childClasses.write(' ')
250 if len(children) == 1:
251 childClasses.write('explicit ')
252 childClasses.write('GoAST%s(' % name)
253 for i in xrange(len(children)):
255 childClasses.write(', ')
259 childClasses.write(c.argtype)
260 childClasses.write(' ')
262 childClasses.write('%s *' % c.argtype)
263 childClasses.write(c.sname)
264 childClasses.write(') : GoAST%s(e%s)' % (parent, name))
266 childClasses.write(', ')
267 childClasses.write('%(mname)s(%(sname)s)' % c.__dict__)
268 childClasses.write(""" {}
269 ~GoAST%s() override = default;
273 def addChildren(name, children):
274 if len(children) == 0:
279 GoAST%(n)s *n = llvm::cast<GoAST%(n)s>(this);
280 (void)n;""" % {'n': name})
283 childClasses.write("""
287 return %(mname)s.size();
290 Get%(title)s(int i) const
292 return %(mname)s[i].get();
295 Add%(title)s(%(argtype)s *%(sname)s)
297 %(mname)s.push_back(std::unique_ptr<%(argtype)s>(%(sname)s));
301 for (auto& e : n->%s) { v(e.get()); }""" % c.mname)
308 set = '%(mname)s = %(sname)s' % c.__dict__
314 set = '%(mname)s.reset(%(sname)s)' % c.__dict__
316 v(n->%s.get());""" % c.mname)
317 childClasses.write("""
321 return %(mname)s%(get)s;
324 Set%(title)s(%(type)s%(sname)s)
328 """ % {'const': const, 'title': c.title, 'sname': c.sname, 'get': get, 'set': set, 'type': t, 'mname': c.mname})
329 childClasses.write('\n private:\n friend class GoASTNode;\n')
334 childClasses.write(' %s %s;\n' % (c.mtype, c.mname))
337 def addParent(name, parent):
338 startClass(name, parent, parentClasses)
342 parentClasses.write(""" template <typename R, typename V> R Visit(V *v) const;
345 classof(const GoASTNode *n)
347 return n->GetKind() >= e%s && n->GetKind() <= e%s;
351 explicit GoAST%s(NodeKind kind) : GoASTNode(kind) { }
353 """ % (minName, maxName, name))
354 endClass(name, parentClasses)
358 print """//===-- GoAST.h -------------------------------------------------*- C++ -*-===//
360 // The LLVM Compiler Infrastructure
362 // This file is distributed under the University of Illinois Open Source
363 // License. See LICENSE.TXT for details.
365 //===----------------------------------------------------------------------===//
368 // Generated by gen_go_ast.py
370 #ifndef liblldb_GoAST_h
371 #define liblldb_GoAST_h
373 #include "lldb/lldb-forward.h"
374 #include "lldb/lldb-private.h"
375 #include "llvm/Support/Casting.h"
376 #include "Plugins/ExpressionParser/Go/GoLexer.h"
378 namespace lldb_private
384 typedef GoLexer::TokenType TokenType;
385 typedef GoLexer::Token Token;
394 for l in kinds.itervalues():
399 virtual ~GoASTNode() = default;
407 virtual const char *GetKindName() const = 0;
409 template <typename V> void WalkChildren(V &v);
412 explicit GoASTNode(NodeKind kind) : m_kind(kind) { }
415 const NodeKind m_kind;
417 GoASTNode(const GoASTNode &) = delete;
418 const GoASTNode &operator=(const GoASTNode &) = delete;
423 print parentClasses.getvalue()
424 print childClasses.getvalue()
426 for k, l in kinds.iteritems():
430 template <typename R, typename V>
431 R GoAST%s::Visit(V* v) const
436 print """ case e%(n)s:
437 return v->Visit%(n)s(llvm::cast<const GoAST%(n)s>(this));""" % {'n': subtype}
440 assert(false && "Invalid kind");
445 template <typename V>
446 void GoASTNode::WalkChildren(V &v)
451 print walker.getvalue()
461 } // namespace lldb_private