Skip to content

Make AST immutable to allow for multi-file support#842

Open
huydo862003 wants to merge 28 commits intomasterfrom
refactor/ast-immutable
Open

Make AST immutable to allow for multi-file support#842
huydo862003 wants to merge 28 commits intomasterfrom
refactor/ast-immutable

Conversation

@huydo862003
Copy link
Contributor

@huydo862003 huydo862003 commented Mar 17, 2026

Overview

  • Makes ASTs immutable — prerequisite for incremental multi-file compilation
    • Assign SyntaxNode.parent right in parser instead of in validator.
    • Move symbols out of ASTs.
      -> ASTs become immutable after their phase -> re-binding one file no longer touches others
  • Interpreter now keeps a reference to the Compiler, because global queries in the future will need whole project's information, not just scoped to a file.

Problem

  • Lexer, parser are local phases: that is, they can run without needing information from other files -> their output could be cached for each file.
  • Binder (and interpreter) is a global phase. It currently mutates data across files:
    • Mutate parser's result: SyntaxNode.symbol, .referees
  • Result: When any file changes, SyntaxNode.symbol and SyntaxNode.referees become outdated. Since these are attached to the parser results, re-binding must force full re-parse of everything.

@huydo862003 huydo862003 marked this pull request as draft March 17, 2026 03:49
@huydo862003 huydo862003 force-pushed the refactor/ast-immutable branch from ff5272c to 1627dcb Compare March 17, 2026 03:53
@huydo862003 huydo862003 reopened this Mar 17, 2026
@huydo862003 huydo862003 force-pushed the refactor/ast-immutable branch 5 times, most recently from 42b4ee9 to 7b72e6e Compare March 17, 2026 07:45
@huydo862003 huydo862003 force-pushed the refactor/ast-immutable branch from 7b72e6e to 3e3e473 Compare March 17, 2026 08:05
@huydo862003 huydo862003 marked this pull request as ready for review March 17, 2026 10:16
@huydo862003 huydo862003 force-pushed the refactor/ast-immutable branch from b4e7f6a to 632bc32 Compare March 17, 2026 10:24
@huydo862003 huydo862003 changed the title Make AST immutable to allow for multi-file support Make AST & Symbol immutable to allow for multi-file support Mar 20, 2026
@huydo862003 huydo862003 force-pushed the refactor/ast-immutable branch 5 times, most recently from f2d9f74 to ad58955 Compare March 25, 2026 13:25
@huydo862003 huydo862003 changed the title Make AST & Symbol immutable to allow for multi-file support Make AST immutable to allow for multi-file support Mar 25, 2026
…), utility methods (resolvedSymbol, nodeReferee, nodeReferences), simplify tests
…t, refsOf — inline args and return CompileError[] directly
@huydo862003 huydo862003 requested a review from xuantho573 March 26, 2026 08:43
@github-actions
Copy link

Coverage Report

Commit: c0f4ee5

Overall Coverage

Metric Coverage
Lines ✅ 84.51% (5499/6507)
Statements ✅ 83.74% (5861/6999)
Functions ✅ 89.39% (1272/1423)
Branches ⚠️ 75.52% (3041/4027)

Package Coverage

Package Lines Statements Functions Branches
@dbml/dbml-cli ✅ 100.00% ✅ 100.00% ✅ 100.00% ✅ 100.00%
@dbml/dbml-connector ⚠️ 64.62% ⚠️ 64.36% ⚠️ 59.53% ⚠️ 59.09%
@dbml/dbml-core N/A N/A N/A N/A
@dbml/dbml-parse ✅ 87.88% ✅ 87.01% ✅ 93.51% ⚠️ 78.01%

⚠️ Coverage Warnings

The following packages have coverage below 80%:

  • @dbml/dbml-connector: 64.62% line coverage

Files with Coverage Below 80%

@dbml/dbml-connector

9 file(s) below 80% coverage
File Lines Statements Functions Branches
src/connectors/bigquery/index.ts 0.00% 0.00% 0.00% 0.00%
src/utils/credential-loader.ts 0.00% 0.00% 0.00% 0.00%
src/utils/helpers.ts 0.00% 0.00% 0.00% 0.00%
src/connectors/snowflake/index.ts 10.56% 10.31% 0.00% 0.00%
src/utils/parseSchema.ts 46.15% 42.85% 28.57% 27.27%
src/connectors/connector.ts 66.66% 66.66% 100.00% 57.14%
src/connectors/oracle/tables.ts 71.25% 67.39% 100.00% 56.96%
src/connectors/oracle/index.ts 80.00% 80.76% 100.00% 25.00%
src/connectors/oracle/utils.ts 85.71% 85.71% 100.00% 71.42%

@dbml/dbml-parse

41 file(s) below 80% coverage
File Lines Statements Functions Branches
src/compiler/queries/container/scope.ts 0.00% 0.00% 0.00% 0.00%
src/services/diagnostics/provider.ts 0.00% 0.00% 0.00% 0.00%
src/core/interpreter/elementInterpreter/project.ts 52.77% 52.77% 100.00% 36.36%
src/core/interpreter/records/utils/data/sqlTypes.ts 56.25% 58.82% 75.00% 46.55%
src/core/analyzer/symbol/utils.ts 56.52% 56.52% 100.00% 50.00%
src/compiler/queries/parse.ts 57.14% 57.14% 50.00% 100.00%
src/core/analyzer/binder/elementBinder/note.ts 62.50% 64.70% 83.33% 50.00%
src/compiler/queries/utils.ts 64.83% 65.95% 88.88% 47.43%
src/core/interpreter/records/utils/data/values.ts 65.13% 57.14% 72.72% 50.37%
src/compiler/queries/token.ts 66.66% 66.66% 66.66% 100.00%
src/core/analyzer/binder/elementBinder/enum.ts 66.66% 68.42% 100.00% 50.00%
src/core/analyzer/validator/elementValidators/indexes.ts 72.00% 74.07% 90.90% 57.69%
src/core/analyzer/validator/elementValidators/note.ts 74.50% 72.72% 76.92% 68.75%
src/core/analyzer/analyzer.ts 76.92% 73.33% 71.42% 0.00%
src/core/analyzer/symbol/symbolIndex.ts 76.92% 77.50% 92.85% 50.00%
src/core/analyzer/binder/elementBinder/project.ts 77.77% 78.94% 100.00% 50.00%
src/core/analyzer/validator/elementValidators/project.ts 78.12% 78.78% 100.00% 56.25%
src/core/utils.ts 78.57% 77.41% 80.00% 60.71%
src/core/analyzer/utils.ts 78.64% 77.88% 88.23% 79.34%
src/core/analyzer/binder/elementBinder/ref.ts 78.78% 80.00% 90.90% 75.00%
src/core/analyzer/validator/elementValidators/records.ts 79.45% 80.00% 93.75% 74.19%
src/core/analyzer/binder/elementBinder/indexes.ts 79.54% 78.26% 90.90% 68.18%
src/core/analyzer/validator/elementValidators/checks.ts 79.62% 81.03% 93.75% 71.87%
src/core/analyzer/binder/elementBinder/tableGroup.ts 80.00% 80.64% 100.00% 50.00%
src/services/utils.ts 80.00% 66.66% 100.00% 50.00%
src/services/suggestions/utils.ts 80.39% 75.00% 92.85% 68.51%
src/core/interpreter/records/utils/constraints/pk.ts 82.00% 80.00% 92.30% 54.54%
src/core/analyzer/binder/elementBinder/records.ts 82.97% 83.50% 93.75% 71.42%
src/compiler/queries/container/token.ts 83.33% 85.71% 100.00% 75.00%
src/core/interpreter/elementInterpreter/tablePartial.ts 83.33% 82.40% 84.00% 77.27%
src/core/analyzer/validator/elementValidators/tablePartial.ts 83.52% 80.82% 87.23% 64.28%
src/core/analyzer/validator/elementValidators/enum.ts 85.05% 83.51% 84.21% 78.26%
src/core/analyzer/binder/elementBinder/tablePartial.ts 86.00% 86.53% 100.00% 69.23%
src/core/parser/parser.ts 87.27% 87.42% 100.00% 79.62%
src/services/suggestions/recordRowSnippet.ts 88.67% 84.61% 100.00% 78.00%
src/compiler/queries/symbol.ts 91.66% 92.30% 100.00% 78.57%
__tests__/utils/compiler.ts 93.13% 92.80% 100.00% 68.13%
src/core/interpreter/elementInterpreter/sticky_note.ts 95.23% 95.45% 100.00% 66.66%
src/core/interpreter/records/utils/constraints/unique.ts 96.15% 93.93% 100.00% 66.66%
src/core/analyzer/symbol/symbolTable.ts 100.00% 100.00% 100.00% 75.00%
src/services/definition/provider.ts 100.00% 94.11% 100.00% 70.00%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant