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 shopt --unset no_osh_builtins # allow alias builtin
75
76 # TODO: fix this bug - same as Hay bug
77
78 proc p ( ; ; ; block) {
79 var src = block.sourceCode()
80
81 pp test_ (src.code_str)
82
83 # Re-parsing messes this up
84 #echo $[src.code_str]
85 #echo
86 }
87
88 shopt --unset no_parse_backticks
89
90 p {
91 echo "greeting `echo backticks`"
92 }
93
94 shopt --unset no_parse_sh_arith
95
96 p {
97 array_lhs[i++]=y
98 }
99
100 shopt --set expand_aliases
101
102 alias e='echo alias'
103
104 p {
105 e foo
106 }
107
108 # alias that combines the problematic features
109 alias e2='a[0+2+3]=x; echo `echo bacticks`'
110
111 p {
112 e2 zzz
113 #e2 e2 zzz
114 }
115
116 ## STDOUT:
117 (Str) " \n echo \"greeting `echo backticks`\"\n"
118 (Str) " \n array_lhs[i++]=y\n"
119 (Str) " \n e foo\n"
120 (Str) " \n e2 zzz\n"
121 ## END
122
123
124 #### Command.sourceCode() works in nested blocks
125
126 shopt --unset no_osh_builtins # allow alias builtin
127
128 proc p ( ; ; ; block) {
129 var src = block.sourceCode()
130
131 pp test_ (src.code_str)
132
133 call io->eval(block)
134 }
135
136
137 shopt --unset no_parse_backticks
138 shopt --unset no_parse_sh_arith
139 shopt --set expand_aliases
140
141 p {
142 echo foo
143 }
144
145 p {
146 #a[0]=`echo foo`
147 echo foo
148 p {
149 #a[inner]=`echo foo`
150 echo inner
151 }
152 }
153
154 ## STDOUT:
155 ## END