Skip to content

Commit 8bc4ef7

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Extract specific node handling functions in TypesBuilder.
Also extract _setSyntheticVariableType() that does similar operations for top-level and instance getters / setters. Change-Id: I25d57ee74869dbc633d213c232f0653c4ec1329a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/442248 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent a278738 commit 8bc4ef7

File tree

1 file changed

+67
-72
lines changed

1 file changed

+67
-72
lines changed

pkg/analyzer/lib/src/summary2/types_builder.dart

Lines changed: 67 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -168,37 +168,7 @@ class TypesBuilder {
168168
} else if (node is FieldFormalParameterImpl) {
169169
_fieldFormalParameter(node);
170170
} else if (node is FunctionDeclarationImpl) {
171-
var returnType = node.returnType?.type;
172-
if (returnType == null) {
173-
if (node.isSetter) {
174-
returnType = _voidType;
175-
} else {
176-
returnType = _dynamicType;
177-
}
178-
}
179-
var fragment = node.declaredFragment!;
180-
var element = fragment.element;
181-
element.returnType = returnType;
182-
183-
switch (element) {
184-
case GetterElementImpl():
185-
element.returnType = returnType;
186-
(element.variable as TopLevelVariableElementImpl).type = returnType;
187-
case SetterElementImpl():
188-
element.returnType = returnType;
189-
var valueElement = element.valueFormalParameter;
190-
var valueNode = node.functionExpression.parameters!.parameters.single;
191-
var valueNodeElement = valueNode.declaredFragment!.element;
192-
var valueType = valueNodeElement.type;
193-
valueElement.type = valueType;
194-
195-
var variableElement = element.variable as TopLevelVariableElementImpl;
196-
if (variableElement.isSynthetic) {
197-
variableElement.type = valueType;
198-
}
199-
case TopLevelFunctionElementImpl():
200-
element.returnType = returnType;
201-
}
171+
_functionDeclaration(node);
202172
} else if (node is FunctionTypeAliasImpl) {
203173
_functionTypeAlias(node);
204174
} else if (node is FunctionTypedFormalParameterImpl) {
@@ -208,55 +178,17 @@ class TypesBuilder {
208178
} else if (node is GenericTypeAliasImpl) {
209179
_genericTypeAlias(node);
210180
} else if (node is MethodDeclarationImpl) {
211-
var returnType = node.returnType?.type;
212-
if (returnType == null) {
213-
if (node.isSetter) {
214-
returnType = _voidType;
215-
} else if (node.isOperator && node.name.lexeme == '[]=') {
216-
returnType = _voidType;
217-
} else {
218-
returnType = _dynamicType;
219-
}
220-
}
221-
var fragment = node.declaredFragment!;
222-
var element = fragment.element;
223-
switch (element) {
224-
case GetterElementImpl():
225-
element.returnType = returnType;
226-
(element.variable as FieldElementImpl).type = returnType;
227-
case SetterElementImpl():
228-
element.returnType = returnType;
229-
var valueElement = element.valueFormalParameter;
230-
var valueNode = node.parameters!.parameters.single;
231-
var valueNodeElement = valueNode.declaredFragment!.element;
232-
var valueType = valueNodeElement.type;
233-
valueElement.type = valueType;
234-
235-
var variableElement = element.variable as FieldElementImpl;
236-
if (variableElement.isSynthetic && variableElement.getter == null) {
237-
variableElement.type = valueType;
238-
}
239-
case MethodElementImpl():
240-
element.returnType = returnType;
241-
}
181+
_methodDeclaration(node);
242182
} else if (node is MixinDeclarationImpl) {
243183
_mixinDeclaration(node);
244184
} else if (node is SimpleFormalParameterImpl) {
245-
var fragment = node.declaredFragment!;
246-
fragment.element.type = node.type?.type ?? _dynamicType;
185+
_simpleFormalParameter(node);
247186
} else if (node is SuperFormalParameterImpl) {
248187
_superFormalParameter(node);
249188
} else if (node is TypeParameterImpl) {
250189
_typeParameter(node);
251190
} else if (node is VariableDeclarationListImpl) {
252-
var type = node.type?.type;
253-
if (type != null) {
254-
for (var variable in node.variables) {
255-
var variableFragment = variable.declaredFragment!;
256-
var variableElement = variableFragment.element;
257-
variableElement.type = type;
258-
}
259-
}
191+
_variableDeclarationList(node);
260192
} else {
261193
throw UnimplementedError('${node.runtimeType}');
262194
}
@@ -322,6 +254,22 @@ class TypesBuilder {
322254
}).toFixedList();
323255
}
324256

257+
void _functionDeclaration(FunctionDeclarationImpl node) {
258+
var returnType = node.returnType?.type;
259+
if (returnType == null) {
260+
if (node.isSetter) {
261+
returnType = _voidType;
262+
} else {
263+
returnType = _dynamicType;
264+
}
265+
}
266+
267+
var fragment = node.declaredFragment!;
268+
var element = fragment.element;
269+
element.returnType = returnType;
270+
_setSyntheticVariableType(element);
271+
}
272+
325273
void _functionTypeAlias(FunctionTypeAliasImpl node) {
326274
var fragment = node.declaredFragment!;
327275
var function = fragment.aliasedElement as GenericFunctionTypeFragmentImpl;
@@ -360,6 +308,24 @@ class TypesBuilder {
360308
}
361309
}
362310

311+
void _methodDeclaration(MethodDeclarationImpl node) {
312+
var returnType = node.returnType?.type;
313+
if (returnType == null) {
314+
if (node.isSetter) {
315+
returnType = _voidType;
316+
} else if (node.isOperator && node.name.lexeme == '[]=') {
317+
returnType = _voidType;
318+
} else {
319+
returnType = _dynamicType;
320+
}
321+
}
322+
323+
var fragment = node.declaredFragment!;
324+
var element = fragment.element;
325+
element.returnType = returnType;
326+
_setSyntheticVariableType(element);
327+
}
328+
363329
void _mixinDeclaration(MixinDeclarationImpl node) {
364330
var fragment = node.declaredFragment!;
365331

@@ -383,6 +349,24 @@ class TypesBuilder {
383349
}
384350
}
385351

352+
void _setSyntheticVariableType(ExecutableElementImpl element) {
353+
switch (element) {
354+
case GetterElementImpl():
355+
element.variable.type = element.returnType;
356+
case SetterElementImpl():
357+
var variable = element.variable;
358+
if (variable.isSynthetic && variable.getter == null) {
359+
var valueType = element.valueFormalParameter.type;
360+
variable.type = valueType;
361+
}
362+
}
363+
}
364+
365+
void _simpleFormalParameter(SimpleFormalParameterImpl node) {
366+
var fragment = node.declaredFragment!;
367+
fragment.element.type = node.type?.type ?? _dynamicType;
368+
}
369+
386370
void _superFormalParameter(SuperFormalParameterImpl node) {
387371
var fragment = node.declaredFragment!;
388372
var parameterList = node.parameters;
@@ -428,6 +412,17 @@ class TypesBuilder {
428412
// }
429413
}
430414

415+
void _variableDeclarationList(VariableDeclarationListImpl node) {
416+
var type = node.type?.type;
417+
if (type != null) {
418+
for (var variable in node.variables) {
419+
var variableFragment = variable.declaredFragment!;
420+
var variableElement = variableFragment.element;
421+
variableElement.type = type;
422+
}
423+
}
424+
}
425+
431426
/// The [FunctionType] to use when a function type is expected for a type
432427
/// alias, but the actual provided type annotation is not a function type.
433428
static FunctionTypeImpl _errorFunctionType() {

0 commit comments

Comments
 (0)