330 |
330 |
331 def getargsdict(x, funcname, keys): |
331 def getargsdict(x, funcname, keys): |
332 return parser.buildargsdict(getlist(x), funcname, keys.split(), |
332 return parser.buildargsdict(getlist(x), funcname, keys.split(), |
333 keyvaluenode='keyvalue', keynode='symbol') |
333 keyvaluenode='keyvalue', keynode='symbol') |
334 |
334 |
335 def isvalidsymbol(tree): |
|
336 """Examine whether specified ``tree`` is valid ``symbol`` or not |
|
337 """ |
|
338 return tree[0] == 'symbol' |
|
339 |
|
340 def getsymbol(tree): |
|
341 """Get symbol name from valid ``symbol`` in ``tree`` |
|
342 |
|
343 This assumes that ``tree`` is already examined by ``isvalidsymbol``. |
|
344 """ |
|
345 return tree[1] |
|
346 |
|
347 def isvalidfunc(tree): |
335 def isvalidfunc(tree): |
348 """Examine whether specified ``tree`` is valid ``func`` or not |
336 """Examine whether specified ``tree`` is valid ``func`` or not |
349 """ |
337 """ |
350 return tree[0] == 'func' and isvalidsymbol(tree[1]) |
338 return tree[0] == 'func' and tree[1][0] == 'symbol' |
351 |
339 |
352 def getfuncname(tree): |
340 def getfuncname(tree): |
353 """Get function name from valid ``func`` in ``tree`` |
341 """Get function name from valid ``func`` in ``tree`` |
354 |
342 |
355 This assumes that ``tree`` is already examined by ``isvalidfunc``. |
343 This assumes that ``tree`` is already examined by ``isvalidfunc``. |
356 """ |
344 """ |
357 return getsymbol(tree[1]) |
345 return tree[1][1] |
358 |
346 |
359 def getfuncargs(tree): |
347 def getfuncargs(tree): |
360 """Get list of function arguments from valid ``func`` in ``tree`` |
348 """Get list of function arguments from valid ``func`` in ``tree`` |
361 |
349 |
362 This assumes that ``tree`` is already examined by ``isvalidfunc``. |
350 This assumes that ``tree`` is already examined by ``isvalidfunc``. |
2317 tree, pos = p.parse(_tokenizealias(decl)) |
2305 tree, pos = p.parse(_tokenizealias(decl)) |
2318 if (pos != len(decl)): |
2306 if (pos != len(decl)): |
2319 raise error.ParseError(_('invalid token'), pos) |
2307 raise error.ParseError(_('invalid token'), pos) |
2320 tree = parser.simplifyinfixops(tree, ('list',)) |
2308 tree = parser.simplifyinfixops(tree, ('list',)) |
2321 |
2309 |
2322 if isvalidsymbol(tree): |
2310 if tree[0] == 'symbol': |
2323 # "name = ...." style |
2311 # "name = ...." style |
2324 name = getsymbol(tree) |
2312 name = tree[1] |
2325 if name.startswith('$'): |
2313 if name.startswith('$'): |
2326 return (decl, None, None, _("'$' not for alias arguments")) |
2314 return (decl, None, None, _("'$' not for alias arguments")) |
2327 return (name, ('symbol', name), None, None) |
2315 return (name, ('symbol', name), None, None) |
2328 |
2316 |
2329 if isvalidfunc(tree): |
2317 if isvalidfunc(tree): |
2331 name = getfuncname(tree) |
2319 name = getfuncname(tree) |
2332 if name.startswith('$'): |
2320 if name.startswith('$'): |
2333 return (decl, None, None, _("'$' not for alias arguments")) |
2321 return (decl, None, None, _("'$' not for alias arguments")) |
2334 args = [] |
2322 args = [] |
2335 for arg in getfuncargs(tree): |
2323 for arg in getfuncargs(tree): |
2336 if not isvalidsymbol(arg): |
2324 if arg[0] != 'symbol': |
2337 return (decl, None, None, _("invalid argument list")) |
2325 return (decl, None, None, _("invalid argument list")) |
2338 args.append(getsymbol(arg)) |
2326 args.append(arg[1]) |
2339 if len(args) != len(set(args)): |
2327 if len(args) != len(set(args)): |
2340 return (name, None, None, |
2328 return (name, None, None, |
2341 _("argument names collide with each other")) |
2329 _("argument names collide with each other")) |
2342 return (name, ('func', ('symbol', name)), args, None) |
2330 return (name, ('func', ('symbol', name)), args, None) |
2343 |
2331 |