diff --git a/samples/let-in.nix b/samples/let-in.nix new file mode 100644 index 0000000..2cd9000 --- /dev/null +++ b/samples/let-in.nix @@ -0,0 +1 @@ +let x = { a = 1; b = x.a + 1; c = x.b + 1; }; in x.c diff --git a/src/prepare-ast.js b/src/prepare-ast.js index 92cbee6..c894cd4 100644 --- a/src/prepare-ast.js +++ b/src/prepare-ast.js @@ -108,6 +108,7 @@ function convertNode(node) { parenthesized: "NixParenthesizedExpression", attrset: "NixAttributeSet", rec_attrset: "NixAttributeSet", + let: "NixLetIn", identifier: "NixIdentifier", attr_identifier: "NixAttributeIdentifier", attrpath: "NixAttributePath", diff --git a/src/transformers/_nix-types.js b/src/transformers/_nix-types.js index 4ab71b6..4c3a0b3 100644 --- a/src/transformers/_nix-types.js +++ b/src/transformers/_nix-types.js @@ -40,5 +40,12 @@ let types = module.exports = { type: "NixAttributeIdentifier", name: name }; + }, + NixAttributeSelection: function (expression, attributePath) { + return { + type: "NixAttributeSelection", + attrpath: types.NixAttributePath(attributePath), + expression: expression + }; } }; diff --git a/src/transformers/index.js b/src/transformers/index.js index 1764dc5..9007aa9 100644 --- a/src/transformers/index.js +++ b/src/transformers/index.js @@ -100,6 +100,7 @@ let trivial = { }; module.exports = [ + require("./let-in"), require("./desugar-attrsets"), require("./literals"), require("./functions"), diff --git a/src/transformers/let-in.js b/src/transformers/let-in.js new file mode 100644 index 0000000..d04704c --- /dev/null +++ b/src/transformers/let-in.js @@ -0,0 +1,21 @@ +"use strict"; + +const nixTypes = require("./_nix-types"); + +module.exports = { + name: "let-in", + visitors: { + NixLetIn: (node) => { + return nixTypes.NixAttributeSelection( + nixTypes.NixAttributeSet([ + ... node.bind, + nixTypes.NixBinding( + [ nixTypes.NixAttributeIdentifier("$$jsNix$letBody") ], + node.body + ) + ], true), + [ nixTypes.NixAttributeIdentifier("$$jsNix$letBody") ] + ); + } + } +};