diff options
| author | Li Jin <dragon-fly@qq.com> | 2024-03-19 16:21:35 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2024-03-19 16:21:35 +0800 |
| commit | 2733fe565c405f7b382fb7c02c69f78fb65d2f20 (patch) | |
| tree | 41a91a52c7ee9e9360831693d107e7da897c7a3b /spec/inputs | |
| parent | 62ddb888d67d047324aa6c411d47aaeac9b658fd (diff) | |
| download | yuescript-2733fe565c405f7b382fb7c02c69f78fb65d2f20.tar.gz yuescript-2733fe565c405f7b382fb7c02c69f78fb65d2f20.tar.bz2 yuescript-2733fe565c405f7b382fb7c02c69f78fb65d2f20.zip | |
fix nil coalescing anonymous function moving issue. add test cases.
Diffstat (limited to 'spec/inputs')
| -rw-r--r-- | spec/inputs/upvalue_func.yue | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/spec/inputs/upvalue_func.yue b/spec/inputs/upvalue_func.yue new file mode 100644 index 0000000..a4155da --- /dev/null +++ b/spec/inputs/upvalue_func.yue | |||
| @@ -0,0 +1,207 @@ | |||
| 1 | -- In module root scope the anonymous functions won't be moved to up-values because they just run once. | ||
| 2 | |||
| 3 | -- 1. if expr | ||
| 4 | func if cond | ||
| 5 | 998 | ||
| 6 | else | ||
| 7 | "abc" | ||
| 8 | |||
| 9 | -- 2. nil coalesed expr | ||
| 10 | func valueA + valueB ?? 123 | ||
| 11 | |||
| 12 | -- 3. vararg passing | ||
| 13 | do | ||
| 14 | ok, ... = func 1, 2, 3 | ||
| 15 | print select 3, ... | ||
| 16 | |||
| 17 | -- 4. chain with existential operator | ||
| 18 | if tb?.abc?\call? 123 | ||
| 19 | print "OK" | ||
| 20 | |||
| 21 | -- 5. colon chain with metamethod accessing with string or expr | ||
| 22 | func( | ||
| 23 | tb\<"fn"> 123 | ||
| 24 | tb\<[1 + 1]> "abc" | ||
| 25 | ) | ||
| 26 | |||
| 27 | -- 6. colon chain with Lua keyword or unicode name | ||
| 28 | func tb\end()\🤣 123 | ||
| 29 | |||
| 30 | -- 7. in expr with short check | ||
| 31 | itemA = 1 | ||
| 32 | listA = [] | ||
| 33 | if itemA in listA | ||
| 34 | print "itemA in listA" | ||
| 35 | |||
| 36 | -- 8. in expr without short check | ||
| 37 | if itemB? and itemB in listB | ||
| 38 | print "itemB in listB" | ||
| 39 | |||
| 40 | -- 9. spread table | ||
| 41 | func [...listA, ...listB] | ||
| 42 | |||
| 43 | -- 10. comprehension | ||
| 44 | func [i for i = 1, 10], [k for k in pairs tb] | ||
| 45 | |||
| 46 | -- 11. for expr | ||
| 47 | func for i = 1, 10 | ||
| 48 | i + 1 | ||
| 49 | |||
| 50 | -- 12. for each expr | ||
| 51 | func for k, v in pairs tb | ||
| 52 | [k, v] | ||
| 53 | |||
| 54 | -- 13. class declaration expr | ||
| 55 | func class | ||
| 56 | new: => @value = 1 | ||
| 57 | |||
| 58 | -- 14. with expr | ||
| 59 | func with tb | ||
| 60 | .field = 1 | ||
| 61 | \func "a" | ||
| 62 | |||
| 63 | -- 15. table comprehension expr | ||
| 64 | func {"#{k}-post-fix", v * 2 for k, v in pairs tb} | ||
| 65 | |||
| 66 | -- 16. do expr | ||
| 67 | func do | ||
| 68 | print 123 | ||
| 69 | "abc" | ||
| 70 | |||
| 71 | -- 17. try expr with block codes | ||
| 72 | do | ||
| 73 | success, ... = try | ||
| 74 | a = 1 | ||
| 75 | print a + nil | ||
| 76 | 1, 2, 3 | ||
| 77 | print select '#', ... if success | ||
| 78 | |||
| 79 | -- 18. while expr | ||
| 80 | i = 1 | ||
| 81 | func while cond | ||
| 82 | i += 1 | ||
| 83 | i | ||
| 84 | |||
| 85 | -- 19. switch expr | ||
| 86 | func switch value | ||
| 87 | when 1 | ||
| 88 | 'a' | ||
| 89 | when 2 | ||
| 90 | 'b' | ||
| 91 | |||
| 92 | GameEngine\onUpdate (deltaTime) -> | ||
| 93 | -- 1. if expr | ||
| 94 | func if cond | ||
| 95 | 998 | ||
| 96 | else | ||
| 97 | "abc" | ||
| 98 | |||
| 99 | -- 2. nil coalesed expr | ||
| 100 | func valueA + valueB ?? 123 | ||
| 101 | |||
| 102 | -- 3. vararg passing | ||
| 103 | do | ||
| 104 | ok, ... = func 1, 2, 3 | ||
| 105 | print select 3, ... | ||
| 106 | |||
| 107 | -- 4. chain with existential operator | ||
| 108 | if tb?.abc?\call? 123 | ||
| 109 | print "OK" | ||
| 110 | |||
| 111 | -- 5. colon chain with metamethod accessing with string or expr | ||
| 112 | func( | ||
| 113 | tb\<"fn"> 123 | ||
| 114 | tb\<[1 + 1]> "abc" | ||
| 115 | ) | ||
| 116 | |||
| 117 | -- 6. colon chain with Lua keyword or unicode name | ||
| 118 | func tb\end()\🤣 123 | ||
| 119 | |||
| 120 | -- 7. in expr with short check | ||
| 121 | itemA = 1 | ||
| 122 | listA = [] | ||
| 123 | if itemA in listA | ||
| 124 | print "item in list" | ||
| 125 | |||
| 126 | -- 8. in expr without short check | ||
| 127 | if itemB? and itemB in listB | ||
| 128 | print "item in list" | ||
| 129 | |||
| 130 | -- 9. spread table | ||
| 131 | func [...listA, ...listB] | ||
| 132 | |||
| 133 | -- 10. comprehension | ||
| 134 | func [i for i = 1, 10], [k for k in pairs tb] | ||
| 135 | |||
| 136 | -- 11. for expr | ||
| 137 | func for i = 1, 10 | ||
| 138 | i + 1 | ||
| 139 | |||
| 140 | -- 12. for each expr | ||
| 141 | func for k, v in pairs tb | ||
| 142 | [k, v] | ||
| 143 | |||
| 144 | -- 13. class declaration expr | ||
| 145 | func class | ||
| 146 | new: => @value = 1 | ||
| 147 | |||
| 148 | -- 14. with expr | ||
| 149 | func with tb | ||
| 150 | .field = 1 | ||
| 151 | \func "a" | ||
| 152 | |||
| 153 | -- 15. table comprehension expr | ||
| 154 | func {"#{k}-post-fix", v * 2 for k, v in pairs tb} | ||
| 155 | |||
| 156 | -- 16. do expr | ||
| 157 | func do | ||
| 158 | print 123 | ||
| 159 | "abc" | ||
| 160 | |||
| 161 | -- 17. try expr with block codes | ||
| 162 | do | ||
| 163 | success, ... = try | ||
| 164 | a = 1 | ||
| 165 | print a + nil | ||
| 166 | 1, 2, 3 | ||
| 167 | print select '#', ... if success | ||
| 168 | |||
| 169 | -- 18. while expr | ||
| 170 | i = 1 | ||
| 171 | func while cond | ||
| 172 | i += 1 | ||
| 173 | i | ||
| 174 | |||
| 175 | -- 19. switch expr | ||
| 176 | func switch value | ||
| 177 | when 1 | ||
| 178 | 'a' | ||
| 179 | when 2 | ||
| 180 | 'b' | ||
| 181 | |||
| 182 | GameEngine\onEvent "SomeEvent", -> | ||
| 183 | func value + (if cond | ||
| 184 | 998 | ||
| 185 | else | ||
| 186 | "abc") + (valueB ?? 123) > tb?.abc?\call?(123) + tb\end()\🤣 123 and | ||
| 187 | itemA in listA | ||
| 188 | |||
| 189 | GameEngine\schedule (deltaTime) -> | ||
| 190 | value = 123 | ||
| 191 | func if value > 200 | ||
| 192 | UpdateScoreText "Win: #{value}" | ||
| 193 | "done" | ||
| 194 | else | ||
| 195 | UpdateScoreText "Score: #{value}" | ||
| 196 | "continue" | ||
| 197 | |||
| 198 | GameEngine\schedule (deltaTime) -> -- closure 1 | ||
| 199 | value = 123 | ||
| 200 | func if value > 200 | ||
| 201 | UpdateScoreText "Win: #{value}" | ||
| 202 | "done" | ||
| 203 | else | ||
| 204 | GameEngine\schedule (deltaTime) -> -- closure 2 | ||
| 205 | UpdateScoreText "Score: #{value}" -- value is captured by closure 2 | ||
| 206 | "continue" | ||
| 207 | |||
