def testShellFuncExecution(self): ex = cmd_exec_test.InitExecutor() func_node = ast.FuncDef() c1 = ast.CompoundWord() t1 = ast.token(Id.Lit_Chars, 'f1') c1.parts.append(ast.LiteralPart(t1)) c2 = ast.CompoundWord() t2 = ast.token(Id.Lit_Chars, 'f2') c2.parts.append(ast.LiteralPart(t2)) a = ast.ArrayLiteralPart() a.words = [c1, c2] w = ast.CompoundWord() w.parts.append(a) # Set global COMPREPLY=(f1 f2) pair = ast.assign_pair(ast.LhsName('COMPREPLY'), assign_op_e.Equal, w) pair.spids.append(0) # dummy pairs = [pair] body_node = ast.Assignment(Id.Assign_None, [], pairs) func_node.name = 'myfunc' func_node.body = body_node a = completion.ShellFuncAction(ex, func_node) matches = list(a.Matches([], 0, 'f')) self.assertEqual(['f1 ', 'f2 '], matches)
def ParseKshFunctionDef(self): """ ksh_function_def : 'function' fname ( '(' ')' )? newline_ok function_body """ left_spid = word.LeftMostSpanForWord(self.cur_word) self._Next() # skip past 'function' if not self._Peek(): return None ok, name = word.AsFuncName(self.cur_word) if not ok: self.AddErrorContext("Invalid function name: %r", self.cur_word) return None after_name_spid = word.LeftMostSpanForWord(self.cur_word) + 1 self._Next() # skip past 'function name if not self._Peek(): return None if self.c_id == Id.Op_LParen: self.lexer.PushHint(Id.Op_RParen, Id.Right_FuncDef) self._Next() if not self._Eat(Id.Right_FuncDef): return None # Change it: after ) after_name_spid = word.LeftMostSpanForWord(self.cur_word) + 1 if not self._NewlineOk(): return None func = ast.FuncDef() func.name = name if not self.ParseFunctionBody(func): return None func.spids.append(left_spid) func.spids.append(after_name_spid) return func
def ParseFunctionDef(self): """ function_header : fname '(' ')' function_def : function_header newline_ok function_body ; Precondition: Looking at the function name. Post condition: NOTE: There is an ambiguity with: function foo ( echo hi ) and function foo () ( echo hi ) Bash only accepts the latter, though it doesn't really follow a grammar. """ left_spid = word.LeftMostSpanForWord(self.cur_word) ok, name = word.AsFuncName(self.cur_word) if not ok: self.AddErrorContext("Invalid function name: %r", self.cur_word, word=self.cur_word) return None self._Next() # skip function name # Must be true beacuse of lookahead if not self._Peek(): return None assert self.c_id == Id.Op_LParen, self.cur_word self.lexer.PushHint(Id.Op_RParen, Id.Right_FuncDef) self._Next() if not self._Eat(Id.Right_FuncDef): return None after_name_spid = word.LeftMostSpanForWord(self.cur_word) + 1 if not self._NewlineOk(): return None func = ast.FuncDef() func.name = name if not self.ParseFunctionBody(func): return None func.spids.append(left_spid) func.spids.append(after_name_spid) return func