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

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: Merge remote-tracking branch 'origin/master' into 25794_param_infer Created 4 years, 5 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/lib/src/summary/summarize_elements.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 4817 matching lines...) Expand 10 before | Expand all | Expand 10 after
4828 void pushReturnContext(BlockFunctionBody node) { 4828 void pushReturnContext(BlockFunctionBody node) {
4829 DartType returnType = getType(node); 4829 DartType returnType = getType(node);
4830 _returnStack.add(returnType); 4830 _returnStack.add(returnType);
4831 _inferredReturn.add(BottomTypeImpl.instance); 4831 _inferredReturn.add(BottomTypeImpl.instance);
4832 } 4832 }
4833 4833
4834 /** 4834 /**
4835 * Place an info node into the error stream indicating that a 4835 * Place an info node into the error stream indicating that a
4836 * [type] has been inferred as the type of [node]. 4836 * [type] has been inferred as the type of [node].
4837 */ 4837 */
4838 void recordInference(Expression node, DartType type) { 4838 void recordInference(AstNode node, DartType type) {
4839 if (!_inferenceHints) { 4839 if (!_inferenceHints) {
4840 return; 4840 return;
4841 } 4841 }
4842 4842
4843 ErrorCode error; 4843 ErrorCode error;
4844 if (node is Literal) { 4844 if (node is Literal) {
4845 error = StrongModeCode.INFERRED_TYPE_LITERAL; 4845 error = StrongModeCode.INFERRED_TYPE_LITERAL;
4846 } else if (node is InstanceCreationExpression) { 4846 } else if (node is InstanceCreationExpression) {
4847 error = StrongModeCode.INFERRED_TYPE_ALLOCATION; 4847 error = StrongModeCode.INFERRED_TYPE_ALLOCATION;
4848 } else if (node is FunctionExpression) { 4848 } else if (node is FunctionExpression) {
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
5624 * A comment before a function should be resolved in the context of the 5624 * A comment before a function should be resolved in the context of the
5625 * function. But when we incrementally resolve a comment, we don't want to 5625 * function. But when we incrementally resolve a comment, we don't want to
5626 * resolve the whole function. 5626 * resolve the whole function.
5627 * 5627 *
5628 * So, this flag is set to `true`, when just context of the function should 5628 * So, this flag is set to `true`, when just context of the function should
5629 * be built and the comment resolved. 5629 * be built and the comment resolved.
5630 */ 5630 */
5631 bool resolveOnlyCommentInFunctionBody = false; 5631 bool resolveOnlyCommentInFunctionBody = false;
5632 5632
5633 /** 5633 /**
5634 * True if we're analyzing in strong mode.
5635 */
5636 bool _strongMode;
5637
5638 /**
5634 * Body of the function currently being analyzed, if any. 5639 * Body of the function currently being analyzed, if any.
5635 */ 5640 */
5636 FunctionBody _currentFunctionBody; 5641 FunctionBody _currentFunctionBody;
5637 5642
5638 /** 5643 /**
5639 * Initialize a newly created visitor to resolve the nodes in an AST node. 5644 * Initialize a newly created visitor to resolve the nodes in an AST node.
5640 * 5645 *
5641 * The [definingLibrary] is the element for the library containing the node 5646 * The [definingLibrary] is the element for the library containing the node
5642 * being visited. The [source] is the source representing the compilation unit 5647 * being visited. The [source] is the source representing the compilation unit
5643 * containing the node being visited. The [typeProvider] is the object used to 5648 * containing the node being visited. The [typeProvider] is the object used to
(...skipping 10 matching lines...) Expand all
5654 */ 5659 */
5655 ResolverVisitor(LibraryElement definingLibrary, Source source, 5660 ResolverVisitor(LibraryElement definingLibrary, Source source,
5656 TypeProvider typeProvider, AnalysisErrorListener errorListener, 5661 TypeProvider typeProvider, AnalysisErrorListener errorListener,
5657 {Scope nameScope}) 5662 {Scope nameScope})
5658 : super(definingLibrary, source, typeProvider, errorListener, 5663 : super(definingLibrary, source, typeProvider, errorListener,
5659 nameScope: nameScope) { 5664 nameScope: nameScope) {
5660 this.elementResolver = new ElementResolver(this); 5665 this.elementResolver = new ElementResolver(this);
5661 this.typeSystem = definingLibrary.context.typeSystem; 5666 this.typeSystem = definingLibrary.context.typeSystem;
5662 bool strongModeHints = false; 5667 bool strongModeHints = false;
5663 AnalysisOptions options = definingLibrary.context.analysisOptions; 5668 AnalysisOptions options = definingLibrary.context.analysisOptions;
5669 _strongMode = options.strongMode;
5664 if (options is AnalysisOptionsImpl) { 5670 if (options is AnalysisOptionsImpl) {
5665 strongModeHints = options.strongModeHints; 5671 strongModeHints = options.strongModeHints;
5666 } 5672 }
5667 this.inferenceContext = new InferenceContext._( 5673 this.inferenceContext = new InferenceContext._(
5668 errorReporter, typeProvider, typeSystem, strongModeHints); 5674 errorReporter, typeProvider, typeSystem, strongModeHints);
5669 this.typeAnalyzer = new StaticTypeAnalyzer(this); 5675 this.typeAnalyzer = new StaticTypeAnalyzer(this);
5670 } 5676 }
5671 5677
5672 /** 5678 /**
5673 * Return the element representing the function containing the current node, o r `null` if 5679 * 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
6344 // We do not visit the label because it needs to be visited in the context 6350 // We do not visit the label because it needs to be visited in the context
6345 // of the statement. 6351 // of the statement.
6346 // 6352 //
6347 node.accept(elementResolver); 6353 node.accept(elementResolver);
6348 node.accept(typeAnalyzer); 6354 node.accept(typeAnalyzer);
6349 return null; 6355 return null;
6350 } 6356 }
6351 6357
6352 @override 6358 @override
6353 Object visitDefaultFormalParameter(DefaultFormalParameter node) { 6359 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
6354 InferenceContext.setType(node.defaultValue, node.parameter.element?.type); 6360 ParameterElement element = node.element;
6361 InferenceContext.setType(node.defaultValue, element.type);
6355 super.visitDefaultFormalParameter(node); 6362 super.visitDefaultFormalParameter(node);
6356 ParameterElement element = node.element;
6357 if (element.initializer != null && node.defaultValue != null) { 6363 if (element.initializer != null && node.defaultValue != null) {
6358 (element.initializer as FunctionElementImpl).returnType = 6364 (element.initializer as FunctionElementImpl).returnType =
6359 node.defaultValue.staticType; 6365 node.defaultValue.staticType;
6360 } 6366 }
6367 if (_strongMode &&
6368 node.defaultValue != null &&
6369 element.hasImplicitType &&
6370 element is! FieldFormalParameterElement) {
6371
6372 DartType type = node.defaultValue.staticType;
6373 if (!type.isBottom && !type.isDynamic) {
6374 (element as ParameterElementImpl).type = type;
6375 inferenceContext.recordInference(node, type);
6376 }
6377 }
6361 // Clone the ASTs for default formal parameters, so that we can use them 6378 // Clone the ASTs for default formal parameters, so that we can use them
6362 // during constant evaluation. 6379 // during constant evaluation.
6363 if (!LibraryElementImpl.hasResolutionCapability( 6380 if (!LibraryElementImpl.hasResolutionCapability(
6364 definingLibrary, LibraryResolutionCapability.constantExpressions)) { 6381 definingLibrary, LibraryResolutionCapability.constantExpressions)) {
6365 (element as ConstVariableElement).constantInitializer = 6382 (element as ConstVariableElement).constantInitializer =
6366 new ConstantAstCloner().cloneNode(node.defaultValue); 6383 new ConstantAstCloner().cloneNode(node.defaultValue);
6367 } 6384 }
6368 return null; 6385 return null;
6369 } 6386 }
6370 6387
(...skipping 4647 matching lines...) Expand 10 before | Expand all | Expand 10 after
11018 return null; 11035 return null;
11019 } 11036 }
11020 if (identical(node.staticElement, variable)) { 11037 if (identical(node.staticElement, variable)) {
11021 if (node.inSetterContext()) { 11038 if (node.inSetterContext()) {
11022 result = true; 11039 result = true;
11023 } 11040 }
11024 } 11041 }
11025 return null; 11042 return null;
11026 } 11043 }
11027 } 11044 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/summary/summarize_elements.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698