Skip to content

Commit 6ff0320

Browse files
authored
tests for constructor tear-offs (dart-archive/linter#2901)
1 parent dfacbc4 commit 6ff0320

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// test w/ `dart test -N unnecessary_statements`
6+
7+
void constructorTearOffs() {
8+
MyClass.new; // LINT
9+
MyClass.named; // LINT
10+
11+
var m = MyClass.new;
12+
m().foo; // LINT
13+
m().field; // LINT
14+
}
15+
16+
String f(Object o) {
17+
// See: https://github.com/dart-lang/linter/issues/2163
18+
o as int; // OK
19+
return null;
20+
}
21+
22+
notReturned() {
23+
1; // LINT
24+
1 + 1; // LINT
25+
foo; // LINT
26+
new MyClass().foo; // LINT
27+
new MyClass()..foo; // LINT
28+
new MyClass()
29+
..getter // OK
30+
..foo() // OK
31+
..foo; // LINT
32+
[]; // LINT
33+
<dynamic, dynamic>{}; // LINT
34+
"blah"; // LINT
35+
~1; // LINT
36+
37+
getter; // OK
38+
field; // LINT
39+
new MyClass().getter; // OK
40+
new MyClass().field; // LINT
41+
var myClass = new MyClass();
42+
myClass; // LINT
43+
myClass.getter; // OK
44+
myClass.field; // LINT
45+
46+
new MyClass(); // OK
47+
foo(); // OK
48+
new MyClass().foo(); // OK
49+
var x = 2; // OK
50+
x++; // OK
51+
x--; // OK
52+
++x; // OK
53+
--x; // OK
54+
try {
55+
throw new Exception(); // OK
56+
} catch (x) {
57+
rethrow; // OK
58+
}
59+
}
60+
61+
asConditionAndReturnOk() {
62+
if (true == someBool) // OK
63+
{
64+
return 1 + 1; // OK
65+
} else if (false == someBool) {
66+
return foo; // OK
67+
}
68+
while (new MyClass() != null) // OK
69+
{
70+
return new MyClass().foo; // OK
71+
}
72+
while (null == someBool) // OK
73+
{
74+
return new MyClass()..foo; // LINT
75+
}
76+
for (; someBool ?? someBool;) // OK
77+
{
78+
return <dynamic, dynamic>{}; // OK
79+
}
80+
do {} while ("blah".isEmpty); // OK
81+
for (var i in []) {} // OK
82+
switch (~1) // OK
83+
{
84+
}
85+
86+
() => new MyClass().foo; // LINT
87+
myfun() => new MyClass().foo; // OK
88+
myfun2() => new MyClass()..foo; // LINT
89+
}
90+
91+
myfun() => new MyClass().foo; // OK
92+
myfun2() => new MyClass()..foo; // LINT
93+
94+
expressionBranching() {
95+
null ?? 1 + 1; // LINT
96+
null ?? foo; // LINT
97+
null ?? new MyClass().foo; // LINT
98+
false || 1 + 1 == 2; // LINT
99+
false || foo == true; // LINT
100+
false || new MyClass() as bool; // OK
101+
false || new MyClass().foo == true; // LINT
102+
true && 1 + 1 == 2; // LINT
103+
true && foo == true; // LINT
104+
true && new MyClass() as bool; // OK
105+
true && new MyClass().foo == true; // LINT
106+
107+
// ternaries can detect either/both sides
108+
someBool // OK
109+
? 1 + 1 // LINT
110+
: foo(); // OK
111+
someBool // OK
112+
? foo() // OK
113+
: foo; // LINT
114+
someBool // OK
115+
? new MyClass() // OK
116+
: foo(); // OK
117+
someBool // OK
118+
? foo() // OK
119+
: new MyClass().foo; // LINT
120+
someBool // OK
121+
? [] //LINT
122+
: {}; // LINT
123+
124+
// not unnecessary condition, but unnecessary branching
125+
foo() ?? 1 + 1; // LINT
126+
foo() || new MyClass() as bool; // OK
127+
foo() && foo == true; // LINT
128+
foo() ? 1 + 1 : foo(); // LINT
129+
foo() ? foo() : foo; // LINT
130+
foo() ? foo() : new MyClass().foo; // LINT
131+
132+
null ?? new MyClass(); // OK
133+
null ?? foo(); // OK
134+
null ?? new MyClass().foo(); // OK
135+
false || foo(); // OK
136+
false || new MyClass().foo(); // OK
137+
true && foo(); // OK
138+
true && new MyClass().foo(); // OK
139+
someBool ? foo() : new MyClass().foo(); // OK
140+
foo() ? foo() : new MyClass().foo(); // OK
141+
foo() ? new MyClass() : foo(); // OK
142+
}
143+
144+
inOtherStatements() {
145+
if (foo()) {
146+
1; // LINT
147+
}
148+
while (someBool) {
149+
1 + 1; // LINT
150+
}
151+
for (foo; foo();) {} // LINT
152+
for (; foo(); 1 + 1) {} // LINT
153+
for (;
154+
foo();
155+
foo(), // OK
156+
1 + 1, // LINT
157+
new MyClass().foo) {} // LINT
158+
do {
159+
new MyClass().foo; // LINT
160+
} while (foo());
161+
162+
switch (foo()) {
163+
case true:
164+
[]; // LINT
165+
break; // OK
166+
case false:
167+
<dynamic, dynamic>{}; // LINT
168+
break; // OK
169+
default:
170+
"blah"; // LINT
171+
}
172+
173+
for (var i in [1, 2, 3]) {
174+
~1; // LINT
175+
}
176+
}
177+
178+
bool someBool = true;
179+
bool foo() => true;
180+
get getter => true;
181+
int field;
182+
183+
class MyClass {
184+
int field = 0;
185+
bool foo() => true;
186+
187+
get getter => true;
188+
189+
MyClass();
190+
MyClass.named();
191+
}

0 commit comments

Comments
 (0)