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

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

Issue 2092873002: fix #25794, infer parameter type from default value (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 6 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/src/task/strong/inferred_type_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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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.resolver; 5 library analyzer.src.generated.resolver;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
(...skipping 5561 matching lines...) Expand 10 before | Expand all | Expand 10 after
5572 * A comment before a function should be resolved in the context of the 5572 * A comment before a function should be resolved in the context of the
5573 * function. But when we incrementally resolve a comment, we don't want to 5573 * function. But when we incrementally resolve a comment, we don't want to
5574 * resolve the whole function. 5574 * resolve the whole function.
5575 * 5575 *
5576 * So, this flag is set to `true`, when just context of the function should 5576 * So, this flag is set to `true`, when just context of the function should
5577 * be built and the comment resolved. 5577 * be built and the comment resolved.
5578 */ 5578 */
5579 bool resolveOnlyCommentInFunctionBody = false; 5579 bool resolveOnlyCommentInFunctionBody = false;
5580 5580
5581 /** 5581 /**
5582 * True if we're analyzing in strong mode.
5583 */
5584 bool _strongMode;
5585
5586 /**
5582 * Body of the function currently being analyzed, if any. 5587 * Body of the function currently being analyzed, if any.
5583 */ 5588 */
5584 FunctionBody _currentFunctionBody; 5589 FunctionBody _currentFunctionBody;
5585 5590
5586 /** 5591 /**
5587 * Initialize a newly created visitor to resolve the nodes in an AST node. 5592 * Initialize a newly created visitor to resolve the nodes in an AST node.
5588 * 5593 *
5589 * The [definingLibrary] is the element for the library containing the node 5594 * The [definingLibrary] is the element for the library containing the node
5590 * being visited. The [source] is the source representing the compilation unit 5595 * being visited. The [source] is the source representing the compilation unit
5591 * containing the node being visited. The [typeProvider] is the object used to 5596 * containing the node being visited. The [typeProvider] is the object used to
(...skipping 10 matching lines...) Expand all
5602 */ 5607 */
5603 ResolverVisitor(LibraryElement definingLibrary, Source source, 5608 ResolverVisitor(LibraryElement definingLibrary, Source source,
5604 TypeProvider typeProvider, AnalysisErrorListener errorListener, 5609 TypeProvider typeProvider, AnalysisErrorListener errorListener,
5605 {Scope nameScope}) 5610 {Scope nameScope})
5606 : super(definingLibrary, source, typeProvider, errorListener, 5611 : super(definingLibrary, source, typeProvider, errorListener,
5607 nameScope: nameScope) { 5612 nameScope: nameScope) {
5608 this.elementResolver = new ElementResolver(this); 5613 this.elementResolver = new ElementResolver(this);
5609 this.typeSystem = definingLibrary.context.typeSystem; 5614 this.typeSystem = definingLibrary.context.typeSystem;
5610 bool strongModeHints = false; 5615 bool strongModeHints = false;
5611 AnalysisOptions options = definingLibrary.context.analysisOptions; 5616 AnalysisOptions options = definingLibrary.context.analysisOptions;
5617 _strongMode = options.strongMode;
5612 if (options is AnalysisOptionsImpl) { 5618 if (options is AnalysisOptionsImpl) {
5613 strongModeHints = options.strongModeHints; 5619 strongModeHints = options.strongModeHints;
5614 } 5620 }
5615 this.inferenceContext = new InferenceContext._( 5621 this.inferenceContext = new InferenceContext._(
5616 errorReporter, typeProvider, typeSystem, strongModeHints); 5622 errorReporter, typeProvider, typeSystem, strongModeHints);
5617 this.typeAnalyzer = new StaticTypeAnalyzer(this); 5623 this.typeAnalyzer = new StaticTypeAnalyzer(this);
5618 } 5624 }
5619 5625
5620 /** 5626 /**
5621 * Return the element representing the function containing the current node, o r `null` if 5627 * Return the element representing the function containing the current node, o r `null` if
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
6292 // We do not visit the label because it needs to be visited in the context 6298 // We do not visit the label because it needs to be visited in the context
6293 // of the statement. 6299 // of the statement.
6294 // 6300 //
6295 node.accept(elementResolver); 6301 node.accept(elementResolver);
6296 node.accept(typeAnalyzer); 6302 node.accept(typeAnalyzer);
6297 return null; 6303 return null;
6298 } 6304 }
6299 6305
6300 @override 6306 @override
6301 Object visitDefaultFormalParameter(DefaultFormalParameter node) { 6307 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
6302 InferenceContext.setType(node.defaultValue, node.parameter.element?.type); 6308 ParameterElement element = node.element;
6309 InferenceContext.setType(node.defaultValue, element.type);
Jennifer Messerly 2016/06/23 20:14:46 I verified with an assert that `node.parameter.ele
6303 super.visitDefaultFormalParameter(node); 6310 super.visitDefaultFormalParameter(node);
6304 ParameterElement element = node.element;
6305 if (element.initializer != null && node.defaultValue != null) { 6311 if (element.initializer != null && node.defaultValue != null) {
6306 (element.initializer as FunctionElementImpl).returnType = 6312 (element.initializer as FunctionElementImpl).returnType =
6307 node.defaultValue.staticType; 6313 node.defaultValue.staticType;
6308 } 6314 }
6315 if (_strongMode &&
6316 node.defaultValue != null &&
6317 element.hasImplicitType &&
6318 element is! FieldFormalParameterElement) {
Jennifer Messerly 2016/06/23 20:14:46 I experimented with allowing field formal paramete
6319
6320 DartType type = node.defaultValue.staticType;
6321 if (!type.isBottom && !type.isDynamic) {
Leaf 2016/06/23 22:21:17 Are we quite sure that type can't be null here?
Jennifer Messerly 2016/06/24 18:33:59 I think so? :) after resolving an expression, the
Leaf 2016/06/24 21:48:53 I'm ok leaving it. Just wanted to check since we
6322 (element as ParameterElementImpl).type = type;
Leaf 2016/06/23 22:21:17 I'm been trying to record all inference events, ev
Jennifer Messerly 2016/06/24 18:33:59 Yeah that's a good idea ... the only strange part
6323 }
6324 }
6309 // Clone the ASTs for default formal parameters, so that we can use them 6325 // Clone the ASTs for default formal parameters, so that we can use them
6310 // during constant evaluation. 6326 // during constant evaluation.
6311 if (!LibraryElementImpl.hasResolutionCapability( 6327 if (!LibraryElementImpl.hasResolutionCapability(
6312 definingLibrary, LibraryResolutionCapability.constantExpressions)) { 6328 definingLibrary, LibraryResolutionCapability.constantExpressions)) {
6313 (element as ConstVariableElement).constantInitializer = 6329 (element as ConstVariableElement).constantInitializer =
6314 new ConstantAstCloner().cloneNode(node.defaultValue); 6330 new ConstantAstCloner().cloneNode(node.defaultValue);
6315 } 6331 }
6316 return null; 6332 return null;
6317 } 6333 }
6318 6334
(...skipping 4647 matching lines...) Expand 10 before | Expand all | Expand 10 after
10966 return null; 10982 return null;
10967 } 10983 }
10968 if (identical(node.staticElement, variable)) { 10984 if (identical(node.staticElement, variable)) {
10969 if (node.inSetterContext()) { 10985 if (node.inSetterContext()) {
10970 result = true; 10986 result = true;
10971 } 10987 }
10972 } 10988 }
10973 return null; 10989 return null;
10974 } 10990 }
10975 } 10991 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/src/task/strong/inferred_type_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698