Skip to content

Commit 03a3a39

Browse files
authored
Bind the standard library to a $std variable and use it in desugared expressions. (#1158)
This keeps redefining `std` from breaking expressions that desugar to calls to standard library functions by redefining `std`.
1 parent 1e6cdc0 commit 03a3a39

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

core/desugarer.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ static constexpr char STD_CODE[] = {
100100
*/
101101
class Desugarer {
102102
Allocator *alloc;
103+
bool isStdlib;
103104

104105
template <class T, class... Args>
105106
T *make(Args &&... args)
@@ -139,7 +140,10 @@ class Desugarer {
139140

140141
Var *std(void)
141142
{
142-
return var(id(U"std"));
143+
// In most places, there is a "$std" variable inserted by
144+
// the desugarer. On the standard library itself there isn't,
145+
// so use "std" instead.
146+
return var(id(isStdlib ? U"std" : U"$std"));
143147
}
144148

145149
Local::Bind bind(const Identifier *id, AST *body)
@@ -219,7 +223,7 @@ class Desugarer {
219223
}
220224

221225
public:
222-
Desugarer(Allocator *alloc) : alloc(alloc) {}
226+
Desugarer(Allocator *alloc, bool isStdlib = false) : alloc(alloc), isStdlib(isStdlib) {}
223227

224228
void desugarParams(ArgParams &params, unsigned obj_level)
225229
{
@@ -999,13 +1003,17 @@ class Desugarer {
9991003
make<Var>(E, line_end, body)));
10001004
}
10011005

1002-
// local std = (std.jsonnet stuff); ast
1003-
ast = make<Local>(ast->location, EF, singleBind(id(U"std"), std_obj), ast);
1006+
// local $std = (std.jsonnet stuff); std = $std; ast
1007+
// The standard library is bound to $std, which cannot be overriden,
1008+
// so redefining std won't break expressions that desugar to calls
1009+
// to standard library functions.
1010+
ast = make<Local>(ast->location, EF, singleBind(id(U"std"), std()), ast);
1011+
ast = make<Local>(ast->location, EF, singleBind(id(U"$std"), std_obj), ast);
10041012
}
10051013
};
10061014

10071015
DesugaredObject *makeStdlibAST(Allocator *alloc, std::string filename) {
1008-
Desugarer desugarer(alloc);
1016+
Desugarer desugarer(alloc, true);
10091017
return desugarer.stdlibAST(filename);
10101018
}
10111019

doc/ref/spec.html

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,7 @@ <h3 id="desugaring">Desugaring</h3>
11251125
</p>
11261126
<div class="desugar-rule">
11271127
\[
1128-
desugar(e) = desugar_{expr}(\local{\texttt{std} = e_{std}}{e}, false)
1128+
desugar(e) = desugar_{expr}(\local{\texttt{\$std} = e_{std}}{\local{\texttt{std} = \texttt{\$std}}{e}}, false)
11291129
\]
11301130
</div>
11311131
</div>
@@ -1287,7 +1287,7 @@ <h3 id="desugaring">Desugaring</h3>
12871287
<div class="desugar-rule">
12881288
\[
12891289
desugar_{expr}(e[e':e'':e'''], b) =
1290-
desugar_{expr}(\texttt{std.slice}(e, e', e'', e'''), b)
1290+
desugar_{expr}(\texttt{\$std.slice}(e, e', e'', e'''), b)
12911291
\]
12921292
</div>
12931293

@@ -1318,27 +1318,27 @@ <h3 id="desugaring">Desugaring</h3>
13181318

13191319
<div class="desugar-rule">
13201320
\[
1321-
desugar_{expr}(e \mathop{==} e', b) = desugar_{expr}(\texttt{std.equals}(e, e'), b)
1321+
desugar_{expr}(e \mathop{==} e', b) = desugar_{expr}(\texttt{\$std.equals}(e, e'), b)
13221322
\]
13231323
</div>
13241324

13251325
<div class="desugar-rule">
13261326
\[
1327-
desugar_{expr}(e \mathop{\%} e', b) = desugar_{expr}(\texttt{std.mod}(e, e'), b)
1327+
desugar_{expr}(e \mathop{\%} e', b) = desugar_{expr}(\texttt{\$std.mod}(e, e'), b)
13281328
\]
13291329
</div>
13301330

13311331
<div class="desugar-rule">
13321332
\[
13331333
desugar_{expr}(e \mathop{\texttt{in}} e', b) =
1334-
desugar_{expr}(\texttt{std.objectHasEx}(e', e, \texttt{true}), b)
1334+
desugar_{expr}(\texttt{\$std.objectHasEx}(e', e, \texttt{true}), b)
13351335
\]
13361336
</div>
13371337

13381338
<div class="desugar-rule">
13391339
\[
13401340
desugar_{expr}(e \mathop{\texttt{in}} \texttt{super}, b) =
1341-
desugar_{expr}(\texttt{std.objectHasEx}(\texttt{super}, e, \texttt{true}), b)
1341+
desugar_{expr}(\texttt{\$std.objectHasEx}(\texttt{super}, e, \texttt{true}), b)
13421342
\]
13431343
</div>
13441344
</div>
@@ -1484,8 +1484,8 @@ <h3 id="desugaring">Desugaring</h3>
14841484
\hspace{10mm}\textrm{Let }arr, i\textrm{ fresh} \\
14851485
\hspace{10mm}desugar_{expr}(
14861486
\local{arr = e'}{
1487-
\texttt{std.join}(\\\hspace{20mm}[\ ], \texttt{std.makeArray}(
1488-
\texttt{std.length}(arr),
1487+
\texttt{\$std.join}(\\\hspace{20mm}[\ ], \texttt{\$std.makeArray}(
1488+
\texttt{\$std.length}(arr),
14891489
\function{i}{\local{x = arr[i]}{desugar_{arrcomp}(e, compspec, b)}}
14901490
))
14911491
},
@@ -1499,8 +1499,8 @@ <h3 id="desugaring">Desugaring</h3>
14991499
\hspace{10mm}\textrm{Let }arr, i\textrm{ fresh} \\
15001500
\hspace{10mm}desugar_{expr}(
15011501
\local{arr = e'}{
1502-
\texttt{std.join}(\\\hspace{20mm}[\ ], \texttt{std.makeArray}(
1503-
\texttt{std.length}(arr),
1502+
\texttt{\$std.join}(\\\hspace{20mm}[\ ], \texttt{\$std.makeArray}(
1503+
\texttt{\$std.length}(arr),
15041504
\function{i}{\local{x = arr[i]}{[e]}}
15051505
))
15061506
},

0 commit comments

Comments
 (0)