Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(977)

Side by Side Diff: pkg/analyzer/lib/src/generated/declaration_resolver.dart

Issue 2770143002: More generic function type cases working (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.src.generated.declaration_resolver; 5 library analyzer.src.generated.declaration_resolver;
6 6
7 import 'package:analyzer/dart/ast/ast.dart'; 7 import 'package:analyzer/dart/ast/ast.dart';
8 import 'package:analyzer/dart/ast/token.dart'; 8 import 'package:analyzer/dart/ast/token.dart';
9 import 'package:analyzer/dart/ast/visitor.dart'; 9 import 'package:analyzer/dart/ast/visitor.dart';
10 import 'package:analyzer/dart/element/element.dart'; 10 import 'package:analyzer/dart/element/element.dart';
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 _walker.elementBuilder.visitDeclaredIdentifier(node); 120 _walker.elementBuilder.visitDeclaredIdentifier(node);
121 return null; 121 return null;
122 } 122 }
123 123
124 @override 124 @override
125 Object visitDefaultFormalParameter(DefaultFormalParameter node) { 125 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
126 NormalFormalParameter normalParameter = node.parameter; 126 NormalFormalParameter normalParameter = node.parameter;
127 ParameterElement element = 127 ParameterElement element =
128 _match(normalParameter.identifier, _walker.getParameter()); 128 _match(normalParameter.identifier, _walker.getParameter());
129 if (normalParameter is SimpleFormalParameterImpl) { 129 if (normalParameter is SimpleFormalParameterImpl) {
130 normalParameter.element = node.identifier.staticElement; 130 normalParameter.element = element;
131 } 131 }
132 Expression defaultValue = node.defaultValue; 132 Expression defaultValue = node.defaultValue;
133 if (defaultValue != null) { 133 if (defaultValue != null) {
134 _walk( 134 _walk(
135 new ElementWalker.forExecutable(element.initializer, _enclosingUnit), 135 new ElementWalker.forExecutable(element.initializer, _enclosingUnit),
136 () { 136 () {
137 defaultValue.accept(this); 137 defaultValue.accept(this);
138 }); 138 });
139 } 139 }
140 _walk(new ElementWalker.forParameter(element), () { 140 _walk(new ElementWalker.forParameter(element), () {
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 super.visitFunctionTypedFormalParameter(node); 269 super.visitFunctionTypedFormalParameter(node);
270 }); 270 });
271 _resolveMetadata(node, node.metadata, element); 271 _resolveMetadata(node, node.metadata, element);
272 return null; 272 return null;
273 } else { 273 } else {
274 return super.visitFunctionTypedFormalParameter(node); 274 return super.visitFunctionTypedFormalParameter(node);
275 } 275 }
276 } 276 }
277 277
278 @override 278 @override
279 Object visitGenericFunctionType(GenericFunctionType node) {
280 GenericFunctionTypeElement element = node.type.element;
281 _walk(new ElementWalker.forGenericFunctionType(element), () {
282 super.visitGenericFunctionType(node);
283 });
284 return null;
285 }
286
287 @override
288 Object visitGenericTypeAlias(GenericTypeAlias node) {
289 GenericTypeAliasElementImpl element =
290 _match(node.name, _walker.getTypedef());
291 (node.functionType as GenericFunctionTypeImpl)?.type =
292 element.function?.type;
293 _walk(new ElementWalker.forGenericTypeAlias(element), () {
294 super.visitGenericTypeAlias(node);
295 });
296 _resolveMetadata(node, node.metadata, element);
297 return null;
298 }
299
300 @override
279 Object visitImportDirective(ImportDirective node) { 301 Object visitImportDirective(ImportDirective node) {
280 super.visitImportDirective(node); 302 super.visitImportDirective(node);
281 List<ElementAnnotation> annotations = 303 List<ElementAnnotation> annotations =
282 _enclosingUnit.getAnnotations(node.offset); 304 _enclosingUnit.getAnnotations(node.offset);
283 if (annotations.isEmpty && node.metadata.isNotEmpty) { 305 if (annotations.isEmpty && node.metadata.isNotEmpty) {
284 int index = (node.parent as CompilationUnit) 306 int index = (node.parent as CompilationUnit)
285 .directives 307 .directives
286 .where((directive) => directive is ImportDirective) 308 .where((directive) => directive is ImportDirective)
287 .toList() 309 .toList()
288 .indexOf(node); 310 .indexOf(node);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 Object visitPartOfDirective(PartOfDirective node) { 385 Object visitPartOfDirective(PartOfDirective node) {
364 node.element = _enclosingUnit.library; 386 node.element = _enclosingUnit.library;
365 return super.visitPartOfDirective(node); 387 return super.visitPartOfDirective(node);
366 } 388 }
367 389
368 @override 390 @override
369 Object visitSimpleFormalParameter(SimpleFormalParameter node) { 391 Object visitSimpleFormalParameter(SimpleFormalParameter node) {
370 if (node.parent is! DefaultFormalParameter) { 392 if (node.parent is! DefaultFormalParameter) {
371 ParameterElement element = 393 ParameterElement element =
372 _match(node.identifier, _walker.getParameter()); 394 _match(node.identifier, _walker.getParameter());
373 (node as SimpleFormalParameterImpl).element = 395 (node as SimpleFormalParameterImpl).element = element;
374 node.identifier.staticElement; 396 TypeAnnotation type = node.type;
397 if (type is GenericFunctionTypeImpl) {
398 type.type = element.type;
399 }
375 _walk(new ElementWalker.forParameter(element), () { 400 _walk(new ElementWalker.forParameter(element), () {
376 super.visitSimpleFormalParameter(node); 401 super.visitSimpleFormalParameter(node);
377 }); 402 });
378 _resolveMetadata(node, node.metadata, element); 403 _resolveMetadata(node, node.metadata, element);
379 return null; 404 return null;
380 } else { 405 } else {
381 return super.visitSimpleFormalParameter(node); 406 return super.visitSimpleFormalParameter(node);
382 } 407 }
383 } 408 }
384 409
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 * If no [elementName] is given, it defaults to the name of the [identifier] 479 * If no [elementName] is given, it defaults to the name of the [identifier]
455 * (or the empty string if [identifier] is `null`). 480 * (or the empty string if [identifier] is `null`).
456 * 481 *
457 * If [identifier] is `null`, nothing is updated, but the element name is 482 * If [identifier] is `null`, nothing is updated, but the element name is
458 * still checked. 483 * still checked.
459 */ 484 */
460 Element/*=E*/ _match/*<E extends Element>*/( 485 Element/*=E*/ _match/*<E extends Element>*/(
461 SimpleIdentifier identifier, Element/*=E*/ element, 486 SimpleIdentifier identifier, Element/*=E*/ element,
462 {String elementName, int offset}) { 487 {String elementName, int offset}) {
463 elementName ??= identifier?.name ?? ''; 488 elementName ??= identifier?.name ?? '';
464 offset ??= identifier.offset; 489 offset ??= identifier?.offset ?? -1;
465 if (element.name != elementName) { 490 if (element.name != elementName) {
466 throw new StateError( 491 throw new StateError(
467 'Expected an element matching `$elementName`, got `${element.name}`'); 492 'Expected an element matching `$elementName`, got `${element.name}`');
468 } 493 }
469 identifier?.staticElement = element; 494 identifier?.staticElement = element;
470 _matchOffset(element, offset); 495 _matchOffset(element, offset);
471 return element; 496 return element;
472 } 497 }
473 498
474 void _matchOffset(Element element, int offset) { 499 void _matchOffset(Element element, int offset) {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 635
611 /** 636 /**
612 * Creates an [ElementWalker] which walks the child elements of a compilation 637 * Creates an [ElementWalker] which walks the child elements of a compilation
613 * unit element. 638 * unit element.
614 */ 639 */
615 ElementWalker.forExecutable( 640 ElementWalker.forExecutable(
616 ExecutableElement element, CompilationUnitElement compilationUnit) 641 ExecutableElement element, CompilationUnitElement compilationUnit)
617 : this._forExecutable(element, compilationUnit, new ElementHolder()); 642 : this._forExecutable(element, compilationUnit, new ElementHolder());
618 643
619 /** 644 /**
645 * Creates an [ElementWalker] which walks the child elements of a typedef
646 * element.
647 */
648 ElementWalker.forGenericFunctionType(GenericFunctionTypeElement element)
649 : element = element,
650 _parameters = element.parameters,
651 _typeParameters = element.typeParameters;
652
653 /**
654 * Creates an [ElementWalker] which walks the child elements of a typedef
655 * element defined using a generic function type.
656 */
657 ElementWalker.forGenericTypeAlias(FunctionTypeAliasElement element)
658 : element = element,
659 _typeParameters = element.typeParameters;
660
661 /**
620 * Creates an [ElementWalker] which walks the child elements of a parameter 662 * Creates an [ElementWalker] which walks the child elements of a parameter
621 * element. 663 * element.
622 */ 664 */
623 ElementWalker.forParameter(ParameterElement element) 665 ElementWalker.forParameter(ParameterElement element)
624 : element = element, 666 : element = element,
625 _parameters = element.parameters, 667 _parameters = element.parameters,
626 _typeParameters = element.typeParameters; 668 _typeParameters = element.typeParameters;
627 669
628 /** 670 /**
629 * Creates an [ElementWalker] which walks the child elements of a typedef 671 * Creates an [ElementWalker] which walks the child elements of a typedef
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 class _ElementMismatchException extends AnalysisException { 782 class _ElementMismatchException extends AnalysisException {
741 /** 783 /**
742 * Creates an exception to refer to the given [compilationUnit], [element], 784 * Creates an exception to refer to the given [compilationUnit], [element],
743 * and [cause]. 785 * and [cause].
744 */ 786 */
745 _ElementMismatchException( 787 _ElementMismatchException(
746 CompilationUnitElement compilationUnit, Element element, 788 CompilationUnitElement compilationUnit, Element element,
747 [CaughtException cause = null]) 789 [CaughtException cause = null])
748 : super('Element mismatch in $compilationUnit at $element', cause); 790 : super('Element mismatch in $compilationUnit at $element', cause);
749 } 791 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/element.dart ('k') | pkg/analyzer/lib/src/generated/error_verifier.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698