diff --git a/packages/codemirror/themes/algoboy.mjs b/packages/codemirror/themes/algoboy.mjs index 399370e1..eba95b98 100644 --- a/packages/codemirror/themes/algoboy.mjs +++ b/packages/codemirror/themes/algoboy.mjs @@ -18,6 +18,7 @@ export default createTheme({ theme: 'light', settings, styles: [ + { tag: t.labelName, color: '#0f380f' }, { tag: t.keyword, color: '#0f380f' }, { tag: t.operator, color: '#0f380f' }, { tag: t.special(t.variableName), color: '#0f380f' }, diff --git a/packages/codemirror/themes/blackscreen.mjs b/packages/codemirror/themes/blackscreen.mjs index 135285a3..5671a6d8 100644 --- a/packages/codemirror/themes/blackscreen.mjs +++ b/packages/codemirror/themes/blackscreen.mjs @@ -15,6 +15,7 @@ export default createTheme({ theme: 'dark', settings, styles: [ + { tag: t.labelName, color: 'white' }, { tag: t.keyword, color: 'white' }, { tag: t.operator, color: 'white' }, { tag: t.special(t.variableName), color: 'white' }, diff --git a/packages/codemirror/themes/bluescreen.mjs b/packages/codemirror/themes/bluescreen.mjs index aa6489d6..eb04c411 100644 --- a/packages/codemirror/themes/bluescreen.mjs +++ b/packages/codemirror/themes/bluescreen.mjs @@ -18,6 +18,7 @@ export default createTheme({ theme: 'dark', settings, styles: [ + { tag: t.labelName, color: 'white' }, { tag: t.keyword, color: 'white' }, { tag: t.operator, color: 'white' }, { tag: t.special(t.variableName), color: 'white' }, diff --git a/packages/codemirror/themes/strudel-theme.mjs b/packages/codemirror/themes/strudel-theme.mjs index 4ae31060..4ec3ab92 100644 --- a/packages/codemirror/themes/strudel-theme.mjs +++ b/packages/codemirror/themes/strudel-theme.mjs @@ -15,6 +15,7 @@ export default createTheme({ gutterForeground: '#8a919966', }, styles: [ + { tag: t.labelName, color: '#89ddff' }, { tag: t.keyword, color: '#c792ea' }, { tag: t.operator, color: '#89ddff' }, { tag: t.special(t.variableName), color: '#eeffff' }, diff --git a/packages/codemirror/themes/teletext.mjs b/packages/codemirror/themes/teletext.mjs index 5fd9a557..ddbf7b33 100644 --- a/packages/codemirror/themes/teletext.mjs +++ b/packages/codemirror/themes/teletext.mjs @@ -27,6 +27,7 @@ export default createTheme({ theme: 'dark', settings, styles: [ + { tag: t.labelName, color: colorB }, { tag: t.keyword, color: colorA }, { tag: t.operator, color: mini }, { tag: t.special(t.variableName), color: colorA }, diff --git a/packages/codemirror/themes/terminal.mjs b/packages/codemirror/themes/terminal.mjs index 1374bb86..90c6e1d2 100644 --- a/packages/codemirror/themes/terminal.mjs +++ b/packages/codemirror/themes/terminal.mjs @@ -14,6 +14,7 @@ export default createTheme({ theme: 'dark', settings, styles: [ + { tag: t.labelName, color: '#41FF00' }, { tag: t.keyword, color: '#41FF00' }, { tag: t.operator, color: '#41FF00' }, { tag: t.special(t.variableName), color: '#41FF00' }, diff --git a/packages/codemirror/themes/whitescreen.mjs b/packages/codemirror/themes/whitescreen.mjs index 22abad9e..5abbb1ea 100644 --- a/packages/codemirror/themes/whitescreen.mjs +++ b/packages/codemirror/themes/whitescreen.mjs @@ -16,6 +16,7 @@ export default createTheme({ theme: 'light', settings, styles: [ + { tag: t.labelName, color: 'black' }, { tag: t.keyword, color: 'black' }, { tag: t.operator, color: 'black' }, { tag: t.special(t.variableName), color: 'black' }, diff --git a/packages/transpiler/transpiler.mjs b/packages/transpiler/transpiler.mjs index 72f2e851..a49b353d 100644 --- a/packages/transpiler/transpiler.mjs +++ b/packages/transpiler/transpiler.mjs @@ -49,6 +49,9 @@ export function transpiler(input, options = {}) { if (isBareSamplesCall(node, parent)) { return this.replace(withAwait(node)); } + if (isLabelStatement(node)) { + return this.replace(labelToP(node)); + } }, leave(node, parent, prop, index) {}, }); @@ -132,3 +135,33 @@ function withAwait(node) { argument: node, }; } + +function isLabelStatement(node) { + return node.type === 'LabeledStatement'; +} + +// converts label expressions to p calls: "x: y" to "y.p('x')" +// see https://github.com/tidalcycles/strudel/issues/990 +function labelToP(node) { + return { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'MemberExpression', + object: node.body.expression, + property: { + type: 'Identifier', + name: 'p', + }, + }, + arguments: [ + { + type: 'Literal', + value: node.label.name, + raw: `'${node.label.name}'`, + }, + ], + }, + }; +}