From 4b81eda1e71727f59fe7a0d26abde186ed78c876 Mon Sep 17 00:00:00 2001 From: Matt Fysh Date: Wed, 14 Aug 2024 15:53:38 +1000 Subject: [PATCH 1/2] rename function expressions to subqueries --- .changeset/slimy-wombats-smash.md | 6 ++++++ packages/get/execute.ts | 4 ++-- packages/parser/ast/ast.ts | 14 +++++++------- packages/parser/ast/print.ts | 8 +++++--- packages/parser/ast/scope.ts | 2 +- packages/parser/desugar/inference/base.ts | 4 ++-- packages/parser/desugar/inference/context.ts | 4 ++-- packages/parser/desugar/inference/typeinfo.ts | 4 ++-- packages/parser/desugar/trace.ts | 2 +- packages/parser/grammar/getlang.ne | 6 +++--- packages/parser/grammar/parse.ts | 2 +- test/modules.spec.ts | 4 ++-- 12 files changed, 34 insertions(+), 26 deletions(-) create mode 100644 .changeset/slimy-wombats-smash.md diff --git a/.changeset/slimy-wombats-smash.md b/.changeset/slimy-wombats-smash.md new file mode 100644 index 0000000..6513f4f --- /dev/null +++ b/.changeset/slimy-wombats-smash.md @@ -0,0 +1,6 @@ +--- +"@getlang/parser": minor +"@getlang/get": patch +--- + +rename function expressions to subqueries diff --git a/packages/get/execute.ts b/packages/get/execute.ts index 05130e3..4dc4834 100644 --- a/packages/get/execute.ts +++ b/packages/get/execute.ts @@ -254,13 +254,13 @@ export async function execute( }, }, - FunctionExpr: { + SubqueryExpr: { async enter(node, visit) { return ctx(node, visit, async () => { const ex = await executeBody(visit, node.body, scope.context) invariant( ex, - new QuerySyntaxError('Function missing extract statement'), + new QuerySyntaxError('Subquery missing extract statement'), ) return ex }) diff --git a/packages/parser/ast/ast.ts b/packages/parser/ast/ast.ts index c5686c6..f176a65 100644 --- a/packages/parser/ast/ast.ts +++ b/packages/parser/ast/ast.ts @@ -17,7 +17,7 @@ export enum NodeKind { IdentifierExpr = 'IdentifierExpr', SelectorExpr = 'SelectorExpr', ModifierExpr = 'ModifierExpr', - FunctionExpr = 'FunctionExpr', + SubqueryExpr = 'SubqueryExpr', ModuleCallExpr = 'ModuleCallExpr', ObjectLiteralExpr = 'ObjectLiteralExpr', SliceExpr = 'SliceExpr', @@ -114,8 +114,8 @@ type ModifierExpr = { typeInfo: TypeInfo } -type FunctionExpr = { - kind: NodeKind.FunctionExpr +type SubqueryExpr = { + kind: NodeKind.SubqueryExpr body: Stmt[] context?: Expr typeInfo: TypeInfo @@ -158,7 +158,7 @@ export type Expr = | IdentifierExpr | SelectorExpr | ModifierExpr - | FunctionExpr + | SubqueryExpr | ModuleCallExpr | ObjectLiteralExpr | SliceExpr @@ -229,8 +229,8 @@ const requestExpr = ( typeInfo: { type: Type.Value }, }) -const functionExpr = (body: Stmt[], context?: Expr): FunctionExpr => ({ - kind: NodeKind.FunctionExpr, +const subqueryExpr = (body: Stmt[], context?: Expr): SubqueryExpr => ({ + kind: NodeKind.SubqueryExpr, body, typeInfo: { type: Type.Value }, context, @@ -323,6 +323,6 @@ export const t = { modifierExpr, sliceExpr, objectLiteralExpr, - functionExpr, + subqueryExpr, moduleCallExpr, } diff --git a/packages/parser/ast/print.ts b/packages/parser/ast/print.ts index aa48923..5e6bc67 100644 --- a/packages/parser/ast/print.ts +++ b/packages/parser/ast/print.ts @@ -197,14 +197,16 @@ const printVisitor: InterpretVisitor = { return node.context ? [node.context, indent([line, '-> ', slice])] : slice }, - FunctionExpr(node) { - const fn = [ + SubqueryExpr(node) { + const subquery = [ '(', indent(node.body.flatMap(x => [hardline, x])), hardline, ')', ] - return node.context ? [node.context, indent([line, '-> ', fn])] : fn + return node.context + ? [node.context, indent([line, '-> ', subquery])] + : subquery }, } diff --git a/packages/parser/ast/scope.ts b/packages/parser/ast/scope.ts index ac170fa..37f9531 100644 --- a/packages/parser/ast/scope.ts +++ b/packages/parser/ast/scope.ts @@ -52,7 +52,7 @@ export class RootScope { set extracted(data: T) { if (this.scope.extracted !== undefined) { - console.warn('Functions must contain a single extract statement') + console.warn('Subqueries must contain a single extract statement') } else { this.scope.extracted = data } diff --git a/packages/parser/desugar/inference/base.ts b/packages/parser/desugar/inference/base.ts index 26a3a54..c355e45 100644 --- a/packages/parser/desugar/inference/base.ts +++ b/packages/parser/desugar/inference/base.ts @@ -110,9 +110,9 @@ export function inferBase(): TransformVisitor { return { ...node, body: insertUrls(node.body, urls) } }, - FunctionExpr: { + SubqueryExpr: { enter(node, visit) { - const xnode = trace.FunctionExpr.enter(node, visit) + const xnode = trace.SubqueryExpr.enter(node, visit) return { ...xnode, body: insertUrls(xnode.body, urls) } }, }, diff --git a/packages/parser/desugar/inference/context.ts b/packages/parser/desugar/inference/context.ts index ebd8a6e..09dc65e 100644 --- a/packages/parser/desugar/inference/context.ts +++ b/packages/parser/desugar/inference/context.ts @@ -82,9 +82,9 @@ export function inferContext(): TransformVisitor { return { ...node, body: insertParsers(node.body, parsers) } }, - FunctionExpr: { + SubqueryExpr: { enter(node, visit) { - const xnode = trace.FunctionExpr.enter(node, visit) + const xnode = trace.SubqueryExpr.enter(node, visit) return { ...xnode, body: insertParsers(xnode.body, parsers) } }, }, diff --git a/packages/parser/desugar/inference/typeinfo.ts b/packages/parser/desugar/inference/typeinfo.ts index 46d12e9..26ab9c3 100644 --- a/packages/parser/desugar/inference/typeinfo.ts +++ b/packages/parser/desugar/inference/typeinfo.ts @@ -175,9 +175,9 @@ export function inferTypeInfo(): TransformVisitor { }, }, - FunctionExpr: { + SubqueryExpr: { enter(node, visit) { - const xnode = trace.FunctionExpr.enter(node, itemVisit(node, visit)) + const xnode = trace.SubqueryExpr.enter(node, itemVisit(node, visit)) const typeInfo = xnode.body.find( stmt => stmt.kind === NodeKind.ExtractStmt, )?.value.typeInfo ?? { type: Type.Never } diff --git a/packages/parser/desugar/trace.ts b/packages/parser/desugar/trace.ts index eebe70a..86f236e 100644 --- a/packages/parser/desugar/trace.ts +++ b/packages/parser/desugar/trace.ts @@ -35,7 +35,7 @@ export function traceVisitor(scope: RootScope) { }, // contextual expressions - FunctionExpr: { + SubqueryExpr: { enter(node, visit) { return ctx(node, visit, node => { scope.push() diff --git a/packages/parser/grammar/getlang.ne b/packages/parser/grammar/getlang.ne index 9e13bc5..eaa0b3d 100644 --- a/packages/parser/grammar/getlang.ne +++ b/packages/parser/grammar/getlang.ne @@ -43,12 +43,12 @@ drill -> (%drill_arrow _):? expression {% p.drillContext %} ### EXPR expression -> (template | slice | modifier) {% p.idd %} -expression -> (object | function | module_call) {% p.idd %} +expression -> (object | subquery | module_call) {% p.idd %} expression -> id_expr {% p.identifier %} -### FUNCTIONS -function -> "(" _ statements _ ")" {% p.fn %} +### SUBQUERIES +subquery -> "(" _ statements _ ")" {% p.subquery %} module_call -> id_expr "(" object:? ")" {% p.moduleCall %} diff --git a/packages/parser/grammar/parse.ts b/packages/parser/grammar/parse.ts index 9af7718..c31dcf6 100644 --- a/packages/parser/grammar/parse.ts +++ b/packages/parser/grammar/parse.ts @@ -81,7 +81,7 @@ export const assignment: PP = ([, , name, optional, , , , expr]) => export const extract: PP = ([, , exports]) => t.extractStmt(exports) -export const fn: PP = ([, , stmts]) => t.functionExpr(stmts) +export const subquery: PP = ([, , stmts]) => t.subqueryExpr(stmts) export const moduleCall: PP = ([name, , optInputs]) => t.moduleCallExpr(name, optInputs?.[0]) diff --git a/test/modules.spec.ts b/test/modules.spec.ts index 1ac69ad..f77f349 100644 --- a/test/modules.spec.ts +++ b/test/modules.spec.ts @@ -151,7 +151,7 @@ describe('modules', () => { expect(result).toEqual({ test: true }) }) - test('func scope with context', async () => { + test('subquery scope with context', async () => { const result = await execute(` set x = \`{ test: true }\` extract $x -> ( extract $ ) @@ -159,7 +159,7 @@ describe('modules', () => { expect(result).toEqual({ test: true }) }) - test('func scope with closures', async () => { + test('subquery scope with closures', async () => { const result = await execute(` set x = \`{ test: true }\` extract ( From 5a73edf07840cb4cf85e8ec7b94d97b0569cdde6 Mon Sep 17 00:00:00 2001 From: Matt Fysh Date: Wed, 14 Aug 2024 16:08:36 +1000 Subject: [PATCH 2/2] run checks on pull request --- .github/workflows/pull-request.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .github/workflows/pull-request.yaml diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml new file mode 100644 index 0000000..993e9ce --- /dev/null +++ b/.github/workflows/pull-request.yaml @@ -0,0 +1,5 @@ +on: pull_request + +jobs: + checks: + uses: ./.github/workflows/checks.yaml