Files
carbon-lang/toolchain/lex/testdata/dump_sem_ir_range.carbon
T
Jon Ross-Perkins 1f268b5d8b Consolidate token-related range handling to one struct (#5399)
This consolidates Lex::TokenizedBuffer::DumpSemIRRange and
Parse::TreeAndSubtrees::TokenRange into a single InclusiveTokenRange,
also making the OverlapsWithDumpSemIRRange function take the new struct.

I considered switching to `llvm::iterator_range<Lex::TokenIterator>`,
but we often want to see if the range is size one. Using `TokenIterator`
just looked like it'd add a bunch of offsetting to make it work; I view
that as low-value overhead.

For example:

```
  Lex::InclusiveTokenRange token_range = GetSubtreeTokenRange(node_id);
  auto begin_loc = tree_->tokens().TokenToDiagnosticLoc(token_range.begin);
  if (token_range.begin == token_range.end) {
    return begin_loc;
  }
  auto end_loc = tree_->tokens().TokenToDiagnosticLoc(token_range.end);
```

would become:

```
  llvm::iterator_range<Lex::TokenIterator> token_range = GetSubtreeTokenRange(node_id);
  auto begin_loc = tree_->tokens().TokenToDiagnosticLoc(*token_range.begin());
  if (token_range.begin() + 1 == token_range.end()) {
    return begin_loc;
  }
  auto end_loc = tree_->tokens().TokenToDiagnosticLoc(*(token_range.end() - 1));
```

So I'm keeping the bespoke struct.
2025-05-02 18:47:02 +00:00

147 lines
6.4 KiB
Plaintext

// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// AUTOUPDATE
// TIP: To test this file alone, run:
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/lex/testdata/dump_sem_ir_range.carbon
// TIP: To dump output, run:
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lex/testdata/dump_sem_ir_range.carbon
// --- full_file.carbon
// CHECK:STDOUT: - filename: full_file.carbon
// CHECK:STDOUT: tokens:
//@dump-sem-ir-begin
a
// CHECK:STDOUT: - { index: 1, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "a", identifier: 0, has_leading_space: true }
b
// CHECK:STDOUT: - { index: 2, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "b", identifier: 1, has_leading_space: true }
c
// CHECK:STDOUT: - { index: 3, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "c", identifier: 2, has_leading_space: true }
// CHECK:STDOUT: dump_sem_ir_ranges:
// CHECK:STDOUT: - {begin: 1, end: 3}
//@dump-sem-ir-end
// --- multi_section.carbon
// CHECK:STDOUT: - filename: multi_section.carbon
// CHECK:STDOUT: tokens:
a
// CHECK:STDOUT: - { index: 1, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "a", identifier: 0, has_leading_space: true }
//@dump-sem-ir-begin
b
// CHECK:STDOUT: - { index: 2, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "b", identifier: 1, has_leading_space: true }
//@dump-sem-ir-end
c
// CHECK:STDOUT: - { index: 3, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "c", identifier: 2, has_leading_space: true }
//@dump-sem-ir-begin
d
// CHECK:STDOUT: - { index: 4, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "d", identifier: 3, has_leading_space: true }
//@dump-sem-ir-end
e
// CHECK:STDOUT: - { index: 5, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "e", identifier: 4, has_leading_space: true }
// CHECK:STDOUT: dump_sem_ir_ranges:
// CHECK:STDOUT: - {begin: 2, end: 2}
// CHECK:STDOUT: - {begin: 4, end: 4}
// --- compact.carbon
// CHECK:STDOUT: - filename: compact.carbon
// CHECK:STDOUT: tokens:
// CHECK:STDOUT: dump_sem_ir_ranges:
// CHECK:STDOUT: - {begin: 1, end: 0}
// CHECK:STDOUT: - {begin: 1, end: 0}
// CHECK:STDOUT: - {begin: 1, end: 0}
//@dump-sem-ir-begin
//@dump-sem-ir-end
//@dump-sem-ir-begin
//@dump-sem-ir-end
//@dump-sem-ir-begin
//@dump-sem-ir-end
// --- fail_extra_text.carbon
// CHECK:STDOUT: - filename: fail_extra_text.carbon
// CHECK:STDOUT: tokens:
// CHECK:STDERR: fail_extra_text.carbon:[[@LINE+4]]:3: error: whitespace is required after '//' [NoWhitespaceAfterCommentIntroducer]
// CHECK:STDERR: //@dump-sem-ir-begin more text
// CHECK:STDERR: ^
// CHECK:STDERR:
//@dump-sem-ir-begin more text
// --- fail_start_only.carbon
// CHECK:STDOUT: - filename: fail_start_only.carbon
// CHECK:STDOUT: tokens:
// CHECK:STDOUT: dump_sem_ir_ranges:
// CHECK:STDOUT: - {begin: 1, end: 0}
//@dump-sem-ir-begin
// CHECK:STDERR: fail_start_only.carbon:[[@LINE+4]]:1: error: missing `//@dump-sem-ir-end` to match `//@dump-sem-ir-begin` [DumpSemIRRangeMissingEnd]
// CHECK:STDERR:
// CHECK:STDERR: ^
// CHECK:STDERR:
// --- fail_end_only.carbon
// CHECK:STDOUT: - filename: fail_end_only.carbon
// CHECK:STDOUT: tokens:
// CHECK:STDERR: fail_end_only.carbon:[[@LINE+4]]:1: error: missing `//@dump-sem-ir-begin` to match `//@dump-sem-ir-end` [DumpSemIRRangeMissingBegin]
// CHECK:STDERR: //@dump-sem-ir-end
// CHECK:STDERR: ^
// CHECK:STDERR:
//@dump-sem-ir-end
// --- fail_misordered.carbon
// CHECK:STDOUT: - filename: fail_misordered.carbon
// CHECK:STDOUT: tokens:
a
// CHECK:STDOUT: - { index: 1, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "a", identifier: 0, has_leading_space: true }
//@dump-sem-ir-begin
b
// CHECK:STDOUT: - { index: 2, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "b", identifier: 1, has_leading_space: true }
// CHECK:STDERR: fail_misordered.carbon:[[@LINE+4]]:1: error: missing `//@dump-sem-ir-end` to match `//@dump-sem-ir-begin` [DumpSemIRRangeMissingEnd]
// CHECK:STDERR: //@dump-sem-ir-begin
// CHECK:STDERR: ^
// CHECK:STDERR:
//@dump-sem-ir-begin
c
// CHECK:STDOUT: - { index: 3, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "c", identifier: 2, has_leading_space: true }
//@dump-sem-ir-end
d
// CHECK:STDOUT: - { index: 4, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "d", identifier: 3, has_leading_space: true }
// CHECK:STDERR: fail_misordered.carbon:[[@LINE+4]]:1: error: missing `//@dump-sem-ir-begin` to match `//@dump-sem-ir-end` [DumpSemIRRangeMissingBegin]
// CHECK:STDERR: //@dump-sem-ir-end
// CHECK:STDERR: ^
// CHECK:STDERR:
//@dump-sem-ir-end
e
// CHECK:STDOUT: - { index: 5, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "e", identifier: 4, has_leading_space: true }
// CHECK:STDOUT: dump_sem_ir_ranges:
// CHECK:STDOUT: - {begin: 2, end: 2}
// CHECK:STDOUT: - {begin: 3, end: 3}
// --- fail_count_mismatch.carbon
// CHECK:STDOUT: - filename: fail_count_mismatch.carbon
// CHECK:STDOUT: tokens:
a
// CHECK:STDOUT: - { index: 1, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "a", identifier: 0, has_leading_space: true }
//@dump-sem-ir-begin
b
// CHECK:STDOUT: - { index: 2, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "b", identifier: 1, has_leading_space: true }
//@dump-sem-ir-end
c
// CHECK:STDOUT: - { index: 3, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "c", identifier: 2, has_leading_space: true }
//@dump-sem-ir-begin
d
// CHECK:STDOUT: - { index: 4, kind: "Identifier", line: {{ *}}[[@LINE-1]], column: 1, indent: 1, spelling: "d", identifier: 3, has_leading_space: true }
// CHECK:STDOUT: dump_sem_ir_ranges:
// CHECK:STDOUT: - {begin: 2, end: 2}
// CHECK:STDOUT: - {begin: 4, end: 4}
// CHECK:STDERR: fail_count_mismatch.carbon:[[@LINE+3]]:17: error: missing `//@dump-sem-ir-end` to match `//@dump-sem-ir-begin` [DumpSemIRRangeMissingEnd]
// CHECK:STDERR: // CHECK:STDERR:
// CHECK:STDERR: ^
// CHECK:STDERR: