forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpretty-printed-diagnostics.swift
202 lines (163 loc) Β· 6.93 KB
/
pretty-printed-diagnostics.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
// RUN: not %target-swift-frontend -diagnostic-style=swift -typecheck %/s 2>&1 | %FileCheck %s
// Note: test has not been updated to match the swift-syntax style.
// REQUIRES: newswiftsyntaxstyle
1 + 2
func foo(a: Int, b: Int) {
a + b
}
foo(b: 1, a: 2)
func baz() {
bar(a: "hello, world!")
}
struct Foo {
var x: Int
var x: Int
}
func bar(a: Int) {}
func bar(a: Float) {}
func bazz() throws {
}
bazz()
struct A {}
extension A {
let x: Int = { 42 }
}
let abc = "π
let x = {
let y = 1
return y
}
struct B: Decodable {
let a: Foo
}
// The line below is indented with tabs, not spaces.
foo(b: 1, a: 2)
let πππ = {
let y = 1
return y
}
// Multi-line fix-its
foo(b: 1,
a: 2)
foo(b:
1,
a:
2)
foo(b:
1,
a: 2)
// Test fallback for non-ASCII characters.
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:11
// CHECK: [[#LINE-1]] |
// CHECK: [[#LINE]] | let abc = "π
// CHECK: | --> error: unterminated string literal
// CHECK: [[#LINE+1]] |
// Test underlining.
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:3
// CHECK: [[#LINE-1]] |
// CHECK: [[#LINE]] | 1 + 2
// CHECK: | ~ ~
// CHECK: | ^ warning: result of operator '+' is unused
// CHECK: [[#LINE+1]] |
// Test inline fix-it rendering.
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:11
// CHECK: [[#LINE-1]] |
// CHECK: [[#LINE]] | foo(a: 2, b: 1, a: 2)
// CHECK: | ++++++~~~~------
// CHECK: | ^ error: argument 'a' must precede argument 'b' [remove ', a: 2' and insert 'a: 2, ']
// CHECK: [[#LINE+1]] |
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:7
// CHECK: [[#LINE-2]] | struct Foo {
// CHECK: [[#LINE-1]] | var x: Int
// CHECK: | ^ note: 'x' previously declared here
// CHECK: [[#LINE]] | var x: Int
// CHECK: | ^ error: invalid redeclaration of 'x'
// CHECK: [[#LINE+1]] | }
// Test out-of-line fix-its on notes.
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:1
// CHECK: [[#LINE-1]] | }
// CHECK: [[#LINE]] | bazz()
// CHECK: | ~~~~~~
// CHECK: | ^ error: call can throw but is not marked with 'try'
// CHECK: | ^ note: did you mean to use 'try'? [insert 'try ']
// CHECK: | ^ note: did you mean to handle error as optional value? [insert 'try? ']
// CHECK: | ^ note: did you mean to disable error propagation? [insert 'try! ']
// CHECK: [[#LINE+1]] |
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:7
// CHECK: [[#LINE-1]] | extension A {
// CHECK: [[#LINE]] | let x: Int = { 42 }
// CHECK: | ^ error: extensions must not contain stored properties
// CHECK: [[#LINE+1]] | }
// Test complex out-of-line fix-its.
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:16
// CHECK: [[#LINE-1]] | extension A {
// CHECK: [[#LINE]] | let x: Int = { 42 }()
// CHECK: | ~~~~~~++
// CHECK: | ^ error: function produces expected type 'Int'; did you mean to call it with '()'?
// CHECK: | ^ note: Remove '=' to make 'x' a computed property [remove '= ' and replace 'let' with 'var']
// CHECK: [[#LINE+1]] | }
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:8
// CHECK: [[#LINE-1]] |
// CHECK: [[#LINE]] | struct B: Decodable {
// CHECK: | ^ error: type 'B' does not conform to protocol 'Decodable'
// CHECK: [[#LINE+1]] | let a: Foo
// CHECK: Swift.Decodable:2:5
// CHECK: 1 | public protocol Decodable {
// CHECK: 2 | init(from decoder: Decoder) throws
// CHECK: | ^ note: protocol requires initializer 'init(from:)' with type 'Decodable'
// CHECK: 3 | }
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:14
// CHECK: [[#LINE-1]] | // The line below is indented with tabs, not spaces.
// CHECK: [[#LINE]] | foo(a: 2, b: 1, a: 2)
// CHECK: | ++++++~~~~------
// CHECK: | ^ error: argument 'a' must precede argument 'b' [remove ', a: 2' and insert 'a: 2, ']
// CHECK: [[#LINE+1]] |
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:5
// CHECK: [[#LINE-2]] | // Multi-line fix-its
// CHECK: [[#LINE-1]] | foo(a: 2, b: 1,
// CHECK: | ++++++~~~~-
// CHECK: [[#LINE]] | a: 2)
// CHECK: | ----
// CHECK: | ^ error: argument 'a' must precede argument 'b' [remove ',\n a: 2' and insert 'a: 2, ']
// CHECK: [[#LINE+1]] |
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:5
// CHECK: [[#LINE-3]] |
// CHECK: [[#LINE-2]] | foo(b:
// CHECK: | ~~
// CHECK: [[#LINE-1]] | 1,
// CHECK: | ~-
// CHECK: [[#LINE]] | a:
// CHECK: | --
// CHECK: | ^ error: argument 'a' must precede argument 'b' [remove ',\n a:\n 2' and insert 'a:\n 2, ']
// CHECK: [[#LINE+1]] | 2)
// CHECK: | -
// CHECK: [[#LINE+2]] |
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:5
// CHECK: [[#LINE-3]] |
// CHECK: [[#LINE-2]] | foo(a: 2, b:
// CHECK: | ++++++~~
// CHECK: [[#LINE-1]] | 1,
// CHECK: | ~-
// CHECK: [[#LINE]] | a: 2)
// CHECK: | ----
// CHECK: | ^ error: argument 'a' must precede argument 'b' [remove ',\n a: 2' and insert 'a: 2, ']
// CHECK: [[#LINE+1]] |
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:5
// CHECK: [[#LINE-1]] | func foo(a: Int, b: Int) {
// CHECK: [[#LINE]] | a + b
// CHECK: | ~ ~
// CHECK: | ^ warning: result of operator '+' is unused
// CHECK: [[#LINE+1]] | }
// Test snippet truncation.
// CHECK: SOURCE_DIR{{[/\]+}}test{{[/\]+}}diagnostics{{[/\]+}}pretty-printed-diagnostics.swift:[[#LINE:]]:3
// CHECK: [[#LINE-1]] | func baz() {
// CHECK: [[#LINE]] | bar(a: "hello, world!")
// CHECK: | ^ error: no exact matches in call to global function 'bar'
// CHECK: [[#LINE+1]] | }
// CHECK: ...
// CHECK: [[#LINE:]] |
// CHECK: [[#LINE+1]] | func bar(a: Int) {}
// CHECK: | ^ note: candidate expects value of type 'Int' for parameter #1
// CHECK: [[#LINE+2]] | func bar(a: Float) {}
// CHECK: | ^ note: candidate expects value of type 'Float' for parameter #1
// CHECK: [[#LINE+3]] |