@@ -24,7 +24,6 @@ class TypeNameResolver {
24
24
final TypeSystemImpl typeSystem;
25
25
final DartType dynamicType;
26
26
final bool isNonNullableByDefault;
27
- final LibraryElement definingLibrary; // TODO(scheglov) remove
28
27
final ErrorReporter errorReporter;
29
28
30
29
Scope nameScope;
@@ -52,7 +51,7 @@ class TypeNameResolver {
52
51
ConstructorName rewriteResult;
53
52
54
53
TypeNameResolver (this .typeSystem, TypeProvider typeProvider,
55
- this .isNonNullableByDefault, this .definingLibrary, this . errorReporter)
54
+ this .isNonNullableByDefault, this .errorReporter)
56
55
: dynamicType = typeProvider.dynamicType;
57
56
58
57
NullabilitySuffix get _noneOrStarSuffix {
@@ -69,55 +68,51 @@ class TypeNameResolver {
69
68
rewriteResult = null ;
70
69
71
70
var typeIdentifier = node.name;
71
+ if (typeIdentifier is PrefixedIdentifier ) {
72
+ var prefix = typeIdentifier.prefix;
73
+ var prefixName = prefix.name;
74
+ var prefixElement = nameScope.lookup2 (prefixName).getter;
75
+ prefix.staticElement = prefixElement;
72
76
73
- if (typeIdentifier is SimpleIdentifier && typeIdentifier.name == 'void' ) {
74
- node.type = VoidTypeImpl .instance;
75
- return ;
76
- }
77
+ if (prefixElement == null ) {
78
+ _resolveToElement (node, null );
79
+ return ;
80
+ }
81
+
82
+ if (prefixElement is ClassElement ) {
83
+ _rewriteToConstructorName (node, typeIdentifier);
84
+ return ;
85
+ }
77
86
78
- // TODO(scheglov) Update to use `lookup2`.
79
- var element = nameScope.lookupIdentifier (typeIdentifier);
87
+ if (prefixElement is PrefixElement ) {
88
+ var nameNode = typeIdentifier.identifier;
89
+ var name = nameNode.name;
80
90
81
- // TODO(scheglov) When fixing the previous TODO, report the prefix sooner.
82
- if (typeIdentifier is PrefixedIdentifier ) {
83
- var prefix = typeIdentifier.prefix;
84
- var prefixElement = prefix.staticElement;
85
- if (prefixElement != null &&
86
- prefixElement is ! PrefixElement &&
87
- prefixElement is ! ClassElement ) {
88
- errorReporter.reportErrorForNode (
89
- CompileTimeErrorCode .PREFIX_SHADOWED_BY_LOCAL_DECLARATION ,
90
- prefix,
91
- [prefix.name],
92
- );
93
- node.type = dynamicType;
91
+ var element = prefixElement.scope.lookup2 (name).getter;
92
+ nameNode.staticElement = element;
93
+ _resolveToElement (node, element);
94
94
return ;
95
95
}
96
- }
97
96
98
- if (element is MultiplyDefinedElement ) {
99
- _setElement (typeIdentifier, element);
97
+ errorReporter.reportErrorForNode (
98
+ CompileTimeErrorCode .PREFIX_SHADOWED_BY_LOCAL_DECLARATION ,
99
+ prefix,
100
+ [prefix.name],
101
+ );
100
102
node.type = dynamicType;
101
- return ;
102
- }
103
-
104
- if (element != null ) {
105
- _setElement (typeIdentifier, element);
106
- node.type = _instantiateElement (node, element);
107
- return ;
108
- }
103
+ } else {
104
+ var nameNode = typeIdentifier as SimpleIdentifier ;
105
+ var name = nameNode.name;
109
106
110
- // TODO(scheglov) Can we do rewriting better with using `lookup2`?
111
- if ( _rewriteToConstructorName ( node)) {
112
- return ;
113
- }
107
+ if (name == 'void' ) {
108
+ node.type = VoidTypeImpl .instance;
109
+ return ;
110
+ }
114
111
115
- node.type = dynamicType ;
116
- if (nameScope. shouldIgnoreUndefined (typeIdentifier)) {
117
- return ;
112
+ var element = nameScope. lookup2 (name).getter ;
113
+ nameNode.staticElement = element;
114
+ _resolveToElement (node, element) ;
118
115
}
119
-
120
- _ErrorHelper (errorReporter).reportNullOrNonTypeElement (node, null );
121
116
}
122
117
123
118
/// Return type arguments, exactly [parameterCount] .
@@ -306,61 +301,66 @@ class TypeNameResolver {
306
301
}
307
302
}
308
303
304
+ void _resolveToElement (TypeName node, Element element) {
305
+ if (element == null ) {
306
+ node.type = dynamicType;
307
+ if (! nameScope.shouldIgnoreUndefined (node.name)) {
308
+ _ErrorHelper (errorReporter).reportNullOrNonTypeElement (node, null );
309
+ }
310
+ return ;
311
+ }
312
+
313
+ if (element is MultiplyDefinedElement ) {
314
+ node.type = dynamicType;
315
+ return ;
316
+ }
317
+
318
+ node.type = _instantiateElement (node, element);
319
+ }
320
+
309
321
/// We parse `foo.bar` as `prefix.Name` with the expectation that `prefix`
310
- /// will be a [PrefixElement] . But we checked and found that `foo.bar` is
311
- /// not in the scope , so try to see if it is `Class.constructor` .
312
- ///
313
- /// Return `true` if the node was rewritten as `Class.constructor` .
314
- bool _rewriteToConstructorName ( TypeName node) {
315
- var typeIdentifier = node.name;
322
+ /// will be a [PrefixElement] . But when we resolved the `prefix` it turned
323
+ /// out to be a [ClassElement] , so it is probably a `Class.constructor` .
324
+ void _rewriteToConstructorName (
325
+ TypeName node,
326
+ PrefixedIdentifier typeIdentifier,
327
+ ) {
316
328
var constructorName = node.parent;
317
- if (typeIdentifier is PrefixedIdentifier &&
318
- constructorName is ConstructorName &&
319
- constructorName.name == null ) {
329
+ if (constructorName is ConstructorName && constructorName.name == null ) {
320
330
var classIdentifier = typeIdentifier.prefix;
321
- var classElement = nameScope.lookupIdentifier (classIdentifier);
322
- if (classElement is ClassElement ) {
323
- var constructorIdentifier = typeIdentifier.identifier;
324
-
325
- var typeArguments = node.typeArguments;
326
- if (typeArguments != null ) {
327
- errorReporter.reportErrorForNode (
328
- StaticTypeWarningCode .WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR ,
329
- typeArguments,
330
- [classIdentifier.name, constructorIdentifier.name],
331
- );
332
- var instanceCreation = constructorName.parent;
333
- if (instanceCreation is InstanceCreationExpressionImpl ) {
334
- instanceCreation.typeArguments = typeArguments;
335
- }
331
+ var constructorIdentifier = typeIdentifier.identifier;
332
+
333
+ var typeArguments = node.typeArguments;
334
+ if (typeArguments != null ) {
335
+ errorReporter.reportErrorForNode (
336
+ StaticTypeWarningCode .WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR ,
337
+ typeArguments,
338
+ [classIdentifier.name, constructorIdentifier.name],
339
+ );
340
+ var instanceCreation = constructorName.parent;
341
+ if (instanceCreation is InstanceCreationExpressionImpl ) {
342
+ instanceCreation.typeArguments = typeArguments;
336
343
}
344
+ }
337
345
338
- node.name = classIdentifier;
339
- node.typeArguments = null ;
346
+ node.name = classIdentifier;
347
+ node.typeArguments = null ;
340
348
341
- constructorName.period = typeIdentifier.period;
342
- constructorName.name = constructorIdentifier;
349
+ constructorName.period = typeIdentifier.period;
350
+ constructorName.name = constructorIdentifier;
343
351
344
- rewriteResult = constructorName;
345
- return true ;
346
- }
352
+ rewriteResult = constructorName;
353
+ return ;
347
354
}
348
355
349
- return false ;
350
- }
351
-
352
- /// Records the new Element for a TypeName's Identifier.
353
- ///
354
- /// A null may be passed in to indicate that the element can't be resolved.
355
- /// (During a re-run of a task, it's important to clear any previous value
356
- /// of the element.)
357
- void _setElement (Identifier typeName, Element element) {
358
- if (typeName is SimpleIdentifier ) {
359
- typeName.staticElement = element;
360
- } else if (typeName is PrefixedIdentifier ) {
361
- typeName.identifier.staticElement = element;
362
- SimpleIdentifier prefix = typeName.prefix;
363
- prefix.staticElement = nameScope.lookupIdentifier (prefix);
356
+ if (_isInstanceCreation (node)) {
357
+ _ErrorHelper (errorReporter).reportNewWithNonType (node);
358
+ } else {
359
+ errorReporter.reportErrorForNode (
360
+ StaticWarningCode .NOT_A_TYPE ,
361
+ typeIdentifier,
362
+ [typeIdentifier.name],
363
+ );
364
364
}
365
365
}
366
366
0 commit comments