mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-01 15:15:53 +01:00
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.
147 lines
6.4 KiB
Plaintext
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:
|