Skip to content

Commit 190af6c

Browse files
committed
[Syntax] support nul character as garbage trivia
1 parent 58857fa commit 190af6c

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

lib/Parse/Lexer.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -2341,7 +2341,6 @@ void Lexer::lexTrivia(syntax::Trivia &Pieces, bool IsForTrailingTrivia) {
23412341
Restart:
23422342
const char *TriviaStart = CurPtr;
23432343

2344-
// TODO: Handle random nul('\0') character in the middle of a buffer.
23452344
// TODO: Handle invalid UTF8 sequence which is skipped in lexImpl().
23462345
switch (*CurPtr++) {
23472346
case '\n':
@@ -2421,6 +2420,19 @@ void Lexer::lexTrivia(syntax::Trivia &Pieces, bool IsForTrailingTrivia) {
24212420
goto Restart;
24222421
}
24232422
break;
2423+
case 0:
2424+
switch (getNulCharacterKind(CurPtr - 1)) {
2425+
case NulCharacterKind::Embedded: {
2426+
diagnoseEmbeddedNul(Diags, CurPtr - 1);
2427+
size_t Length = CurPtr - TriviaStart;
2428+
Pieces.push_back(TriviaPiece::garbageText({TriviaStart, Length}));
2429+
goto Restart;
2430+
}
2431+
case NulCharacterKind::CodeCompletion:
2432+
case NulCharacterKind::BufferEnd:
2433+
break;
2434+
}
2435+
break;
24242436
default:
24252437
break;
24262438
}

test/Syntax/lexer_invalid_nul.swift

-5
This file was deleted.

test/Syntax/round_trip_nul.swift

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: cat %s | tr '\132' '\0' > %t.tr
2+
// RUN: cp -f %t.tr %t
3+
// RUN: %round-trip-syntax-test --swift-syntax-test %swift-syntax-test --file %t
4+
let a = Z3Z // nul(Z)
5+
func b() {}

test/Syntax/tokens_nul.swift

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: cat %s | tr '\132' '\0' > %t.tmp
2+
// RUN: cp -f %t.tmp %t
3+
// RUN: %swift-syntax-test -input-source-filename %t -dump-full-tokens 2>&1 | %FileCheck %t
4+
let a = Z3Z // nul(Z)
5+
func b() {}
6+
7+
// CHECK: 4:9: warning: nul character embedded in middle of file
8+
// CHECK: 4:11: warning: nul character embedded in middle of file
9+
// CHECK: 4:20: warning: nul character embedded in middle of file
10+
11+
// CHECK-LABEL: 4:7
12+
// CHECK-NEXT:(Token equal
13+
// CHECK-NEXT: (text="=")
14+
// CHECK-NEXT: (trivia space 1)
15+
// CHECK-NEXT: (trivia garbage_text \000))
16+
17+
// CHECK-LABEL: 4:10
18+
// CHECK-NEXT:(Token integer_literal
19+
// CHECK-NEXT: (text="3")
20+
// CHECK-NEXT: (trivia garbage_text \000)
21+
// CHECK-NEXT: (trivia space 1))
22+
23+
// CHECK-LABEL: 5:1
24+
// CHECK-NEXT:(Token kw_func
25+
// CHECK-NEXT: (trivia line_comment // nul(\000))
26+
// CHECK-NEXT: (trivia newline 1)
27+
// CHECK-NEXT: (text="func")
28+
// CHECK-NEXT: (trivia space 1))

0 commit comments

Comments
 (0)