Skip to content

Commit f024d9d

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
NullabilityEliminator - Never to Null*, remove required from formal parameters.
Change-Id: I3ad2cf15c2ed1e8eb347ac84c9dc401e807e2e7e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/127203 Reviewed-by: Paul Berry <paulberry@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
1 parent 310c2eb commit f024d9d

File tree

7 files changed

+101
-30
lines changed

7 files changed

+101
-30
lines changed

pkg/analyzer/lib/src/dart/element/member.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,8 @@ abstract class Member implements Element {
593593
/// Otherwise, return the type unchanged.
594594
DartType _toLegacyType(DartType type) {
595595
if (isLegacy) {
596-
return NullabilityEliminator.perform(type);
596+
var typeProvider = declaration.library.typeProvider;
597+
return NullabilityEliminator.perform(typeProvider, type);
597598
} else {
598599
return type;
599600
}

pkg/analyzer/lib/src/dart/element/nullability_eliminator.dart

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,19 @@ import 'package:analyzer/dart/element/type.dart';
88
import 'package:analyzer/src/dart/element/element.dart';
99
import 'package:analyzer/src/dart/element/type.dart';
1010
import 'package:analyzer/src/dart/element/type_algebra.dart';
11+
import 'package:analyzer/src/dart/element/type_provider.dart';
1112
import 'package:analyzer/src/dart/element/type_visitor.dart';
13+
import 'package:analyzer/src/generated/resolver.dart';
1214
import 'package:analyzer/src/generated/type_system.dart';
15+
import 'package:analyzer/src/generated/utilities_dart.dart';
1316

1417
class NullabilityEliminator extends DartTypeVisitor<DartType> {
18+
final TypeProviderImpl _typeProvider;
19+
1520
int _counter = 0;
1621

22+
NullabilityEliminator(this._typeProvider);
23+
1724
@override
1825
DartType defaultDartType(DartType type) {
1926
throw UnimplementedError('(${type.runtimeType}) $type');
@@ -35,10 +42,7 @@ class NullabilityEliminator extends DartTypeVisitor<DartType> {
3542

3643
type = _freshTypeParameters(type);
3744

38-
var parameters = type.parameters.map((parameter) {
39-
var type = visit(parameter.type);
40-
return _parameterElement(parameter, type);
41-
}).toList();
45+
var parameters = type.parameters.map(_parameterElement).toList();
4246

4347
var returnType = visit(type.returnType);
4448
var typeArguments = type.typeArguments.map(visit).toList();
@@ -79,7 +83,8 @@ class NullabilityEliminator extends DartTypeVisitor<DartType> {
7983

8084
@override
8185
DartType visitNeverType(NeverTypeImpl type) {
82-
return type.withNullability(NullabilitySuffix.star);
86+
_counter++;
87+
return _typeProvider.nullStar;
8388
}
8489

8590
@override
@@ -159,28 +164,33 @@ class NullabilityEliminator extends DartTypeVisitor<DartType> {
159164
}
160165
}
161166

162-
/// If the [type] itself, or any of its components, has any nullability,
163-
/// return a new type with legacy nullability suffixes. Otherwise return the
164-
/// original instance.
165-
static T perform<T extends DartType>(T type) {
166-
if (type == null) {
167-
return type;
168-
}
167+
ParameterElementImpl _parameterElement(ParameterElement parameter) {
168+
var type = visit(parameter.type);
169169

170-
return NullabilityEliminator().visit(type);
171-
}
170+
// ignore: deprecated_member_use_from_same_package
171+
var parameterKind = parameter.parameterKind;
172+
if (parameter.isRequiredNamed) {
173+
parameterKind = ParameterKind.NAMED;
174+
_counter++;
175+
}
172176

173-
static ParameterElementImpl _parameterElement(
174-
ParameterElement parameter,
175-
DartType type,
176-
) {
177177
var result = ParameterElementImpl.synthetic(
178178
parameter.name,
179179
type,
180-
// ignore: deprecated_member_use_from_same_package
181-
parameter.parameterKind,
180+
parameterKind,
182181
);
183182
result.isExplicitlyCovariant = parameter.isCovariant;
184183
return result;
185184
}
185+
186+
/// If the [type] itself, or any of its components, has any nullability,
187+
/// return a new type with legacy nullability suffixes. Otherwise return the
188+
/// original instance.
189+
static T perform<T extends DartType>(TypeProviderImpl typeProvider, T type) {
190+
if (type == null) {
191+
return type;
192+
}
193+
194+
return NullabilityEliminator(typeProvider).visit(type);
195+
}
186196
}

pkg/analyzer/lib/src/dart/element/type_provider.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ class TypeProviderImpl extends TypeProviderBase {
9393
InterfaceType _symbolType;
9494
InterfaceType _typeType;
9595

96+
InterfaceTypeImpl _nullStar;
97+
9698
InterfaceType _iterableForSetMapDisambiguation;
9799
InterfaceType _mapForSetMapDisambiguation;
98100

@@ -359,6 +361,13 @@ class TypeProviderImpl extends TypeProviderBase {
359361
return _nullElement ??= _getClassElement(_coreLibrary, 'Null');
360362
}
361363

364+
InterfaceTypeImpl get nullStar {
365+
return _nullStar ??= nullElement.instantiate(
366+
typeArguments: const [],
367+
nullabilitySuffix: NullabilitySuffix.star,
368+
);
369+
}
370+
362371
@override
363372
DartObjectImpl get nullObject {
364373
if (_nullObject == null) {

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5984,7 +5984,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
59845984
/// Otherwise, return the original type.
59855985
DartType _toLegacyType(DartType type) {
59865986
if (_isNonNullable) return type;
5987-
return NullabilityEliminator.perform(type);
5987+
return NullabilityEliminator.perform(_typeProvider, type);
59885988
}
59895989

59905990
/**

pkg/analyzer/lib/src/generated/resolver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,7 @@ class ResolverVisitor extends ScopedVisitor {
762762
/// Otherwise, return the original type.
763763
DartType toLegacyTypeIfOptOut(DartType type) {
764764
if (_nonNullableEnabled) return type;
765-
return NullabilityEliminator.perform(type);
765+
return NullabilityEliminator.perform(typeProvider, type);
766766
}
767767

768768
@override

pkg/analyzer/lib/src/generated/type_system.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2888,7 +2888,7 @@ class GenericInferrer {
28882888
/// Otherwise, return the original type.
28892889
DartType _toLegacyType(DartType type) {
28902890
if (isNonNullableByDefault) return type;
2891-
return NullabilityEliminator.perform(type);
2891+
return NullabilityEliminator.perform(typeProvider, type);
28922892
}
28932893

28942894
static String _formatConstraints(Iterable<_TypeConstraint> constraints) {

pkg/analyzer/test/src/dart/element/nullability_eliminator_test.dart

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,53 @@ class NullabilityEliminatorTest with ElementsTypesMixin {
9595
);
9696
}
9797

98+
test_functionType_parameters_named() {
99+
_verify(
100+
functionTypeStar(
101+
parameters: [
102+
namedParameter(name: 'a', type: intNone),
103+
],
104+
returnType: voidNone,
105+
),
106+
functionTypeStar(
107+
parameters: [
108+
namedParameter(name: 'a', type: intStar),
109+
],
110+
returnType: voidNone,
111+
),
112+
);
113+
114+
_verify(
115+
functionTypeStar(
116+
parameters: [
117+
namedRequiredParameter(name: 'a', type: intNone),
118+
],
119+
returnType: voidNone,
120+
),
121+
functionTypeStar(
122+
parameters: [
123+
namedParameter(name: 'a', type: intStar),
124+
],
125+
returnType: voidNone,
126+
),
127+
);
128+
129+
_verify(
130+
functionTypeStar(
131+
parameters: [
132+
namedRequiredParameter(name: 'a', type: intStar),
133+
],
134+
returnType: voidNone,
135+
),
136+
functionTypeStar(
137+
parameters: [
138+
namedParameter(name: 'a', type: intStar),
139+
],
140+
returnType: voidNone,
141+
),
142+
);
143+
}
144+
98145
test_functionType_returnType() {
99146
_verify(
100147
functionTypeStar(returnType: intNone),
@@ -216,9 +263,13 @@ class NullabilityEliminatorTest with ElementsTypesMixin {
216263
}
217264

218265
test_neverType() {
219-
_verify(neverNone, neverStar);
220-
_verify(neverQuestion, neverStar);
221-
_verifySame(neverStar);
266+
_verify(neverNone, nullStar);
267+
_verify(neverQuestion, nullStar);
268+
_verify(neverStar, nullStar);
269+
270+
_verify(listNone(neverNone), listStar(nullStar));
271+
_verify(listQuestion(neverNone), listStar(nullStar));
272+
_verify(listStar(neverNone), listStar(nullStar));
222273
}
223274

224275
test_typeParameterType() {
@@ -245,20 +296,20 @@ class NullabilityEliminatorTest with ElementsTypesMixin {
245296
}
246297

247298
void _verify(DartType input, DartType expected) {
248-
var result = NullabilityEliminator.perform(input);
299+
var result = NullabilityEliminator.perform(typeProvider, input);
249300
expect(result, isNot(same(input)));
250301
expect(result, expected);
251302
}
252303

253304
void _verifySame(DartType input) {
254-
var result = NullabilityEliminator.perform(input);
305+
var result = NullabilityEliminator.perform(typeProvider, input);
255306
expect(result, same(input));
256307
}
257308

258309
void _verifyStr(DartType input, String inputStr, String expectedStr) {
259310
expect(_typeToString(input), inputStr);
260311

261-
var result = NullabilityEliminator.perform(input);
312+
var result = NullabilityEliminator.perform(typeProvider, input);
262313
expect(result, isNot(same(input)));
263314
expect(_typeToString(result), expectedStr);
264315
}

0 commit comments

Comments
 (0)