From 7f68a53f86c4ebac6fb2f0f79b25c39b9ec637f3 Mon Sep 17 00:00:00 2001 From: "claude@clouddev1" Date: Thu, 21 May 2026 21:52:49 +0000 Subject: [PATCH] walker+completion: surface list trailing-optionals + identifiers-first ordering (ADR-0022 Amendment 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit walk_repeated discarded the last matched item's trailing-optional expectations at a clean item boundary, so a comma-separated list offered no continuation after a complete item: `order by Name ` gave no asc/desc, `select Name ` no `as`, `create table … Code(text) ` no not/unique/default/check. Capture the last item's skipped set and surface it when the list ends at an item boundary (the separator `,` itself is deliberately not surfaced). That fix made expression-position candidate lists long, which exposed a visibility problem: the hint panel's candidate line is single-row and window-scrolls on overflow, centring on item 0 when nothing is selected — so with keywords-first, schema identifiers scrolled off behind the `>` marker. Reverse the ordering: schema identifiers (table/column/relationship names) now sort before keywords, since a name the user would have to look up is the highest-value completion and must stay visible (keywords are learned over time; the tok_identifier/tok_keyword colour split marks the boundary). This reverses the handoff-14 keywords-first call, now recorded in ADR-0022 Amendment 2. Tests: walker expected-set + completion-layer regressions for the trailing-optionals and the ordering; candidate_ordering.rs header invariant inverted; ~20 typing-surface snapshots re-baselined; a two-line hint box recorded as a deferred follow-up. --- docs/adr/0022-ambient-typing-assistance.md | 69 ++++++++++ docs/adr/README.md | 2 +- src/completion.rs | 126 ++++++++++++++---- src/dsl/walker/driver.rs | 37 +++-- src/dsl/walker/mod.rs | 20 +++ tests/typing_surface/candidate_ordering.rs | 57 ++++---- ...ers_before_table@add_column_after_to.snap} | 17 +-- ...words@add_column_idents_then_keyword.snap} | 33 ++--- ...o_before_table@add_column_connectives.snap | 33 ++--- ...efore_table@change_column_connectives.snap | 33 ++--- ...ords@drop_column_idents_then_keyword.snap} | 33 ++--- ..._before_table@drop_column_connectives.snap | 33 ++--- ...efore_table@rename_column_connectives.snap | 33 ++--- ...ffix_parses@create_table_check_suffix.snap | 53 +++++++- ...ix_parses@create_table_default_suffix.snap | 53 +++++++- ...h_compound_pk_parses@with_compound_pk.snap | 53 +++++++- ...h_explicit_pk_parses@with_explicit_pk.snap | 53 +++++++- ...offers_typed_prose@after_where_equals.snap | 25 ++-- ..._table_columns_no_leakage@after_where.snap | 33 ++--- ...umn_says_yyyy_mm_dd_t@datetime_column.snap | 25 ++-- ..._column_offers_table_names@after_from.snap | 17 +-- ..._and_names@after_relationship_keyword.snap | 17 +-- ...ns_no_leakage@explain_show_data_where.snap | 33 ++--- ...offers_typed_prose@after_where_equals.snap | 25 ++-- ...fers_active_table_columns@after_where.snap | 33 ++--- ...keyword_expects_a_predicate@after_not.snap | 49 +++---- ...tween_expects_a_low_bound@between_low.snap | 25 ++-- ...n_paren_expects_an_item@in_open_paren.snap | 25 ++-- 28 files changed, 716 insertions(+), 329 deletions(-) rename tests/typing_surface/snapshots/{typing_surface_matrix__typing_surface__candidate_ordering__add_column_after_to_lists_table_before_identifiers@add_column_after_to.snap => typing_surface_matrix__typing_surface__candidate_ordering__add_column_after_to_lists_identifiers_before_table@add_column_after_to.snap} (98%) rename tests/typing_surface/snapshots/{typing_surface_matrix__typing_surface__candidate_ordering__add_column_keyword_precedes_table_identifiers@add_column_keyword_then_idents.snap => typing_surface_matrix__typing_surface__candidate_ordering__add_column_identifiers_precede_table_keywords@add_column_idents_then_keyword.snap} (98%) rename tests/typing_surface/snapshots/{typing_surface_matrix__typing_surface__candidate_ordering__drop_column_keyword_precedes_table_identifiers@drop_column_keyword_then_idents.snap => typing_surface_matrix__typing_surface__candidate_ordering__drop_column_identifiers_precede_table_keywords@drop_column_idents_then_keyword.snap} (98%) diff --git a/docs/adr/0022-ambient-typing-assistance.md b/docs/adr/0022-ambient-typing-assistance.md index eaf70da..170c4e4 100644 --- a/docs/adr/0022-ambient-typing-assistance.md +++ b/docs/adr/0022-ambient-typing-assistance.md @@ -480,6 +480,75 @@ re-baseline those snapshots. New snapshots cover: The snapshots are the regression net for "did we change the visual output unexpectedly". +## Amendment 2 — Candidate ordering: schema identifiers before keywords (2026-05-21) + +This amendment **reverses the candidate-ordering call made in the +handoff-14 ranker discussion** (keywords before schema +identifiers). That call was never recorded in an ADR — it lived +only in `tests/typing_surface/candidate_ordering.rs` — so this +amendment also gives the ordering a decision record. + +### The obsolete premise + +Handoff-14 ordered command-part keywords before schema +identifiers on the rationale that "grammar parts are read before +the content that fills them," so `add column to table T` reads in +order. That held while candidate lists were short. The SQL surface +(ADR-0030/0031/0032/0033) made lists long — an expression position +such as `where Name ` or `order by ` legitimately offers the +column names *plus* the full expression-continuation keyword run +(`is not like between in and or`, plus `asc`/`desc` in ORDER BY). + +The hint panel's candidate line is **single-row and +window-scrolled** (`render_candidate_line`): when it overflows it +centres on the selected item, or on item 0 when nothing is +selected (the ambient, just-typed state). With keywords first, the +schema identifiers sat at the tail and scrolled off behind the `>` +marker — invisible until the user Tab-cycled to them. + +### The decision + +Schema identifiers (table / column / relationship names) now sort +**before** keywords in the candidate list. A name the user would +otherwise have to look up is the highest-value completion — +valuable even to experts, who come to know the keywords over time — +so it must stay visible by default. Within each section the prior +rules are unchanged: identifiers alphabetised; keywords in +grammar-declaration order (`to` before `table`); then type names, +composite literals, branching punct, flags. The existing colour +split (`tok_identifier` teal vs `tok_keyword` purple, §colour) +makes the section boundary legible once both are on screen. + +### Related fix — Repeated trailing optionals + +This amendment shipped alongside a `walk_repeated` fix: a +comma-separated list (`Repeated`) was discarding the last matched +item's trailing-optional expectations at a clean item boundary, so +`order by Name ` offered no `asc`/`desc`, `select Name ` no `as`, +and `create table … Code(text) ` no `not`/`unique`/`default`/ +`check`. Those now surface (the separator `,` itself is +deliberately not surfaced). This is what made identifier +visibility pressing — the lists these positions produce are now +both correct and long. + +### Deferred — two-line hint box + +As hint lists grow, a **two-line candidate box** (more candidates +visible without scrolling) is worth considering. Deferred for now +on screen-space grounds; recorded so it is not lost. + +### Coverage + +`tests/typing_surface/candidate_ordering.rs` rewritten to assert +identifiers precede keywords (header invariant #2 inverted; the +`to`-before-`table` keyword-order invariant #1 retained). +`completion::tests::identifiers_come_before_keywords_in_grammar_order` +and `identifiers_precede_keywords_at_expression_position` lock the +ordering; `order_by_after_sort_item_offers_direction`, +`projection_after_item_offers_alias_keyword`, and +`create_table_after_column_spec_offers_constraints` lock the +trailing-optional fix. ~20 typing-surface snapshots re-baselined. + ## Out of scope Deliberately deferred to keep this ADR shippable as a single diff --git a/docs/adr/README.md b/docs/adr/README.md index e0d2b8b..9a9f934 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -27,7 +27,7 @@ This directory contains the project's ADRs, recorded per - [ADR-0019 — Friendly error layer (H1) and i18n message catalog](0019-friendly-error-layer-and-i18n.md) - [ADR-0020 — Tokenization layer for the DSL parser](0020-tokenization-layer-for-the-dsl-parser.md) - [ADR-0021 — Parser-as-source-of-truth for H1a (per-command usage in parse errors)](0021-parser-as-source-of-truth-for-h1a.md) -- [ADR-0022 — Ambient typing assistance: colour, hint panel, completion (I3 + I4)](0022-ambient-typing-assistance.md) — **Amendment 1 supersedes §12's simple-mode-only carve-out**: the unified mode-aware walker (ADR-0030/0031/0032) now speaks SQL, so advanced-mode ambient assistance is re-enabled. `ambient_hint_in_mode` + `hint_resolution_at_input_in_mode` + `expected_for_hint_snapshot` thread `Mode`; `render_hint_panel` calls ambient for all modes (no more advanced-mode `None`); the one-shot `:` sigil is stripped before the ambient walk. Fixes a live bug where advanced-mode SQL hinting/completion-preview were dead despite Phase 2 marking them green (validated at the engine layer, not the UI). Simple-mode gating, highlighting, and the §13 performance posture are unchanged; covered by an app-level render test plus ambient-layer regression locks +- [ADR-0022 — Ambient typing assistance: colour, hint panel, completion (I3 + I4)](0022-ambient-typing-assistance.md) — **Amendment 1 supersedes §12's simple-mode-only carve-out**: the unified mode-aware walker (ADR-0030/0031/0032) now speaks SQL, so advanced-mode ambient assistance is re-enabled. `ambient_hint_in_mode` + `hint_resolution_at_input_in_mode` + `expected_for_hint_snapshot` thread `Mode`; `render_hint_panel` calls ambient for all modes (no more advanced-mode `None`); the one-shot `:` sigil is stripped before the ambient walk. Fixes a live bug where advanced-mode SQL hinting/completion-preview were dead despite Phase 2 marking them green (validated at the engine layer, not the UI). Simple-mode gating, highlighting, and the §13 performance posture are unchanged; covered by an app-level render test plus ambient-layer regression locks; **Amendment 2 reverses the handoff-14 keywords-first candidate ordering** — schema identifiers (table/column/relationship names) now sort *before* keywords so a name the user would have to look up stays visible in the single-row, window-scrolled candidate line (keywords are learned over time; the `tok_identifier`/`tok_keyword` colour split marks the boundary); shipped with a `walk_repeated` fix that surfaces a list item's trailing optionals at a clean boundary (`order by Name ` → `asc`/`desc`, `select Name ` → `as`, `create table … Code(text) ` → `not`/`unique`/`default`/`check`; the `,` separator deliberately not surfaced); records a deferred two-line hint box for growing lists - [ADR-0023 — Unified declarative grammar tree](0023-unified-grammar-tree.md) — direction (superseded for execution detail by ADR-0024) - [ADR-0024 — Unified grammar tree: execution plan](0024-unified-grammar-tree-execution-plan.md) — **Accepted**, the executable spec — implemented (Phases A–F; Phase F shipped "minimal", `parser.rs` retained as the router — see the ADR's Phase F implementation note) - [ADR-0025 — Indexes](0025-indexes.md) — **Accepted**, `add index` / `drop index`, persistence, rebuild-table preservation, and items-list display (`C3` index portion + `S2`) diff --git a/src/completion.rs b/src/completion.rs index 5d09fcc..76f80f4 100644 --- a/src/completion.rs +++ b/src/completion.rs @@ -158,8 +158,8 @@ pub struct Completion { /// Partial prefix the user has typed at the cursor. Empty /// when the cursor is at a token boundary. pub partial_prefix: String, - /// Fitting candidates, ordered keywords-first then - /// identifiers, alphabetised within each group, deduplicated. + /// Fitting candidates, ordered schema-identifiers-first then + /// keywords, alphabetised within each group, deduplicated. pub candidates: Vec, } @@ -585,19 +585,26 @@ pub fn candidates_at_cursor_with_in_mode( // ambiguity in the live render. identifiers.retain(|name| !keywords.contains(name)); - // Keywords first (grammar parts read before content), - // then type names (closed-set grammar — coloured as - // keywords), then composite literals (`1:n`, …), then - // branching punct (`(` opening a sub-shape), then flags - // (own colour), then schema identifiers. + // Schema identifiers first: a column / table name the user + // would otherwise have to look up is the highest-value + // completion (valuable to experts, not just learners, who + // come to know the keywords over time). Keywords and the + // other closed-set grammar parts follow: keywords, then type + // names (closed-set grammar — coloured as keywords), then + // composite literals (`1:n`, …), then branching punct (`(` + // opening a sub-shape), then flags (own colour). let mut candidates: Vec = Vec::with_capacity( - keywords.len() + identifiers.len() + + keywords.len() + type_names.len() + composites.len() + punct_candidates.len() - + flags.len() - + identifiers.len(), + + flags.len(), ); + candidates.extend(identifiers.into_iter().map(|text| Candidate { + text, + kind: CandidateKind::Identifier, + })); candidates.extend(keywords.into_iter().map(|text| Candidate { text, kind: CandidateKind::Keyword, @@ -618,10 +625,6 @@ pub fn candidates_at_cursor_with_in_mode( text, kind: CandidateKind::Flag, })); - candidates.extend(identifiers.into_iter().map(|text| Candidate { - text, - kind: CandidateKind::Identifier, - })); if candidates.is_empty() { return None; @@ -1506,6 +1509,78 @@ mod tests { } } + #[test] + fn order_by_after_sort_item_offers_direction() { + use crate::dsl::types::Type; + // walk_repeated trailing-optional fix: after a complete + // sort item the direction keywords surface as + // continuations (previously discarded at the Repeated + // boundary, so completion offered neither). + let cache = schema_with_table( + "Things", + &[("Name", Type::Text), ("Qty", Type::Int)], + ); + let input = "select Name from Things order by Name "; + let cs = cands_with(input, input.len(), &cache); + assert!(cs.contains(&"asc".to_string()), "got {cs:?}"); + assert!(cs.contains(&"desc".to_string()), "got {cs:?}"); + } + + #[test] + fn projection_after_item_offers_alias_keyword() { + use crate::dsl::types::Type; + // walk_repeated trailing-optional fix: after a complete + // projection item the `as` alias keyword surfaces. + let cache = schema_with_table( + "Things", + &[("Name", Type::Text), ("Qty", Type::Int)], + ); + let input = "select Name "; + let cs = cands_with(input, input.len(), &cache); + assert!(cs.contains(&"as".to_string()), "got {cs:?}"); + } + + #[test] + fn create_table_after_column_spec_offers_constraints() { + // walk_repeated trailing-optional fix: after a complete + // column spec the optional column constraints surface as + // continuations (was a bare "Submit with Enter" prose). + let input = "create table Customers with pk Code(text) "; + let cs = cands_with(input, input.len(), &SchemaCache::default()); + for kw in ["not", "unique", "default", "check"] { + assert!( + cs.contains(&kw.to_string()), + "expected column-constraint `{kw}`; got {cs:?}", + ); + } + } + + #[test] + fn identifiers_precede_keywords_at_expression_position() { + use crate::dsl::types::Type; + // ADR-0022 Amendment 2: at an expression position offering + // both column names and keywords, every column precedes + // every keyword so the names stay visible by default. + let cache = schema_with_table( + "Things", + &[("Name", Type::Text), ("Qty", Type::Int)], + ); + let input = "select * from Things where "; + let cs = cands_with(input, input.len(), &cache); + let pos = |needle: &str| { + cs.iter().position(|c| c == needle).unwrap_or_else(|| { + panic!("{needle:?} not in candidates: {cs:?}") + }) + }; + // Both columns come before any expression-start keyword. + let last_ident = pos("Name").max(pos("Qty")); + let first_kw = pos("not").min(pos("exists")); + assert!( + last_ident < first_kw, + "identifiers must precede keywords; got {cs:?}", + ); + } + #[test] fn update_where_offers_only_current_table_columns() { use crate::dsl::types::Type; @@ -1681,15 +1756,16 @@ mod tests { } #[test] - fn keywords_come_before_identifiers_in_grammar_order() { - // "add column " has both keyword candidates and - // schema-identifier candidates. Per the user's stage-8 - // feedback round 2: keywords first in *grammar order* - // (so `to` before `table` because the canonical shape - // is `add column [to] [table] :…`), identifiers - // after, alphabetised. The grammar order falls out of - // chumsky's source-order expected-set traversal — we - // preserve that order through `describe_expected`. + fn identifiers_come_before_keywords_in_grammar_order() { + // "add column " has both schema-identifier candidates and + // keyword candidates. Per ADR-0022 Amendment 2: schema + // identifiers first (alphabetised) so the names the user + // would have to look up stay visible, then keywords in + // *grammar order* (`to` before `table` because the + // canonical shape is `add column [to] [table]
:…`). + // The grammar order falls out of the walker's source-order + // expected-set traversal — we preserve that order through + // `describe_expected`. let cache = SchemaCache { tables: vec!["Customers".to_string(), "Orders".to_string()], ..SchemaCache::default() @@ -1698,10 +1774,10 @@ mod tests { assert_eq!( kinds, vec![ - ("to".to_string(), CandidateKind::Keyword), - ("table".to_string(), CandidateKind::Keyword), ("Customers".to_string(), CandidateKind::Identifier), ("Orders".to_string(), CandidateKind::Identifier), + ("to".to_string(), CandidateKind::Keyword), + ("table".to_string(), CandidateKind::Keyword), ], ); } diff --git a/src/dsl/walker/driver.rs b/src/dsl/walker/driver.rs index b4d5119..a5e730c 100644 --- a/src/dsl/walker/driver.rs +++ b/src/dsl/walker/driver.rs @@ -698,6 +698,20 @@ fn walk_repeated( let mut cur = position; let mut count = 0_usize; let mut last_expected: Option> = None; + // Trailing-optional expectations carried by the most recently + // matched item — e.g. `asc`/`desc` after an ORDER BY sort + // item, or a projection's `as` alias. Surfaced when the list + // ends cleanly at an item boundary so completion still offers + // the optional suffix the user could type next (handoff 31 — + // the `desc` follow-up to F5). The separator itself is + // deliberately NOT surfaced. + let mut last_item_skipped: Vec = Vec::new(); + // Set when the loop stops because the separator did not match + // at an item boundary (a clean end of list), as opposed to an + // inner mismatch past an already-consumed separator. Only at a + // clean boundary are the last item's trailing optionals valid + // continuations at the cursor. + let mut ended_at_item_boundary = false; loop { let saved_path_len = path.items.len(); let saved_byte_len = per_byte.len(); @@ -720,6 +734,7 @@ fn walk_repeated( NodeWalkResult::NoMatch { .. } => { path.items.truncate(sep_saved_path); per_byte.truncate(sep_saved_byte); + ended_at_item_boundary = true; break; } other => return other, @@ -728,9 +743,10 @@ fn walk_repeated( walk_node(source, cur, inner, ctx, path, per_byte) }; match result { - NodeWalkResult::Matched { end, .. } => { + NodeWalkResult::Matched { end, skipped } => { cur = end; count += 1; + last_item_skipped = skipped; } NodeWalkResult::NoMatch { expected, position: inner_pos } => { // Mid-typing-the-next-item recovery: if the @@ -771,13 +787,18 @@ fn walk_repeated( expected: last_expected.unwrap_or_default(), }; } - // The "could continue with another inner" expectations - // become this Repeated's `skipped` set so the caller's - // expected-set surfaces them at completion time. - NodeWalkResult::Matched { - end: cur, - skipped: last_expected.unwrap_or_default(), - } + // The "could continue" expectations become this Repeated's + // `skipped` set so the caller's expected-set surfaces them at + // completion time. When the list ended cleanly at an item + // boundary, that is the last item's trailing optionals (e.g. + // `asc`/`desc`); otherwise it is whatever the final inner + // attempt expected. + let skipped = if ended_at_item_boundary { + last_item_skipped + } else { + last_expected.unwrap_or_default() + }; + NodeWalkResult::Matched { end: cur, skipped } } fn walk_bare_path( diff --git a/src/dsl/walker/mod.rs b/src/dsl/walker/mod.rs index 71833ea..ae0ec65 100644 --- a/src/dsl/walker/mod.rs +++ b/src/dsl/walker/mod.rs @@ -4844,6 +4844,26 @@ mod order_by_expected_set_tests { ); } + #[test] + fn order_by_after_sort_item_offers_direction() { + // After a complete sort item (`order by Name`) the + // sort-direction keywords are valid continuations. + // walk_repeated used to discard the item's trailing + // optionals, so completion offered neither. + let words = expected_words("select Name from T order by Name "); + assert!(words.contains(&"asc"), "expected `asc`; got {words:?}"); + assert!(words.contains(&"desc"), "expected `desc`; got {words:?}"); + // The separator is deliberately not surfaced (user choice). + let full = expected_at_input_in_mode( + "select Name from T order by Name ", + Mode::Advanced, + ); + assert!( + !full.iter().any(|e| matches!(e, Expectation::Punct(','))), + "`,` separator should not be surfaced; got {full:?}", + ); + } + #[test] fn order_by_still_offers_a_sort_item() { // Guard against over-correction: the legitimate sort-item diff --git a/tests/typing_surface/candidate_ordering.rs b/tests/typing_surface/candidate_ordering.rs index 468ee44..f3af302 100644 --- a/tests/typing_surface/candidate_ordering.rs +++ b/tests/typing_surface/candidate_ordering.rs @@ -1,21 +1,24 @@ //! Matrix coverage for completion-candidate *ordering*. //! //! The order candidates appear in is load-bearing for the hint -//! panel: it reads left-to-right, so the sequence must match -//! how the command is spoken. Two invariants the user called -//! out (handoff-14 ranker discussion): +//! panel: the candidate line is single-row and window-scrolls +//! when it overflows, so whatever sits first is what stays +//! visible by default. Two invariants: //! //! 1. Connective keywords appear in grammar-declaration / reading //! order — `to` before `table` so `add column to table T` //! reads correctly, never the jarring `table` / `to`. -//! 2. Command-part keywords appear before schema identifiers -//! (table / column names) — grammar parts are read before -//! the content that fills them. +//! 2. Schema identifiers (table / column names) appear *before* +//! command-part keywords. A name the user would otherwise +//! have to look up is the highest-value completion — valuable +//! even to experts, who come to know the keywords over time — +//! so it must stay visible by default rather than scroll off +//! behind the keyword run. (ADR-0022 Amendment 2; reverses the +//! earlier handoff-14 keywords-first call, which held only +//! while candidate lists were short.) //! -//! These hold today via declaration-order preservation + -//! keywords-first sectioning in `candidates_at_cursor`. Nothing -//! pinned them until now, so a future grammar/sort change could -//! silently break the reading order. +//! These hold via declaration-order preservation + +//! identifiers-first sectioning in `candidates_at_cursor`. use crate::typing_surface::*; @@ -78,30 +81,30 @@ fn change_column_lists_in_before_table() { } // ========================================================= -// Keywords-before-identifiers: at a position where both a +// Identifiers-before-keywords: at a position where both a // connective keyword and schema table names are valid, the -// keyword comes first. +// schema identifiers come first (ADR-0022 Amendment 2). // ========================================================= #[test] -fn add_column_keyword_precedes_table_identifiers() { +fn add_column_identifiers_precede_table_keywords() { let schema = schema_multi_table(); let a = assess_at_end("add column ", &schema); - // `to` / `table` are command parts; Customers / Orders are - // schema identifiers — every keyword precedes every ident. - assert_before(&a, "table", "Customers"); - assert_before(&a, "to", "Customers"); - assert_before(&a, "to", "Orders"); - crate::snap!("add_column_keyword_then_idents", a); + // Customers / Orders are schema identifiers; `to` / `table` + // are command parts — every ident precedes every keyword. + assert_before(&a, "Customers", "table"); + assert_before(&a, "Customers", "to"); + assert_before(&a, "Orders", "to"); + crate::snap!("add_column_idents_then_keyword", a); } #[test] -fn drop_column_keyword_precedes_table_identifiers() { +fn drop_column_identifiers_precede_table_keywords() { let schema = schema_multi_table(); let a = assess_at_end("drop column ", &schema); - assert_before(&a, "table", "Customers"); - assert_before(&a, "from", "Orders"); - crate::snap!("drop_column_keyword_then_idents", a); + assert_before(&a, "Customers", "table"); + assert_before(&a, "Orders", "from"); + crate::snap!("drop_column_idents_then_keyword", a); } #[test] @@ -116,14 +119,14 @@ fn insert_into_table_keyword_precedes_nothing_when_only_idents() { } // ========================================================= -// After consuming the first connective, the second still -// surfaces ahead of identifiers. +// After consuming the first connective, identifiers still +// surface ahead of the remaining keyword. // ========================================================= #[test] -fn add_column_after_to_lists_table_before_identifiers() { +fn add_column_after_to_lists_identifiers_before_table() { let schema = schema_multi_table(); let a = assess_at_end("add column to ", &schema); - assert_before(&a, "table", "Customers"); + assert_before(&a, "Customers", "table"); crate::snap!("add_column_after_to", a); } diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_after_to_lists_table_before_identifiers@add_column_after_to.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_after_to_lists_identifiers_before_table@add_column_after_to.snap similarity index 98% rename from tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_after_to_lists_table_before_identifiers@add_column_after_to.snap rename to tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_after_to_lists_identifiers_before_table@add_column_after_to.snap index cc84197..18cf376 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_after_to_lists_table_before_identifiers@add_column_after_to.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_after_to_lists_identifiers_before_table@add_column_after_to.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/candidate_ordering.rs +assertion_line: 131 description: "input=\"add column to \" cursor=14" expression: "& a" --- @@ -10,10 +11,6 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -22,6 +19,10 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "table", + kind: Keyword, + }, ], selected: None, }, @@ -34,10 +35,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -46,6 +43,10 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "table", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_keyword_precedes_table_identifiers@add_column_keyword_then_idents.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_identifiers_precede_table_keywords@add_column_idents_then_keyword.snap similarity index 98% rename from tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_keyword_precedes_table_identifiers@add_column_keyword_then_idents.snap rename to tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_identifiers_precede_table_keywords@add_column_idents_then_keyword.snap index 1be0c7a..6e0f211 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_keyword_precedes_table_identifiers@add_column_keyword_then_idents.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_identifiers_precede_table_keywords@add_column_idents_then_keyword.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/candidate_ordering.rs +assertion_line: 98 description: "input=\"add column \" cursor=11" expression: "& a" --- @@ -10,14 +11,6 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "to", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -26,6 +19,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "to", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], selected: None, }, @@ -38,14 +39,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "to", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -54,6 +47,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "to", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_lists_to_before_table@add_column_connectives.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_lists_to_before_table@add_column_connectives.snap index 1be0c7a..cb09fae 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_lists_to_before_table@add_column_connectives.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__add_column_lists_to_before_table@add_column_connectives.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/candidate_ordering.rs +assertion_line: 56 description: "input=\"add column \" cursor=11" expression: "& a" --- @@ -10,14 +11,6 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "to", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -26,6 +19,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "to", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], selected: None, }, @@ -38,14 +39,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "to", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -54,6 +47,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "to", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__change_column_lists_in_before_table@change_column_connectives.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__change_column_lists_in_before_table@change_column_connectives.snap index 58d4f6c..794b5ee 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__change_column_lists_in_before_table@change_column_connectives.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__change_column_lists_in_before_table@change_column_connectives.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/candidate_ordering.rs +assertion_line: 80 description: "input=\"change column \" cursor=14" expression: "& a" --- @@ -10,14 +11,6 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "in", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -26,6 +19,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "in", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], selected: None, }, @@ -38,14 +39,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "in", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -54,6 +47,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "in", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_keyword_precedes_table_identifiers@drop_column_keyword_then_idents.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_identifiers_precede_table_keywords@drop_column_idents_then_keyword.snap similarity index 98% rename from tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_keyword_precedes_table_identifiers@drop_column_keyword_then_idents.snap rename to tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_identifiers_precede_table_keywords@drop_column_idents_then_keyword.snap index f2fdeca..9a9afd1 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_keyword_precedes_table_identifiers@drop_column_keyword_then_idents.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_identifiers_precede_table_keywords@drop_column_idents_then_keyword.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/candidate_ordering.rs +assertion_line: 107 description: "input=\"drop column \" cursor=12" expression: "& a" --- @@ -10,14 +11,6 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "from", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -26,6 +19,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "from", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], selected: None, }, @@ -38,14 +39,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "from", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -54,6 +47,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "from", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_lists_from_before_table@drop_column_connectives.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_lists_from_before_table@drop_column_connectives.snap index f2fdeca..a3de0c1 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_lists_from_before_table@drop_column_connectives.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__drop_column_lists_from_before_table@drop_column_connectives.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/candidate_ordering.rs +assertion_line: 64 description: "input=\"drop column \" cursor=12" expression: "& a" --- @@ -10,14 +11,6 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "from", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -26,6 +19,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "from", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], selected: None, }, @@ -38,14 +39,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "from", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -54,6 +47,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "from", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__rename_column_lists_in_before_table@rename_column_connectives.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__rename_column_lists_in_before_table@rename_column_connectives.snap index 5889200..e069640 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__rename_column_lists_in_before_table@rename_column_connectives.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__candidate_ordering__rename_column_lists_in_before_table@rename_column_connectives.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/candidate_ordering.rs +assertion_line: 72 description: "input=\"rename column \" cursor=14" expression: "& a" --- @@ -10,14 +11,6 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "in", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -26,6 +19,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "in", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], selected: None, }, @@ -38,14 +39,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "in", - kind: Keyword, - }, - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -54,6 +47,14 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "in", + kind: Keyword, + }, + Candidate { + text: "table", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__constraints__create_table_check_suffix_parses@create_table_check_suffix.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__constraints__create_table_check_suffix_parses@create_table_check_suffix.snap index fab04e4..777d4b7 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__constraints__create_table_check_suffix_parses@create_table_check_suffix.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__constraints__create_table_check_suffix_parses@create_table_check_suffix.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/constraints.rs +assertion_line: 30 description: "input=\"create table Ages with pk age(int) check (age >= 0)\" cursor=51" expression: "& a" --- @@ -8,11 +9,55 @@ Assessment { cursor: 51, state: Valid, hint: Some( - Prose( - "Submit with Enter", - ), + Candidates { + items: [ + Candidate { + text: "not", + kind: Keyword, + }, + Candidate { + text: "unique", + kind: Keyword, + }, + Candidate { + text: "default", + kind: Keyword, + }, + Candidate { + text: "check", + kind: Keyword, + }, + ], + selected: None, + }, + ), + completion: Some( + Completion { + replaced_range: ( + 51, + 51, + ), + partial_prefix: "", + candidates: [ + Candidate { + text: "not", + kind: Keyword, + }, + Candidate { + text: "unique", + kind: Keyword, + }, + Candidate { + text: "default", + kind: Keyword, + }, + Candidate { + text: "check", + kind: Keyword, + }, + ], + }, ), - completion: None, parse_result: Ok( "CreateTable", ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__constraints__create_table_default_suffix_parses@create_table_default_suffix.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__constraints__create_table_default_suffix_parses@create_table_default_suffix.snap index 589f459..21094e0 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__constraints__create_table_default_suffix_parses@create_table_default_suffix.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__constraints__create_table_default_suffix_parses@create_table_default_suffix.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/constraints.rs +assertion_line: 19 description: "input=\"create table Books with pk isbn(text) default '000'\" cursor=51" expression: "& a" --- @@ -8,11 +9,55 @@ Assessment { cursor: 51, state: Valid, hint: Some( - Prose( - "Submit with Enter", - ), + Candidates { + items: [ + Candidate { + text: "not", + kind: Keyword, + }, + Candidate { + text: "unique", + kind: Keyword, + }, + Candidate { + text: "default", + kind: Keyword, + }, + Candidate { + text: "check", + kind: Keyword, + }, + ], + selected: None, + }, + ), + completion: Some( + Completion { + replaced_range: ( + 51, + 51, + ), + partial_prefix: "", + candidates: [ + Candidate { + text: "not", + kind: Keyword, + }, + Candidate { + text: "unique", + kind: Keyword, + }, + Candidate { + text: "default", + kind: Keyword, + }, + Candidate { + text: "check", + kind: Keyword, + }, + ], + }, ), - completion: None, parse_result: Ok( "CreateTable", ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_compound_pk_parses@with_compound_pk.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_compound_pk_parses@with_compound_pk.snap index 5ab731a..0470fa2 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_compound_pk_parses@with_compound_pk.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_compound_pk_parses@with_compound_pk.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/create_table.rs +assertion_line: 117 description: "input=\"create table Memberships with pk UserId(int), GroupId(int)\" cursor=58" expression: "& a" --- @@ -8,11 +9,55 @@ Assessment { cursor: 58, state: Valid, hint: Some( - Prose( - "Submit with Enter", - ), + Candidates { + items: [ + Candidate { + text: "not", + kind: Keyword, + }, + Candidate { + text: "unique", + kind: Keyword, + }, + Candidate { + text: "default", + kind: Keyword, + }, + Candidate { + text: "check", + kind: Keyword, + }, + ], + selected: None, + }, + ), + completion: Some( + Completion { + replaced_range: ( + 58, + 58, + ), + partial_prefix: "", + candidates: [ + Candidate { + text: "not", + kind: Keyword, + }, + Candidate { + text: "unique", + kind: Keyword, + }, + Candidate { + text: "default", + kind: Keyword, + }, + Candidate { + text: "check", + kind: Keyword, + }, + ], + }, ), - completion: None, parse_result: Ok( "CreateTable", ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_explicit_pk_parses@with_explicit_pk.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_explicit_pk_parses@with_explicit_pk.snap index 4113d1e..c57703e 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_explicit_pk_parses@with_explicit_pk.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__create_table__create_table_with_explicit_pk_parses@with_explicit_pk.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/create_table.rs +assertion_line: 106 description: "input=\"create table Customers with pk Code(text)\" cursor=41" expression: "& a" --- @@ -8,11 +9,55 @@ Assessment { cursor: 41, state: Valid, hint: Some( - Prose( - "Submit with Enter", - ), + Candidates { + items: [ + Candidate { + text: "not", + kind: Keyword, + }, + Candidate { + text: "unique", + kind: Keyword, + }, + Candidate { + text: "default", + kind: Keyword, + }, + Candidate { + text: "check", + kind: Keyword, + }, + ], + selected: None, + }, + ), + completion: Some( + Completion { + replaced_range: ( + 41, + 41, + ), + partial_prefix: "", + candidates: [ + Candidate { + text: "not", + kind: Keyword, + }, + Candidate { + text: "unique", + kind: Keyword, + }, + Candidate { + text: "default", + kind: Keyword, + }, + Candidate { + text: "check", + kind: Keyword, + }, + ], + }, ), - completion: None, parse_result: Ok( "CreateTable", ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__after_where_column_equals_offers_typed_prose@after_where_equals.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__after_where_column_equals_offers_typed_prose@after_where_equals.snap index 8544c85..9e2ba8f 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__after_where_column_equals_offers_typed_prose@after_where_equals.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__after_where_column_equals_offers_typed_prose@after_where_equals.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/delete_with_where.rs +assertion_line: 60 description: "input=\"delete from Customers where Email=\" cursor=34" expression: "& a" --- @@ -20,18 +21,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "null", - kind: Keyword, - }, - Candidate { - text: "true", - kind: Keyword, - }, - Candidate { - text: "false", - kind: Keyword, - }, Candidate { text: "Email", kind: Identifier, @@ -44,6 +33,18 @@ Assessment { text: "id", kind: Identifier, }, + Candidate { + text: "null", + kind: Keyword, + }, + Candidate { + text: "true", + kind: Keyword, + }, + Candidate { + text: "false", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__after_where_offers_active_table_columns_no_leakage@after_where.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__after_where_offers_active_table_columns_no_leakage@after_where.snap index 0393f41..14d2ed3 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__after_where_offers_active_table_columns_no_leakage@after_where.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__after_where_offers_active_table_columns_no_leakage@after_where.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/delete_with_where.rs +assertion_line: 39 description: "input=\"delete from Customers where \" cursor=28" expression: "& a" --- @@ -10,6 +11,14 @@ Assessment { hint: Some( Candidates { items: [ + Candidate { + text: "Name", + kind: Identifier, + }, + Candidate { + text: "id", + kind: Identifier, + }, Candidate { text: "not", kind: Keyword, @@ -30,14 +39,6 @@ Assessment { text: "(", kind: Punct, }, - Candidate { - text: "Name", - kind: Identifier, - }, - Candidate { - text: "id", - kind: Identifier, - }, ], selected: None, }, @@ -50,6 +51,14 @@ Assessment { ), partial_prefix: "", candidates: [ + Candidate { + text: "Name", + kind: Identifier, + }, + Candidate { + text: "id", + kind: Identifier, + }, Candidate { text: "not", kind: Keyword, @@ -70,14 +79,6 @@ Assessment { text: "(", kind: Punct, }, - Candidate { - text: "Name", - kind: Identifier, - }, - Candidate { - text: "id", - kind: Identifier, - }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__delete_with_datetime_column_says_yyyy_mm_dd_t@datetime_column.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__delete_with_datetime_column_says_yyyy_mm_dd_t@datetime_column.snap index 3ec3f98..0b2072b 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__delete_with_datetime_column_says_yyyy_mm_dd_t@datetime_column.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__delete_with_where__delete_with_datetime_column_says_yyyy_mm_dd_t@datetime_column.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/delete_with_where.rs +assertion_line: 86 description: "input=\"delete from Things where ts=\" cursor=28" expression: "& a" --- @@ -20,18 +21,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "null", - kind: Keyword, - }, - Candidate { - text: "true", - kind: Keyword, - }, - Candidate { - text: "false", - kind: Keyword, - }, Candidate { text: "auto", kind: Identifier, @@ -72,6 +61,18 @@ Assessment { text: "ts", kind: Identifier, }, + Candidate { + text: "null", + kind: Keyword, + }, + Candidate { + text: "true", + kind: Keyword, + }, + Candidate { + text: "false", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__drop_column__after_drop_column_offers_table_names@after_from.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__drop_column__after_drop_column_offers_table_names@after_from.snap index be5e3f1..5fe61c8 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__drop_column__after_drop_column_offers_table_names@after_from.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__drop_column__after_drop_column_offers_table_names@after_from.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/drop_column.rs +assertion_line: 19 description: "input=\"drop column from \" cursor=17" expression: "& a" --- @@ -10,10 +11,6 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -22,6 +19,10 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "table", + kind: Keyword, + }, ], selected: None, }, @@ -34,10 +35,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "table", - kind: Keyword, - }, Candidate { text: "Customers", kind: Identifier, @@ -46,6 +43,10 @@ Assessment { text: "Orders", kind: Identifier, }, + Candidate { + text: "table", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__drop_relationship__after_relationship_keyword_offers_from_and_names@after_relationship_keyword.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__drop_relationship__after_relationship_keyword_offers_from_and_names@after_relationship_keyword.snap index 18fccf2..25a631a 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__drop_relationship__after_relationship_keyword_offers_from_and_names@after_relationship_keyword.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__drop_relationship__after_relationship_keyword_offers_from_and_names@after_relationship_keyword.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/drop_relationship.rs +assertion_line: 37 description: "input=\"drop relationship \" cursor=18" expression: "& a" --- @@ -10,14 +11,14 @@ Assessment { hint: Some( Candidates { items: [ - Candidate { - text: "from", - kind: Keyword, - }, Candidate { text: "Orders_CustId_to_Customers", kind: Identifier, }, + Candidate { + text: "from", + kind: Keyword, + }, ], selected: None, }, @@ -30,14 +31,14 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "from", - kind: Keyword, - }, Candidate { text: "Orders_CustId_to_Customers", kind: Identifier, }, + Candidate { + text: "from", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__explain__explain_show_data_where_offers_active_table_columns_no_leakage@explain_show_data_where.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__explain__explain_show_data_where_offers_active_table_columns_no_leakage@explain_show_data_where.snap index 124e748..2b69756 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__explain__explain_show_data_where_offers_active_table_columns_no_leakage@explain_show_data_where.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__explain__explain_show_data_where_offers_active_table_columns_no_leakage@explain_show_data_where.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/explain.rs +assertion_line: 54 description: "input=\"explain show data Customers where \" cursor=34" expression: "& a" --- @@ -10,6 +11,14 @@ Assessment { hint: Some( Candidates { items: [ + Candidate { + text: "Name", + kind: Identifier, + }, + Candidate { + text: "id", + kind: Identifier, + }, Candidate { text: "not", kind: Keyword, @@ -30,14 +39,6 @@ Assessment { text: "(", kind: Punct, }, - Candidate { - text: "Name", - kind: Identifier, - }, - Candidate { - text: "id", - kind: Identifier, - }, ], selected: None, }, @@ -50,6 +51,14 @@ Assessment { ), partial_prefix: "", candidates: [ + Candidate { + text: "Name", + kind: Identifier, + }, + Candidate { + text: "id", + kind: Identifier, + }, Candidate { text: "not", kind: Keyword, @@ -70,14 +79,6 @@ Assessment { text: "(", kind: Punct, }, - Candidate { - text: "Name", - kind: Identifier, - }, - Candidate { - text: "id", - kind: Identifier, - }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__update_with_where__after_where_column_equals_offers_typed_prose@after_where_equals.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__update_with_where__after_where_column_equals_offers_typed_prose@after_where_equals.snap index 7291101..8f1f4bd 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__update_with_where__after_where_column_equals_offers_typed_prose@after_where_equals.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__update_with_where__after_where_column_equals_offers_typed_prose@after_where_equals.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/update_with_where.rs +assertion_line: 152 description: "input=\"update Customers set Email='x' where id=\" cursor=40" expression: "& a" --- @@ -20,18 +21,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "null", - kind: Keyword, - }, - Candidate { - text: "true", - kind: Keyword, - }, - Candidate { - text: "false", - kind: Keyword, - }, Candidate { text: "Email", kind: Identifier, @@ -44,6 +33,18 @@ Assessment { text: "id", kind: Identifier, }, + Candidate { + text: "null", + kind: Keyword, + }, + Candidate { + text: "true", + kind: Keyword, + }, + Candidate { + text: "false", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__update_with_where__after_where_keyword_offers_active_table_columns@after_where.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__update_with_where__after_where_keyword_offers_active_table_columns@after_where.snap index 51fdc81..dc15282 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__update_with_where__after_where_keyword_offers_active_table_columns@after_where.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__update_with_where__after_where_keyword_offers_active_table_columns@after_where.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/update_with_where.rs +assertion_line: 135 description: "input=\"update Customers set Name='x' where \" cursor=36" expression: "& a" --- @@ -10,6 +11,14 @@ Assessment { hint: Some( Candidates { items: [ + Candidate { + text: "Name", + kind: Identifier, + }, + Candidate { + text: "id", + kind: Identifier, + }, Candidate { text: "not", kind: Keyword, @@ -30,14 +39,6 @@ Assessment { text: "(", kind: Punct, }, - Candidate { - text: "Name", - kind: Identifier, - }, - Candidate { - text: "id", - kind: Identifier, - }, ], selected: None, }, @@ -50,6 +51,14 @@ Assessment { ), partial_prefix: "", candidates: [ + Candidate { + text: "Name", + kind: Identifier, + }, + Candidate { + text: "id", + kind: Identifier, + }, Candidate { text: "not", kind: Keyword, @@ -70,14 +79,6 @@ Assessment { text: "(", kind: Punct, }, - Candidate { - text: "Name", - kind: Identifier, - }, - Candidate { - text: "id", - kind: Identifier, - }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__after_not_keyword_expects_a_predicate@after_not.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__after_not_keyword_expects_a_predicate@after_not.snap index c3c6747..301b0c0 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__after_not_keyword_expects_a_predicate@after_not.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__after_not_keyword_expects_a_predicate@after_not.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/where_expression.rs +assertion_line: 42 description: "input=\"delete from Customers where not \" cursor=32" expression: "& a" --- @@ -10,6 +11,18 @@ Assessment { hint: Some( Candidates { items: [ + Candidate { + text: "Email", + kind: Identifier, + }, + Candidate { + text: "Name", + kind: Identifier, + }, + Candidate { + text: "id", + kind: Identifier, + }, Candidate { text: "not", kind: Keyword, @@ -30,18 +43,6 @@ Assessment { text: "(", kind: Punct, }, - Candidate { - text: "Email", - kind: Identifier, - }, - Candidate { - text: "Name", - kind: Identifier, - }, - Candidate { - text: "id", - kind: Identifier, - }, ], selected: None, }, @@ -54,6 +55,18 @@ Assessment { ), partial_prefix: "", candidates: [ + Candidate { + text: "Email", + kind: Identifier, + }, + Candidate { + text: "Name", + kind: Identifier, + }, + Candidate { + text: "id", + kind: Identifier, + }, Candidate { text: "not", kind: Keyword, @@ -74,18 +87,6 @@ Assessment { text: "(", kind: Punct, }, - Candidate { - text: "Email", - kind: Identifier, - }, - Candidate { - text: "Name", - kind: Identifier, - }, - Candidate { - text: "id", - kind: Identifier, - }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__between_expects_a_low_bound@between_low.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__between_expects_a_low_bound@between_low.snap index 189cb4f..6f0d1dd 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__between_expects_a_low_bound@between_low.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__between_expects_a_low_bound@between_low.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/where_expression.rs +assertion_line: 50 description: "input=\"delete from Things where k between \" cursor=35" expression: "& a" --- @@ -20,18 +21,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "null", - kind: Keyword, - }, - Candidate { - text: "true", - kind: Keyword, - }, - Candidate { - text: "false", - kind: Keyword, - }, Candidate { text: "auto", kind: Identifier, @@ -72,6 +61,18 @@ Assessment { text: "ts", kind: Identifier, }, + Candidate { + text: "null", + kind: Keyword, + }, + Candidate { + text: "true", + kind: Keyword, + }, + Candidate { + text: "false", + kind: Keyword, + }, ], }, ), diff --git a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__in_list_open_paren_expects_an_item@in_open_paren.snap b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__in_list_open_paren_expects_an_item@in_open_paren.snap index 9801954..d573788 100644 --- a/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__in_list_open_paren_expects_an_item@in_open_paren.snap +++ b/tests/typing_surface/snapshots/typing_surface_matrix__typing_surface__where_expression__in_list_open_paren_expects_an_item@in_open_paren.snap @@ -1,5 +1,6 @@ --- source: tests/typing_surface/where_expression.rs +assertion_line: 58 description: "input=\"delete from Things where k in (\" cursor=31" expression: "& a" --- @@ -20,18 +21,6 @@ Assessment { ), partial_prefix: "", candidates: [ - Candidate { - text: "null", - kind: Keyword, - }, - Candidate { - text: "true", - kind: Keyword, - }, - Candidate { - text: "false", - kind: Keyword, - }, Candidate { text: "auto", kind: Identifier, @@ -72,6 +61,18 @@ Assessment { text: "ts", kind: Identifier, }, + Candidate { + text: "null", + kind: Keyword, + }, + Candidate { + text: "true", + kind: Keyword, + }, + Candidate { + text: "false", + kind: Keyword, + }, ], }, ),