def testGetFormsBreak6(self): st = """break from `$blockName x=3""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [(ATOM_TYPE, "return-from"), (SHORTCUT_TYPE, "`", (SHORTCUT_TYPE, ",", (ATOM_TYPE, "blockName"))), (FORM_TYPE, [])]), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "x"), (ATOM_TYPE, "3")])])
def testGetFormsOperForm19(self): st = """x+y**d**c-z""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "_-_"), (FORM_TYPE, [(ATOM_TYPE, "_+_"), (ATOM_TYPE, "x"), (FORM_TYPE, [(ATOM_TYPE, "_**_"), (ATOM_TYPE, "y"), (FORM_TYPE, [(ATOM_TYPE, "_**_"), (ATOM_TYPE, "d"), (ATOM_TYPE, "c")])])]), (ATOM_TYPE, "z") ])])
def testGetFormsLetList5(self): st = """let (x,y=a=5) {y}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "let"), (FORM_TYPE, [(ATOM_TYPE, "x"), (FORM_TYPE, [(ATOM_TYPE, "y"), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "a"), (ATOM_TYPE, "5")])])]), (ATOM_TYPE, "y") ])])
def testGetFormsDoLists7(self): st = """do (a=0->a+b,b=1) {a}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "do"), (FORM_TYPE, [(FORM_TYPE, [(ATOM_TYPE, "a"), (ATOM_TYPE, "0"), (FORM_TYPE, [(ATOM_TYPE, "_+_"), (ATOM_TYPE, "a"), (ATOM_TYPE, "b")])]), (FORM_TYPE, [(ATOM_TYPE, "b"), (ATOM_TYPE, "1")])]), (FORM_TYPE, [(ATOM_TYPE, LISP_NIL)]), (ATOM_TYPE, "a") ])])
def testGetFormsMacLambdaList1(self): st = """mac foo(a,.(**body),b=5=?bPresent) {}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "defmacro"), (ATOM_TYPE, "foo"), (FORM_TYPE, [(ATOM_TYPE, "a"), (FORM_TYPE, [(ATOM_TYPE, "&body"), (ATOM_TYPE, "body")]), (ATOM_TYPE, "&optional"), (FORM_TYPE, [(ATOM_TYPE, "b"), (ATOM_TYPE, "5"), (ATOM_TYPE, "bPresent")])]) ])])
def testGetFormsOperForm20(self): st = """x+~(foo,a+b)-z""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "_-_"), (FORM_TYPE, [(ATOM_TYPE, "_+_"), (ATOM_TYPE, "x"), (FORM_TYPE, [(ATOM_TYPE, "foo"), (FORM_TYPE, [(ATOM_TYPE, "_+_"), (ATOM_TYPE, "a"), (ATOM_TYPE, "b")])])]), (ATOM_TYPE, "z"), ])])
def testGetFormsBlockForm5(self): st = """def foo() { progn{~(), ~()} ~()}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [(ATOM_TYPE, "defun"), (ATOM_TYPE, "foo"), (FORM_TYPE, []), (FORM_TYPE, [(ATOM_TYPE, "progn"), (FORM_TYPE, []), (FORM_TYPE, [])]), (FORM_TYPE, [])])])
def testGetFormsDoLists4(self): st = """do () (a==2,"Some computed form","Return result") {a}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "do"), (FORM_TYPE, []), (FORM_TYPE, [(FORM_TYPE, [(ATOM_TYPE, "_==_"), (ATOM_TYPE, "a"), (ATOM_TYPE, "2")]), (ATOM_TYPE, "\"Some computed form\""), (ATOM_TYPE, "\"Return result\"")]), (ATOM_TYPE, "a")])])
def testGetFormDict4(self): st = """x={a b->45-y}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "x"), (FORM_TYPE, [(ATOM_TYPE, "_make-hash-table_"), (ATOM_TYPE, "a"), (ATOM_TYPE, "nil"), (ATOM_TYPE, "b"), (FORM_TYPE, [(ATOM_TYPE, "_-_"), (ATOM_TYPE, "45"), (ATOM_TYPE, "y")])])])])
def testGetFormsObjSlots1(self): st = """x.a=y.a""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [(ATOM_TYPE, "setf"), (FORM_TYPE, [(ATOM_TYPE, "slot-value"), (ATOM_TYPE, "x"), (SHORTCUT_TYPE, "'", (ATOM_TYPE, "a"))]), (FORM_TYPE, [(ATOM_TYPE, "slot-value"), (ATOM_TYPE, "y"), (SHORTCUT_TYPE, "'", (ATOM_TYPE, "a"))])])])
def testGetFormsString3(self): st = """x="Hello, the"+" brave, new World!" """ forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "x"), (FORM_TYPE, [(ATOM_TYPE, "_+_"), (ATOM_TYPE, """\"Hello, the\""""), (ATOM_TYPE, """\" brave, new World!\"""")])])])
def testGetFormsReturn3(self): st = """def foo {return a@b@c}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "defun"), (ATOM_TYPE, "foo"), (FORM_TYPE, []), (FORM_TYPE, [(ATOM_TYPE, "return-from"), (ATOM_TYPE, "foo"), (FORM_TYPE, [(ATOM_TYPE, "values"), (ATOM_TYPE, "a"), (ATOM_TYPE, "b"), (ATOM_TYPE, "c")])])])])
def testGetFormsOperForm23(self): st = """a@b@c=x@y@z""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [(ATOM_TYPE, "setf"), (FORM_TYPE, [(ATOM_TYPE, "values"), (ATOM_TYPE, "a"), (ATOM_TYPE, "b"), (ATOM_TYPE, "c")]), (FORM_TYPE, [(ATOM_TYPE, "values"), (ATOM_TYPE, "x"), (ATOM_TYPE, "y"), (ATOM_TYPE, "z")])])])
def testGetFormsClass3(self): st = """class foo { a {:type=integer} c}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "defclass"), (ATOM_TYPE, "foo"), (FORM_TYPE, []), (FORM_TYPE, [(FORM_TYPE, [(ATOM_TYPE, "a"), (ATOM_TYPE, ":type"), (ATOM_TYPE, "integer")]), (ATOM_TYPE, "c")])])])
def testGetFormsIf6(self): st = """if (a) {x=b} else {foo()}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "cond"), (FORM_TYPE, [(ATOM_TYPE, "a"), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "x"), (ATOM_TYPE, "b")])]), (FORM_TYPE, [(ATOM_TYPE, "t"), (FORM_TYPE, [(ATOM_TYPE, "foo")])])])])
def testGetFormsBracketForm2(self): st = """~(),~() ~(),~(~(),~())""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo(), True) self.assertEqual(forms, [(COMMENT_TYPE, "; source line # 1"), (FORM_TYPE, []), (COMMENT_TYPE, "; source line # 1"), (FORM_TYPE, []), (COMMENT_TYPE, "; source line # 2"), (FORM_TYPE, []), (COMMENT_TYPE, "; source line # 2"), (FORM_TYPE, [(COMMENT_TYPE, "; source line # 2"), (FORM_TYPE, []), (COMMENT_TYPE, "; source line # 2"), (FORM_TYPE, [])])])
def testGetFormsDoLists8(self): st = """do (a->a+b,b=1) (a==2,"Return result") {a}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "do"), (FORM_TYPE, [(FORM_TYPE, [(ATOM_TYPE, "a"), (ATOM_TYPE, "nil"), (FORM_TYPE, [(ATOM_TYPE, "_+_"), (ATOM_TYPE, "a"), (ATOM_TYPE, "b")])]), (FORM_TYPE, [(ATOM_TYPE, "b"), (ATOM_TYPE, "1")])]), (FORM_TYPE, [(FORM_TYPE, [(ATOM_TYPE, "_==_"), (ATOM_TYPE, "a"), (ATOM_TYPE, "2")]), (ATOM_TYPE, "\"Return result\"")]), (ATOM_TYPE, "a") ])])
def testGetFormsArray1(self): st = """x=[s-d,23/45,foo]""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "setf"), (ATOM_TYPE, "x"), (FORM_TYPE, [(ATOM_TYPE, "_make-vector_"), (ATOM_TYPE, ":initContent"), (FORM_TYPE, [(ATOM_TYPE, "list"), (FORM_TYPE, [(ATOM_TYPE, "_-_"), (ATOM_TYPE, "s"), (ATOM_TYPE, "d")]), (ATOM_TYPE, "23/45"), (ATOM_TYPE, "foo")])]) ])])
def testGetFormsBracketForm3(self): st = """ ~(),~(), \\ anything to new line will be skipped ~(), ~(~(),~())""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo(), True) self.assertEqual(forms, [(COMMENT_TYPE, "; source line # 1"), (FORM_TYPE, []), (COMMENT_TYPE, "; source line # 1"), (FORM_TYPE, []), (COMMENT_TYPE, "; source line # 2"), (FORM_TYPE, []), (COMMENT_TYPE, "; source line # 3"), (FORM_TYPE, [(COMMENT_TYPE, "; source line # 3"), (FORM_TYPE, []), (COMMENT_TYPE, "; source line # 3"), (FORM_TYPE, [])])])
def testGetFormsUse4(self): st = """use foo {x} func(x) func(:x) func(cl:x) func(cl::x)""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [(ATOM_TYPE, "func"), (ATOM_TYPE, "foo:x")]), (FORM_TYPE, [(ATOM_TYPE, "func"), (ATOM_TYPE, ":x")]), (FORM_TYPE, [(ATOM_TYPE, "func"), (ATOM_TYPE, "cl:x")]), (FORM_TYPE, [(ATOM_TYPE, "func"), (ATOM_TYPE, "cl::x")])])
def testGetFormsStruct4(self): st = """struct foo { a {0,:type=integer} b {1,:&read-only } c}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "defstruct"), (FORM_TYPE, [(ATOM_TYPE, "foo")]), (FORM_TYPE, [(ATOM_TYPE, "a"), (ATOM_TYPE, "0"), (ATOM_TYPE, ":type"), (ATOM_TYPE, "integer")]), (FORM_TYPE, [(ATOM_TYPE, "b"), (ATOM_TYPE, "1"), (ATOM_TYPE, ":read-only")]), (ATOM_TYPE, "c")])])
def testGetFormsIf2(self): st = """if (a) {x=b} elif (c) {y=0}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "cond"), (FORM_TYPE, [(ATOM_TYPE, "a"), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "x"), (ATOM_TYPE, "b")])]), (FORM_TYPE, [(ATOM_TYPE, "c"), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "y"), (ATOM_TYPE, "0")])])])])
def testGetFormsBodyBlock4(self): st = """x=foo{a b=45}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo(), True) self.assertEqual( forms, [(COMMENT_TYPE, "; source line # 1"), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "x"), (FORM_TYPE, [(ATOM_TYPE, "foo"), (COMMENT_TYPE, "; source line # 1"), (ATOM_TYPE, "a"), (COMMENT_TYPE, "; source line # 2"), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "b"), (ATOM_TYPE, "45")])])])])
def testGetFormsImplicitLexscope11(self): st = """mac foo (a) { a = 1 b = 2}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo(implScope=True)) self.assertEqual(forms, [(FORM_TYPE, [(ATOM_TYPE, "defmacro"), (ATOM_TYPE, "foo"), (FORM_TYPE, [(ATOM_TYPE, "a")]), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "a"), (ATOM_TYPE, "1")]), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "b"), (ATOM_TYPE, "2")])])])
def testGetFormsImplicitLexscope2(self): st = """progn{ foo(x) x=y=1 foo(x)}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo(implScope=True)) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "progn"), (FORM_TYPE, [(ATOM_TYPE, "foo"), (ATOM_TYPE, "x")]), (FORM_TYPE, [(ATOM_TYPE, "let"), (FORM_TYPE, [(ATOM_TYPE, "y"), (ATOM_TYPE, "x")]), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "x"), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "y"), (ATOM_TYPE, "1")])]), (FORM_TYPE, [(ATOM_TYPE, "foo"), (ATOM_TYPE, "x")])]) ])])
def testGetFormsUse2(self): st = """use foo {x=e,y=f,z} e(a) x(a) f(b) y(b) z(c)""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual(forms, [(FORM_TYPE, [(ATOM_TYPE, "foo:x"), (ATOM_TYPE, "a")]), (FORM_TYPE, [(ATOM_TYPE, "x"), (ATOM_TYPE, "a")]), (FORM_TYPE, [(ATOM_TYPE, "foo:y"), (ATOM_TYPE, "b")]), (FORM_TYPE, [(ATOM_TYPE, "y"), (ATOM_TYPE, "b")]), (FORM_TYPE, [(ATOM_TYPE, "foo:z"), (ATOM_TYPE, "c")])])
def testGetFormsImplicitLexscope16(self): st = """progn{ x @ y = foo() x+y}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo(implScope=True)) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "progn"), (FORM_TYPE, [(ATOM_TYPE, "let"), (FORM_TYPE, [(ATOM_TYPE, "x"), (ATOM_TYPE, "y")]), (FORM_TYPE, [(ATOM_TYPE, "setf"), (FORM_TYPE, [(ATOM_TYPE, "values"), (ATOM_TYPE, "x"), (ATOM_TYPE, "y")]), (FORM_TYPE, [(ATOM_TYPE, "foo")])]), (FORM_TYPE, [(ATOM_TYPE, "_+_"), (ATOM_TYPE, "x"), (ATOM_TYPE, "y")])]) ])])
def testGetFormsClass4(self): st = """class foo { a {:type=integer} c} options {:documentation="doc-string" :metaclass=boo}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "defclass"), (ATOM_TYPE, "foo"), (FORM_TYPE, []), (FORM_TYPE, [(FORM_TYPE, [(ATOM_TYPE, "a"), (ATOM_TYPE, ":type"), (ATOM_TYPE, "integer")]), (ATOM_TYPE, "c")]), (FORM_TYPE, [(ATOM_TYPE, ":documentation"), (ATOM_TYPE, "\"doc-string\"")]), (FORM_TYPE, [(ATOM_TYPE, ":metaclass"), (ATOM_TYPE, "boo")])])])
def testGetFormsClass5(self): st = """class foo (super1,super2) { a {:type=integer} ; this comment will be dropped outentirely c} options {:documentation="doc-string" :metaclass=boo}""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo()) self.assertEqual( forms, [(FORM_TYPE, [(ATOM_TYPE, "defclass"), (ATOM_TYPE, "foo"), (FORM_TYPE, [(ATOM_TYPE, "super1"), (ATOM_TYPE, "super2")]), (FORM_TYPE, [(FORM_TYPE, [(ATOM_TYPE, "a"), (ATOM_TYPE, ":type"), (ATOM_TYPE, "integer")]), (ATOM_TYPE, "c")]), (FORM_TYPE, [(ATOM_TYPE, ":documentation"), (ATOM_TYPE, "\"doc-string\"")]), (FORM_TYPE, [(ATOM_TYPE, ":metaclass"), (ATOM_TYPE, "boo")])])])
def testGetFormsImplicitLexscope15(self): st = """def foo (a,b=lambda{a=1}) { a=9 }""" forms = getForms(GrowingList(StringIO.StringIO(st)), LevelInfo(implScope=True, explScopeWarn=True)) self.assertEqual(forms, [(FORM_TYPE, [ (ATOM_TYPE, "defun"), (ATOM_TYPE, "foo"), (FORM_TYPE, [(ATOM_TYPE, "a"), (ATOM_TYPE, "&optional"), (FORM_TYPE, [ (ATOM_TYPE, "b"), (FORM_TYPE, [ (ATOM_TYPE, "lambda"), (FORM_TYPE, []), (FORM_TYPE, [(ATOM_TYPE, "let"), (FORM_TYPE, [(ATOM_TYPE, "a")]), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "a"), (ATOM_TYPE, "1")])]) ]) ])]), (FORM_TYPE, [(ATOM_TYPE, "setf"), (ATOM_TYPE, "a"), (ATOM_TYPE, "9")]) ])])