···177177 /// we do for pipelines.
178178 RecordUpdate {
179179 location: SrcSpan,
180180+ /// This is where the `..` starts:
181181+ /// ```gleam
182182+ /// Wibble( ..wobble, a: 1)
183183+ /// // ^ Here!
184184+ /// ```
185185+ spread_start: u32,
180186 type_: Arc<Type>,
181187 /// This is the record being updated as written in the code:
182188 /// ```gleam
···438444 constructor,
439445 arguments,
440446 updated_record,
447447+ spread_start,
441448 ..
442449 } => arguments
443450 .iter()
···466473 } else {
467474 found
468475 }
476476+ })
477477+ })
478478+ .or_else(|| {
479479+ // If we're hovering over the two `..` then we also want to
480480+ // count that as hovering the entire expression and show the
481481+ // fields that are not being updated.
482482+ if !SrcSpan::new(*spread_start, updated_record.location().start)
483483+ .contains(byte_index)
484484+ {
485485+ return None;
486486+ }
487487+488488+ Some(Located::Expression {
489489+ expression: self,
490490+ position: ExpressionPosition::UpdatedRecord {
491491+ unchanged_record_fields: self
492492+ .unchanged_record_fields()
493493+ .unwrap_or_default(),
494494+ },
469495 })
470496 })
471497 .or_else(|| self.self_if_contains_location(byte_index)),