Files
2026-04-24 05:01:44 +08:00

4.9 KiB

ADDED Requirements

Requirement: Folding range responses honor client capabilities

The server SHALL render folding ranges according to the client's declared folding capabilities instead of always returning the richest possible payload.

Scenario: Line-only folding is respected

  • WHEN the client declares textDocument.foldingRange.lineFoldingOnly = true
  • THEN the server MUST return folding ranges that remain valid when interpreted as whole-line folds, including adjusting end boundaries for bracketed or comment ranges whose closing delimiter is on the last line

Scenario: Client line-only support is propagated through folding options

  • WHEN the client declares textDocument.foldingRange.lineFoldingOnly = true
  • THEN the server MUST invoke folding rendering with options equivalent to line_folding_only = true
  • AND collectors MUST NOT need to inspect client capability state to produce different raw ranges

Scenario: Collapsed text is gated by client support

  • WHEN the client does not declare support for textDocument.foldingRange.foldingRange.collapsedText
  • THEN the server MUST omit collapsedText from the folding range response

Scenario: Preferred range limits are applied deterministically

  • WHEN the client declares textDocument.foldingRange.rangeLimit = N and the server can produce more than N folding ranges for a document
  • THEN the server MUST return no more than N ranges and MUST choose them using a deterministic ordering rule

Scenario: Standard kinds are emitted compatibly

  • WHEN a folding range represents a comment block, an include/import block, or any other foldable region
  • THEN the server MUST emit kind = comment, kind = imports, or kind = region respectively, and MUST NOT require clients to understand clice-specific kind strings in order to fold correctly

Requirement: Structural and comment folding baseline

The server SHALL provide folding ranges for multi-line C/C++ structural regions and multi-line comments in the main file.

Scenario: Multi-line comment blocks can be folded

  • WHEN a document contains a multi-line /* ... */ comment or a contiguous block of // comments spanning more than one line
  • THEN the server MUST return a folding range for that comment block with kind = comment

Scenario: Single-line comments are not folded

  • WHEN a document contains a single-line comment that does not extend across multiple lines and is not part of a larger contiguous comment block
  • THEN the server MUST NOT return a folding range for that comment

Scenario: Existing structural regions remain foldable

  • WHEN a document contains a multi-line namespace, record, function body, parameter list, lambda body, initializer list, or other supported structural region already collected by clice
  • THEN the server MUST continue to return a folding range for that region if its boundaries can be mapped back to the main file

Requirement: Preprocessor regions fold as complete branch blocks

The server SHALL provide complete and nested folding ranges for preprocessor branch structures instead of leaving the final branch in a conditional block unclosed.

Scenario: Final conditional branch closes at endif

  • WHEN a document contains a #if/#elif/#else/#endif chain
  • THEN the server MUST generate a folding range for each multi-line branch body, including the last branch body that ends at #endif

Scenario: Inactive conditional branches can be folded

  • WHEN a conditional branch is known to be inactive or skipped in the current preprocessing configuration
  • THEN the server MUST be able to return a folding range covering that inactive branch region using kind = region

Scenario: Nested pragma regions are folded

  • WHEN a document contains nested #pragma region / #pragma endregion pairs in the main file
  • THEN the server MUST return properly nested folding ranges for each matched region pair

Requirement: C/C++ directive groups and multiline macros are foldable

The server SHALL use clice's preprocessor metadata to expose foldable ranges that clangd does not currently provide.

Scenario: Multi-line macro definitions can be folded

  • WHEN a document contains a multi-line macro definition whose body spans more than one physical line
  • THEN the server MUST return a folding range for that macro definition using kind = region

Scenario: Consecutive include directives are grouped

  • WHEN a document contains a contiguous block of #include directives with no intervening non-trivia code lines
  • THEN the server MUST return a folding range covering that include block using kind = imports

Scenario: Consecutive module imports are grouped

  • WHEN a document contains a contiguous block of C++ module import declarations with no intervening non-trivia code lines
  • THEN the server MUST return a folding range covering that import block using kind = imports