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

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

Issue 2814223002: Support for generic function as type arguments in DeclarationResolver. (Closed)
Patch Set: Created 3 years, 8 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
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/declaration_resolver_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 }); 272 });
273 _resolveMetadata(node, node.metadata, element); 273 _resolveMetadata(node, node.metadata, element);
274 return null; 274 return null;
275 } else { 275 } else {
276 return super.visitFunctionTypedFormalParameter(node); 276 return super.visitFunctionTypedFormalParameter(node);
277 } 277 }
278 } 278 }
279 279
280 @override 280 @override
281 Object visitGenericFunctionType(GenericFunctionType node) { 281 Object visitGenericFunctionType(GenericFunctionType node) {
282 GenericFunctionTypeElement element = node.type.element; 282 if (_walker.elementBuilder != null) {
283 _setGenericFunctionType(node.returnType, element.returnType); 283 _walker.elementBuilder.visitGenericFunctionType(node);
284 _walk(new ElementWalker.forGenericFunctionType(element), () { 284 } else {
285 super.visitGenericFunctionType(node); 285 DartType type = node.type;
286 }); 286 if (type != null) {
287 Element element = type.element;
288 if (element is GenericFunctionTypeElement) {
289 _setGenericFunctionType(node.returnType, element.returnType);
290 _walk(new ElementWalker.forGenericFunctionType(element), () {
291 super.visitGenericFunctionType(node);
292 });
293 }
294 }
295 }
287 return null; 296 return null;
288 } 297 }
289 298
290 @override 299 @override
291 Object visitGenericTypeAlias(GenericTypeAlias node) { 300 Object visitGenericTypeAlias(GenericTypeAlias node) {
292 GenericTypeAliasElementImpl element = 301 GenericTypeAliasElementImpl element =
293 _match(node.name, _walker.getTypedef()); 302 _match(node.name, _walker.getTypedef());
294 _setGenericFunctionType(node.functionType, element.function?.type); 303 _setGenericFunctionType(node.functionType, element.function?.type);
295 _walk(new ElementWalker.forGenericTypeAlias(element), () { 304 _walk(new ElementWalker.forGenericTypeAlias(element), () {
296 super.visitGenericTypeAlias(node); 305 super.visitGenericTypeAlias(node);
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 _resolveAnnotations(parent, nodes, element.metadata); 548 _resolveAnnotations(parent, nodes, element.metadata);
540 } 549 }
541 } 550 }
542 551
543 /** 552 /**
544 * If the given [typeNode] is a [GenericFunctionType], set its [type]. 553 * If the given [typeNode] is a [GenericFunctionType], set its [type].
545 */ 554 */
546 void _setGenericFunctionType(TypeAnnotation typeNode, DartType type) { 555 void _setGenericFunctionType(TypeAnnotation typeNode, DartType type) {
547 if (typeNode is GenericFunctionTypeImpl) { 556 if (typeNode is GenericFunctionTypeImpl) {
548 typeNode.type = type; 557 typeNode.type = type;
558 } else if (typeNode is NamedType) {
559 typeNode.type = type;
560 if (type is ParameterizedType) {
561 List<TypeAnnotation> nodes =
562 typeNode.typeArguments?.arguments ?? const [];
563 List<DartType> types = type.typeArguments;
564 if (nodes.length == types.length) {
565 for (int i = 0; i < nodes.length; i++) {
566 _setGenericFunctionType(nodes[i], types[i]);
567 }
568 }
569 }
549 } 570 }
550 } 571 }
551 572
552 /** 573 /**
553 * Recurses through the element model and AST, verifying that all elements are 574 * Recurses through the element model and AST, verifying that all elements are
554 * matched. 575 * matched.
555 * 576 *
556 * Executes [callback] with [_walker] pointing to the given [walker] (which 577 * Executes [callback] with [_walker] pointing to the given [walker] (which
557 * should be a new instance of [ElementWalker]). Once [callback] returns, 578 * should be a new instance of [ElementWalker]). Once [callback] returns,
558 * uses [ElementWalker.validate] to verify that all expected elements have 579 * uses [ElementWalker.validate] to verify that all expected elements have
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 class _ElementMismatchException extends AnalysisException { 815 class _ElementMismatchException extends AnalysisException {
795 /** 816 /**
796 * Creates an exception to refer to the given [compilationUnit], [element], 817 * Creates an exception to refer to the given [compilationUnit], [element],
797 * and [cause]. 818 * and [cause].
798 */ 819 */
799 _ElementMismatchException( 820 _ElementMismatchException(
800 CompilationUnitElement compilationUnit, Element element, 821 CompilationUnitElement compilationUnit, Element element,
801 [CaughtException cause = null]) 822 [CaughtException cause = null])
802 : super('Element mismatch in $compilationUnit at $element', cause); 823 : super('Element mismatch in $compilationUnit at $element', cause);
803 } 824 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/declaration_resolver_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698