@@ -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