1 | ## our_shell: ysh
|
2 | ## oils_failures_allowed: 1
|
3 |
|
4 | #### Command.sourceCode() on literal block: p { echo hi }
|
5 |
|
6 | proc p ( ; ; ; block) {
|
7 | var src = block.sourceCode()
|
8 | echo $[src.code_str] > out.ysh
|
9 |
|
10 | # don't assert this yet, because whitespace can change
|
11 | call src->erase('code_str')
|
12 |
|
13 | json write (src)
|
14 |
|
15 | # New location is out.ysh:4
|
16 | $[ENV.SH] out.ysh || true
|
17 |
|
18 | echo ---
|
19 |
|
20 | #echo 'zz (' > bad.ysh
|
21 |
|
22 | # Original location is [ stdin ]:20
|
23 | ... $[ENV.SH]
|
24 | --location-str $[src.location_str]
|
25 | --location-start-line $[src.location_start_line]
|
26 | out.ysh
|
27 | || true
|
28 | ;
|
29 | }
|
30 |
|
31 | p {
|
32 | echo 1
|
33 | echo 2
|
34 | false
|
35 | echo 3
|
36 | }
|
37 |
|
38 | ## STDOUT:
|
39 | {
|
40 | "location_str": "[ stdin ]",
|
41 | "location_start_line": 22
|
42 | }
|
43 | 1
|
44 | 2
|
45 | ---
|
46 | 1
|
47 | 2
|
48 | ## END
|
49 |
|
50 |
|
51 | #### Command.sourceCode() on Expr: ^(echo 1; echo 2)
|
52 |
|
53 | var cmd = ^(echo 1; echo 2; false)
|
54 |
|
55 | var src = cmd.sourceCode()
|
56 |
|
57 | assert [null === src]
|
58 |
|
59 | # Test passing it
|
60 | proc p ( ; ; ; block) {
|
61 | pp test_ (block)
|
62 | assert [null === block.sourceCode()]
|
63 | }
|
64 |
|
65 | p ( ; ; cmd)
|
66 |
|
67 | ## STDOUT:
|
68 | <Command>
|
69 | ## END
|
70 |
|
71 |
|
72 | #### Command.sourceCode() works with reparsing, e.g. backticks
|
73 |
|
74 | # TODO: fix this bug - same as Hay bug
|
75 |
|
76 | proc p ( ; ; ; block) {
|
77 | var src = block.sourceCode()
|
78 |
|
79 | pp test_ (src.code_str)
|
80 |
|
81 | # Re-parsing messes this up
|
82 | #echo $[src.code_str]
|
83 | #echo
|
84 | }
|
85 |
|
86 | shopt --set parse_backticks
|
87 |
|
88 | p {
|
89 | echo "greeting `echo backticks`"
|
90 | }
|
91 |
|
92 | shopt --set parse_sh_arith
|
93 |
|
94 | p {
|
95 | array_lhs[i++]=y
|
96 | }
|
97 |
|
98 | shopt --set expand_aliases
|
99 |
|
100 | alias e='echo alias'
|
101 |
|
102 | p {
|
103 | e foo
|
104 | }
|
105 |
|
106 | # alias that combines the problematic features
|
107 | alias e2='a[0+2+3]=x; echo `echo bacticks`'
|
108 |
|
109 | p {
|
110 | e2 zzz
|
111 | #e2 e2 zzz
|
112 | }
|
113 |
|
114 | ## STDOUT:
|
115 | (Str) " \n echo \"greeting `echo backticks`\"\n"
|
116 | (Str) " \n array_lhs[i++]=y\n"
|
117 | (Str) " \n e foo\n"
|
118 | (Str) " \n e2 zzz\n"
|
119 | ## END
|
120 |
|
121 |
|
122 | #### Command.sourceCode() works in nested blocks
|
123 |
|
124 | proc p ( ; ; ; block) {
|
125 | var src = block.sourceCode()
|
126 |
|
127 | pp test_ (src.code_str)
|
128 |
|
129 | call io->eval(block)
|
130 | }
|
131 |
|
132 |
|
133 | shopt --set parse_backticks
|
134 | shopt --set parse_sh_arith
|
135 | shopt --set expand_aliases
|
136 |
|
137 | p {
|
138 | echo foo
|
139 | }
|
140 |
|
141 | p {
|
142 | #a[0]=`echo foo`
|
143 | echo foo
|
144 | p {
|
145 | #a[inner]=`echo foo`
|
146 | echo inner
|
147 | }
|
148 | }
|
149 |
|
150 | ## STDOUT:
|
151 | ## END
|