OLD | NEW |
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 engine.resolver; | 5 library analyzer.src.generated.resolver; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
9 import '../task/strong/info.dart' show InferredType, StaticInfo; | 9 import 'package:analyzer/src/generated/ast.dart'; |
10 import 'ast.dart'; | 10 import 'package:analyzer/src/generated/constant.dart'; |
11 import 'constant.dart'; | 11 import 'package:analyzer/src/generated/element.dart'; |
12 import 'element.dart'; | 12 import 'package:analyzer/src/generated/element_resolver.dart'; |
13 import 'element_resolver.dart'; | 13 import 'package:analyzer/src/generated/engine.dart'; |
14 import 'engine.dart'; | 14 import 'package:analyzer/src/generated/error.dart'; |
15 import 'error.dart'; | 15 import 'package:analyzer/src/generated/error_verifier.dart'; |
16 import 'error_verifier.dart'; | 16 import 'package:analyzer/src/generated/java_core.dart'; |
17 import 'java_core.dart'; | 17 import 'package:analyzer/src/generated/java_engine.dart'; |
18 import 'java_engine.dart'; | 18 import 'package:analyzer/src/generated/scanner.dart'; |
19 import 'scanner.dart'; | 19 import 'package:analyzer/src/generated/source.dart'; |
20 import 'scanner.dart' as sc; | 20 import 'package:analyzer/src/generated/static_type_analyzer.dart'; |
21 import 'source.dart'; | 21 import 'package:analyzer/src/generated/type_system.dart'; |
22 import 'static_type_analyzer.dart'; | 22 import 'package:analyzer/src/generated/utilities_dart.dart'; |
23 import 'type_system.dart'; | 23 import 'package:analyzer/src/task/strong/info.dart' show InferredType, StaticInf
o; |
24 import 'utilities_dart.dart'; | |
25 | 24 |
26 export 'type_system.dart'; | 25 export 'package:analyzer/src/generated/type_system.dart'; |
27 | 26 |
28 /** | 27 /** |
29 * Instances of the class `BestPracticesVerifier` traverse an AST structure look
ing for | 28 * Instances of the class `BestPracticesVerifier` traverse an AST structure look
ing for |
30 * violations of Dart best practices. | 29 * violations of Dart best practices. |
31 */ | 30 */ |
32 class BestPracticesVerifier extends RecursiveAstVisitor<Object> { | 31 class BestPracticesVerifier extends RecursiveAstVisitor<Object> { |
33 // static String _HASHCODE_GETTER_NAME = "hashCode"; | 32 // static String _HASHCODE_GETTER_NAME = "hashCode"; |
34 | 33 |
35 static String _NULL_TYPE_NAME = "Null"; | 34 static String _NULL_TYPE_NAME = "Null"; |
36 | 35 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 } | 80 } |
82 | 81 |
83 @override | 82 @override |
84 Object visitAssertStatement(AssertStatement node) { | 83 Object visitAssertStatement(AssertStatement node) { |
85 _checkForPossibleNullCondition(node.condition); | 84 _checkForPossibleNullCondition(node.condition); |
86 return super.visitAssertStatement(node); | 85 return super.visitAssertStatement(node); |
87 } | 86 } |
88 | 87 |
89 @override | 88 @override |
90 Object visitAssignmentExpression(AssignmentExpression node) { | 89 Object visitAssignmentExpression(AssignmentExpression node) { |
91 sc.TokenType operatorType = node.operator.type; | 90 TokenType operatorType = node.operator.type; |
92 if (operatorType == sc.TokenType.EQ) { | 91 if (operatorType == TokenType.EQ) { |
93 _checkForUseOfVoidResult(node.rightHandSide); | 92 _checkForUseOfVoidResult(node.rightHandSide); |
94 _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide); | 93 _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide); |
95 } else { | 94 } else { |
96 _checkForDeprecatedMemberUse(node.bestElement, node); | 95 _checkForDeprecatedMemberUse(node.bestElement, node); |
97 } | 96 } |
98 return super.visitAssignmentExpression(node); | 97 return super.visitAssignmentExpression(node); |
99 } | 98 } |
100 | 99 |
101 @override | 100 @override |
102 Object visitBinaryExpression(BinaryExpression node) { | 101 Object visitBinaryExpression(BinaryExpression node) { |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 bool _checkAllTypeChecks(IsExpression node) { | 261 bool _checkAllTypeChecks(IsExpression node) { |
263 Expression expression = node.expression; | 262 Expression expression = node.expression; |
264 TypeName typeName = node.type; | 263 TypeName typeName = node.type; |
265 DartType lhsType = expression.staticType; | 264 DartType lhsType = expression.staticType; |
266 DartType rhsType = typeName.type; | 265 DartType rhsType = typeName.type; |
267 if (lhsType == null || rhsType == null) { | 266 if (lhsType == null || rhsType == null) { |
268 return false; | 267 return false; |
269 } | 268 } |
270 String rhsNameStr = typeName.name.name; | 269 String rhsNameStr = typeName.name.name; |
271 // if x is dynamic | 270 // if x is dynamic |
272 if (rhsType.isDynamic && rhsNameStr == sc.Keyword.DYNAMIC.syntax) { | 271 if (rhsType.isDynamic && rhsNameStr == Keyword.DYNAMIC.syntax) { |
273 if (node.notOperator == null) { | 272 if (node.notOperator == null) { |
274 // the is case | 273 // the is case |
275 _errorReporter.reportErrorForNode( | 274 _errorReporter.reportErrorForNode( |
276 HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node); | 275 HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node); |
277 } else { | 276 } else { |
278 // the is not case | 277 // the is not case |
279 _errorReporter.reportErrorForNode( | 278 _errorReporter.reportErrorForNode( |
280 HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node); | 279 HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node); |
281 } | 280 } |
282 return true; | 281 return true; |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 | 521 |
523 /** | 522 /** |
524 * Check for the passed binary expression for the [HintCode.DIVISION_OPTIMIZAT
ION]. | 523 * Check for the passed binary expression for the [HintCode.DIVISION_OPTIMIZAT
ION]. |
525 * | 524 * |
526 * @param node the binary expression to check | 525 * @param node the binary expression to check |
527 * @return `true` if and only if a hint code is generated on the passed node | 526 * @return `true` if and only if a hint code is generated on the passed node |
528 * See [HintCode.DIVISION_OPTIMIZATION]. | 527 * See [HintCode.DIVISION_OPTIMIZATION]. |
529 */ | 528 */ |
530 bool _checkForDivisionOptimizationHint(BinaryExpression node) { | 529 bool _checkForDivisionOptimizationHint(BinaryExpression node) { |
531 // Return if the operator is not '/' | 530 // Return if the operator is not '/' |
532 if (node.operator.type != sc.TokenType.SLASH) { | 531 if (node.operator.type != TokenType.SLASH) { |
533 return false; | 532 return false; |
534 } | 533 } |
535 // Return if the '/' operator is not defined in core, or if we don't know | 534 // Return if the '/' operator is not defined in core, or if we don't know |
536 // its static or propagated type | 535 // its static or propagated type |
537 MethodElement methodElement = node.bestElement; | 536 MethodElement methodElement = node.bestElement; |
538 if (methodElement == null) { | 537 if (methodElement == null) { |
539 return false; | 538 return false; |
540 } | 539 } |
541 LibraryElement libraryElement = methodElement.library; | 540 LibraryElement libraryElement = methodElement.library; |
542 if (libraryElement != null && !libraryElement.isDartCore) { | 541 if (libraryElement != null && !libraryElement.isDartCore) { |
(...skipping 1121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1664 * Create a new instance of the [DeadCodeVerifier]. | 1663 * Create a new instance of the [DeadCodeVerifier]. |
1665 * | 1664 * |
1666 * @param errorReporter the error reporter | 1665 * @param errorReporter the error reporter |
1667 */ | 1666 */ |
1668 DeadCodeVerifier(this._errorReporter, {TypeSystem typeSystem}) | 1667 DeadCodeVerifier(this._errorReporter, {TypeSystem typeSystem}) |
1669 : this._typeSystem = | 1668 : this._typeSystem = |
1670 (typeSystem != null) ? typeSystem : new TypeSystemImpl(); | 1669 (typeSystem != null) ? typeSystem : new TypeSystemImpl(); |
1671 | 1670 |
1672 @override | 1671 @override |
1673 Object visitBinaryExpression(BinaryExpression node) { | 1672 Object visitBinaryExpression(BinaryExpression node) { |
1674 sc.Token operator = node.operator; | 1673 Token operator = node.operator; |
1675 bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND; | 1674 bool isAmpAmp = operator.type == TokenType.AMPERSAND_AMPERSAND; |
1676 bool isBarBar = operator.type == sc.TokenType.BAR_BAR; | 1675 bool isBarBar = operator.type == TokenType.BAR_BAR; |
1677 if (isAmpAmp || isBarBar) { | 1676 if (isAmpAmp || isBarBar) { |
1678 Expression lhsCondition = node.leftOperand; | 1677 Expression lhsCondition = node.leftOperand; |
1679 if (!_isDebugConstant(lhsCondition)) { | 1678 if (!_isDebugConstant(lhsCondition)) { |
1680 EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition); | 1679 EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition); |
1681 if (lhsResult != null) { | 1680 if (lhsResult != null) { |
1682 if (lhsResult.value.toBoolValue() == true && isBarBar) { | 1681 if (lhsResult.value.toBoolValue() == true && isBarBar) { |
1683 // report error on else block: true || !e! | 1682 // report error on else block: true || !e! |
1684 _errorReporter.reportErrorForNode( | 1683 _errorReporter.reportErrorForNode( |
1685 HintCode.DEAD_CODE, node.rightOperand); | 1684 HintCode.DEAD_CODE, node.rightOperand); |
1686 // only visit the LHS: | 1685 // only visit the LHS: |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2161 } else { | 2160 } else { |
2162 return super.visitFieldFormalParameter(node); | 2161 return super.visitFieldFormalParameter(node); |
2163 } | 2162 } |
2164 } | 2163 } |
2165 | 2164 |
2166 @override | 2165 @override |
2167 Object visitFunctionDeclaration(FunctionDeclaration node) { | 2166 Object visitFunctionDeclaration(FunctionDeclaration node) { |
2168 ExecutableElement outerExecutable = _enclosingExecutable; | 2167 ExecutableElement outerExecutable = _enclosingExecutable; |
2169 try { | 2168 try { |
2170 SimpleIdentifier functionName = node.name; | 2169 SimpleIdentifier functionName = node.name; |
2171 sc.Token property = node.propertyKeyword; | 2170 Token property = node.propertyKeyword; |
2172 if (property == null) { | 2171 if (property == null) { |
2173 if (_enclosingExecutable != null) { | 2172 if (_enclosingExecutable != null) { |
2174 _enclosingExecutable = | 2173 _enclosingExecutable = |
2175 _findIdentifier(_enclosingExecutable.functions, functionName); | 2174 _findIdentifier(_enclosingExecutable.functions, functionName); |
2176 } else { | 2175 } else { |
2177 _enclosingExecutable = | 2176 _enclosingExecutable = |
2178 _findIdentifier(_enclosingUnit.functions, functionName); | 2177 _findIdentifier(_enclosingUnit.functions, functionName); |
2179 } | 2178 } |
2180 } else { | 2179 } else { |
2181 if (_enclosingExecutable != null) { | 2180 if (_enclosingExecutable != null) { |
2182 _enclosingExecutable = | 2181 _enclosingExecutable = |
2183 _findIdentifier(_enclosingExecutable.functions, functionName); | 2182 _findIdentifier(_enclosingExecutable.functions, functionName); |
2184 } else { | 2183 } else { |
2185 PropertyAccessorElement accessor = | 2184 PropertyAccessorElement accessor = |
2186 _findIdentifier(_enclosingUnit.accessors, functionName); | 2185 _findIdentifier(_enclosingUnit.accessors, functionName); |
2187 if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) { | 2186 if ((property as KeywordToken).keyword == Keyword.SET) { |
2188 accessor = accessor.variable.setter; | 2187 accessor = accessor.variable.setter; |
2189 functionName.staticElement = accessor; | 2188 functionName.staticElement = accessor; |
2190 } | 2189 } |
2191 _enclosingExecutable = accessor; | 2190 _enclosingExecutable = accessor; |
2192 } | 2191 } |
2193 } | 2192 } |
2194 node.functionExpression.element = _enclosingExecutable; | 2193 node.functionExpression.element = _enclosingExecutable; |
2195 return super.visitFunctionDeclaration(node); | 2194 return super.visitFunctionDeclaration(node); |
2196 } finally { | 2195 } finally { |
2197 _enclosingExecutable = outerExecutable; | 2196 _enclosingExecutable = outerExecutable; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2271 @override | 2270 @override |
2272 Object visitLibraryDirective(LibraryDirective node) { | 2271 Object visitLibraryDirective(LibraryDirective node) { |
2273 node.element = _enclosingUnit.library; | 2272 node.element = _enclosingUnit.library; |
2274 return super.visitLibraryDirective(node); | 2273 return super.visitLibraryDirective(node); |
2275 } | 2274 } |
2276 | 2275 |
2277 @override | 2276 @override |
2278 Object visitMethodDeclaration(MethodDeclaration node) { | 2277 Object visitMethodDeclaration(MethodDeclaration node) { |
2279 ExecutableElement outerExecutable = _enclosingExecutable; | 2278 ExecutableElement outerExecutable = _enclosingExecutable; |
2280 try { | 2279 try { |
2281 sc.Token property = node.propertyKeyword; | 2280 Token property = node.propertyKeyword; |
2282 SimpleIdentifier methodName = node.name; | 2281 SimpleIdentifier methodName = node.name; |
2283 String nameOfMethod = methodName.name; | 2282 String nameOfMethod = methodName.name; |
2284 if (property == null) { | 2283 if (property == null) { |
2285 _enclosingExecutable = _findWithNameAndOffset( | 2284 _enclosingExecutable = _findWithNameAndOffset( |
2286 _enclosingClass.methods, nameOfMethod, methodName.offset); | 2285 _enclosingClass.methods, nameOfMethod, methodName.offset); |
2287 methodName.staticElement = _enclosingExecutable; | 2286 methodName.staticElement = _enclosingExecutable; |
2288 } else { | 2287 } else { |
2289 PropertyAccessorElement accessor = | 2288 PropertyAccessorElement accessor = |
2290 _findIdentifier(_enclosingClass.accessors, methodName); | 2289 _findIdentifier(_enclosingClass.accessors, methodName); |
2291 if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) { | 2290 if ((property as KeywordToken).keyword == Keyword.SET) { |
2292 accessor = accessor.variable.setter; | 2291 accessor = accessor.variable.setter; |
2293 methodName.staticElement = accessor; | 2292 methodName.staticElement = accessor; |
2294 } | 2293 } |
2295 _enclosingExecutable = accessor; | 2294 _enclosingExecutable = accessor; |
2296 } | 2295 } |
2297 return super.visitMethodDeclaration(node); | 2296 return super.visitMethodDeclaration(node); |
2298 } finally { | 2297 } finally { |
2299 _enclosingExecutable = outerExecutable; | 2298 _enclosingExecutable = outerExecutable; |
2300 } | 2299 } |
2301 } | 2300 } |
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2911 if (expression != null) { | 2910 if (expression != null) { |
2912 ElementHolder holder = new ElementHolder(); | 2911 ElementHolder holder = new ElementHolder(); |
2913 bool wasInFunction = _inFunction; | 2912 bool wasInFunction = _inFunction; |
2914 _inFunction = true; | 2913 _inFunction = true; |
2915 try { | 2914 try { |
2916 _visitChildren(holder, node); | 2915 _visitChildren(holder, node); |
2917 } finally { | 2916 } finally { |
2918 _inFunction = wasInFunction; | 2917 _inFunction = wasInFunction; |
2919 } | 2918 } |
2920 FunctionBody body = expression.body; | 2919 FunctionBody body = expression.body; |
2921 sc.Token property = node.propertyKeyword; | 2920 Token property = node.propertyKeyword; |
2922 if (property == null || _inFunction) { | 2921 if (property == null || _inFunction) { |
2923 SimpleIdentifier functionName = node.name; | 2922 SimpleIdentifier functionName = node.name; |
2924 FunctionElementImpl element = | 2923 FunctionElementImpl element = |
2925 new FunctionElementImpl.forNode(functionName); | 2924 new FunctionElementImpl.forNode(functionName); |
2926 _setDocRange(element, node); | 2925 _setDocRange(element, node); |
2927 if (node.externalKeyword != null) { | 2926 if (node.externalKeyword != null) { |
2928 element.external = true; | 2927 element.external = true; |
2929 } | 2928 } |
2930 element.functions = holder.functions; | 2929 element.functions = holder.functions; |
2931 element.labels = holder.labels; | 2930 element.labels = holder.labels; |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3140 try { | 3139 try { |
3141 ElementHolder holder = new ElementHolder(); | 3140 ElementHolder holder = new ElementHolder(); |
3142 bool wasInFunction = _inFunction; | 3141 bool wasInFunction = _inFunction; |
3143 _inFunction = true; | 3142 _inFunction = true; |
3144 try { | 3143 try { |
3145 _visitChildren(holder, node); | 3144 _visitChildren(holder, node); |
3146 } finally { | 3145 } finally { |
3147 _inFunction = wasInFunction; | 3146 _inFunction = wasInFunction; |
3148 } | 3147 } |
3149 bool isStatic = node.isStatic; | 3148 bool isStatic = node.isStatic; |
3150 sc.Token property = node.propertyKeyword; | 3149 Token property = node.propertyKeyword; |
3151 FunctionBody body = node.body; | 3150 FunctionBody body = node.body; |
3152 if (property == null) { | 3151 if (property == null) { |
3153 SimpleIdentifier methodName = node.name; | 3152 SimpleIdentifier methodName = node.name; |
3154 String nameOfMethod = methodName.name; | 3153 String nameOfMethod = methodName.name; |
3155 if (nameOfMethod == sc.TokenType.MINUS.lexeme && | 3154 if (nameOfMethod == TokenType.MINUS.lexeme && |
3156 node.parameters.parameters.length == 0) { | 3155 node.parameters.parameters.length == 0) { |
3157 nameOfMethod = "unary-"; | 3156 nameOfMethod = "unary-"; |
3158 } | 3157 } |
3159 MethodElementImpl element = | 3158 MethodElementImpl element = |
3160 new MethodElementImpl(nameOfMethod, methodName.offset); | 3159 new MethodElementImpl(nameOfMethod, methodName.offset); |
3161 _setDocRange(element, node); | 3160 _setDocRange(element, node); |
3162 element.abstract = node.isAbstract; | 3161 element.abstract = node.isAbstract; |
3163 if (node.externalKeyword != null) { | 3162 if (node.externalKeyword != null) { |
3164 element.external = true; | 3163 element.external = true; |
3165 } | 3164 } |
(...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4146 | 4145 |
4147 @override | 4146 @override |
4148 bool visitAssertStatement(AssertStatement node) => false; | 4147 bool visitAssertStatement(AssertStatement node) => false; |
4149 | 4148 |
4150 @override | 4149 @override |
4151 bool visitAssignmentExpression(AssignmentExpression node) { | 4150 bool visitAssignmentExpression(AssignmentExpression node) { |
4152 Expression leftHandSide = node.leftHandSide; | 4151 Expression leftHandSide = node.leftHandSide; |
4153 if (_nodeExits(leftHandSide)) { | 4152 if (_nodeExits(leftHandSide)) { |
4154 return true; | 4153 return true; |
4155 } | 4154 } |
4156 if (node.operator.type == sc.TokenType.QUESTION_QUESTION_EQ) { | 4155 if (node.operator.type == TokenType.QUESTION_QUESTION_EQ) { |
4157 return false; | 4156 return false; |
4158 } | 4157 } |
4159 if (leftHandSide is PropertyAccess && | 4158 if (leftHandSide is PropertyAccess && |
4160 leftHandSide.operator.type == sc.TokenType.QUESTION_PERIOD) { | 4159 leftHandSide.operator.type == TokenType.QUESTION_PERIOD) { |
4161 return false; | 4160 return false; |
4162 } | 4161 } |
4163 return _nodeExits(node.rightHandSide); | 4162 return _nodeExits(node.rightHandSide); |
4164 } | 4163 } |
4165 | 4164 |
4166 @override | 4165 @override |
4167 bool visitAwaitExpression(AwaitExpression node) => | 4166 bool visitAwaitExpression(AwaitExpression node) => |
4168 _nodeExits(node.expression); | 4167 _nodeExits(node.expression); |
4169 | 4168 |
4170 @override | 4169 @override |
4171 bool visitBinaryExpression(BinaryExpression node) { | 4170 bool visitBinaryExpression(BinaryExpression node) { |
4172 Expression lhsExpression = node.leftOperand; | 4171 Expression lhsExpression = node.leftOperand; |
4173 Expression rhsExpression = node.rightOperand; | 4172 Expression rhsExpression = node.rightOperand; |
4174 sc.TokenType operatorType = node.operator.type; | 4173 TokenType operatorType = node.operator.type; |
4175 // If the operator is ||, then only consider the RHS of the binary | 4174 // If the operator is ||, then only consider the RHS of the binary |
4176 // expression if the left hand side is the false literal. | 4175 // expression if the left hand side is the false literal. |
4177 // TODO(jwren) Do we want to take constant expressions into account, | 4176 // TODO(jwren) Do we want to take constant expressions into account, |
4178 // evaluate if(false) {} differently than if(<condition>), when <condition> | 4177 // evaluate if(false) {} differently than if(<condition>), when <condition> |
4179 // evaluates to a constant false value? | 4178 // evaluates to a constant false value? |
4180 if (operatorType == sc.TokenType.BAR_BAR) { | 4179 if (operatorType == TokenType.BAR_BAR) { |
4181 if (lhsExpression is BooleanLiteral) { | 4180 if (lhsExpression is BooleanLiteral) { |
4182 BooleanLiteral booleanLiteral = lhsExpression; | 4181 BooleanLiteral booleanLiteral = lhsExpression; |
4183 if (!booleanLiteral.value) { | 4182 if (!booleanLiteral.value) { |
4184 return _nodeExits(rhsExpression); | 4183 return _nodeExits(rhsExpression); |
4185 } | 4184 } |
4186 } | 4185 } |
4187 return _nodeExits(lhsExpression); | 4186 return _nodeExits(lhsExpression); |
4188 } | 4187 } |
4189 // If the operator is &&, then only consider the RHS of the binary | 4188 // If the operator is &&, then only consider the RHS of the binary |
4190 // expression if the left hand side is the true literal. | 4189 // expression if the left hand side is the true literal. |
4191 if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) { | 4190 if (operatorType == TokenType.AMPERSAND_AMPERSAND) { |
4192 if (lhsExpression is BooleanLiteral) { | 4191 if (lhsExpression is BooleanLiteral) { |
4193 BooleanLiteral booleanLiteral = lhsExpression; | 4192 BooleanLiteral booleanLiteral = lhsExpression; |
4194 if (booleanLiteral.value) { | 4193 if (booleanLiteral.value) { |
4195 return _nodeExits(rhsExpression); | 4194 return _nodeExits(rhsExpression); |
4196 } | 4195 } |
4197 } | 4196 } |
4198 return _nodeExits(lhsExpression); | 4197 return _nodeExits(lhsExpression); |
4199 } | 4198 } |
4200 // If the operator is ??, then don't consider the RHS of the binary | 4199 // If the operator is ??, then don't consider the RHS of the binary |
4201 // expression. | 4200 // expression. |
4202 if (operatorType == sc.TokenType.QUESTION_QUESTION) { | 4201 if (operatorType == TokenType.QUESTION_QUESTION) { |
4203 return _nodeExits(lhsExpression); | 4202 return _nodeExits(lhsExpression); |
4204 } | 4203 } |
4205 return _nodeExits(lhsExpression) || _nodeExits(rhsExpression); | 4204 return _nodeExits(lhsExpression) || _nodeExits(rhsExpression); |
4206 } | 4205 } |
4207 | 4206 |
4208 @override | 4207 @override |
4209 bool visitBlock(Block node) => _visitStatements(node.statements); | 4208 bool visitBlock(Block node) => _visitStatements(node.statements); |
4210 | 4209 |
4211 @override | 4210 @override |
4212 bool visitBlockFunctionBody(BlockFunctionBody node) => _nodeExits(node.block); | 4211 bool visitBlockFunctionBody(BlockFunctionBody node) => _nodeExits(node.block); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4393 @override | 4392 @override |
4394 bool visitLiteral(Literal node) => false; | 4393 bool visitLiteral(Literal node) => false; |
4395 | 4394 |
4396 @override | 4395 @override |
4397 bool visitMethodInvocation(MethodInvocation node) { | 4396 bool visitMethodInvocation(MethodInvocation node) { |
4398 Expression target = node.realTarget; | 4397 Expression target = node.realTarget; |
4399 if (target != null) { | 4398 if (target != null) { |
4400 if (target.accept(this)) { | 4399 if (target.accept(this)) { |
4401 return true; | 4400 return true; |
4402 } | 4401 } |
4403 if (node.operator.type == sc.TokenType.QUESTION_PERIOD) { | 4402 if (node.operator.type == TokenType.QUESTION_PERIOD) { |
4404 return false; | 4403 return false; |
4405 } | 4404 } |
4406 } | 4405 } |
4407 return _nodeExits(node.argumentList); | 4406 return _nodeExits(node.argumentList); |
4408 } | 4407 } |
4409 | 4408 |
4410 @override | 4409 @override |
4411 bool visitNamedExpression(NamedExpression node) => | 4410 bool visitNamedExpression(NamedExpression node) => |
4412 node.expression.accept(this); | 4411 node.expression.accept(this); |
4413 | 4412 |
(...skipping 2070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6484 * @return the created synthetic element | 6483 * @return the created synthetic element |
6485 */ | 6484 */ |
6486 static ExecutableElement _createSyntheticExecutableElement( | 6485 static ExecutableElement _createSyntheticExecutableElement( |
6487 List<ExecutableElement> elementArrayToMerge, | 6486 List<ExecutableElement> elementArrayToMerge, |
6488 String name, | 6487 String name, |
6489 int numOfRequiredParameters, | 6488 int numOfRequiredParameters, |
6490 int numOfPositionalParameters, | 6489 int numOfPositionalParameters, |
6491 List<String> namedParameters) { | 6490 List<String> namedParameters) { |
6492 DynamicTypeImpl dynamicType = DynamicTypeImpl.instance; | 6491 DynamicTypeImpl dynamicType = DynamicTypeImpl.instance; |
6493 SimpleIdentifier nameIdentifier = new SimpleIdentifier( | 6492 SimpleIdentifier nameIdentifier = new SimpleIdentifier( |
6494 new sc.StringToken(sc.TokenType.IDENTIFIER, name, 0)); | 6493 new StringToken(TokenType.IDENTIFIER, name, 0)); |
6495 ExecutableElementImpl executable; | 6494 ExecutableElementImpl executable; |
6496 if (elementArrayToMerge[0] is MethodElement) { | 6495 if (elementArrayToMerge[0] is MethodElement) { |
6497 MultiplyInheritedMethodElementImpl unionedMethod = | 6496 MultiplyInheritedMethodElementImpl unionedMethod = |
6498 new MultiplyInheritedMethodElementImpl(nameIdentifier); | 6497 new MultiplyInheritedMethodElementImpl(nameIdentifier); |
6499 unionedMethod.inheritedElements = elementArrayToMerge; | 6498 unionedMethod.inheritedElements = elementArrayToMerge; |
6500 executable = unionedMethod; | 6499 executable = unionedMethod; |
6501 } else { | 6500 } else { |
6502 MultiplyInheritedPropertyAccessorElementImpl unionedPropertyAccessor = | 6501 MultiplyInheritedPropertyAccessorElementImpl unionedPropertyAccessor = |
6503 new MultiplyInheritedPropertyAccessorElementImpl(nameIdentifier); | 6502 new MultiplyInheritedPropertyAccessorElementImpl(nameIdentifier); |
6504 unionedPropertyAccessor.getter = | 6503 unionedPropertyAccessor.getter = |
(...skipping 1800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8305 @override | 8304 @override |
8306 Object visitAssertStatement(AssertStatement node) { | 8305 Object visitAssertStatement(AssertStatement node) { |
8307 super.visitAssertStatement(node); | 8306 super.visitAssertStatement(node); |
8308 _propagateTrueState(node.condition); | 8307 _propagateTrueState(node.condition); |
8309 return null; | 8308 return null; |
8310 } | 8309 } |
8311 | 8310 |
8312 @override | 8311 @override |
8313 Object visitAssignmentExpression(AssignmentExpression node) { | 8312 Object visitAssignmentExpression(AssignmentExpression node) { |
8314 safelyVisit(node.leftHandSide); | 8313 safelyVisit(node.leftHandSide); |
8315 sc.TokenType operator = node.operator.type; | 8314 TokenType operator = node.operator.type; |
8316 if (operator == sc.TokenType.EQ || | 8315 if (operator == TokenType.EQ || |
8317 operator == sc.TokenType.QUESTION_QUESTION_EQ) { | 8316 operator == TokenType.QUESTION_QUESTION_EQ) { |
8318 InferenceContext.setType( | 8317 InferenceContext.setType( |
8319 node.rightHandSide, node.leftHandSide.staticType); | 8318 node.rightHandSide, node.leftHandSide.staticType); |
8320 } | 8319 } |
8321 safelyVisit(node.rightHandSide); | 8320 safelyVisit(node.rightHandSide); |
8322 node.accept(elementResolver); | 8321 node.accept(elementResolver); |
8323 node.accept(typeAnalyzer); | 8322 node.accept(typeAnalyzer); |
8324 return null; | 8323 return null; |
8325 } | 8324 } |
8326 | 8325 |
8327 @override | 8326 @override |
8328 Object visitAwaitExpression(AwaitExpression node) { | 8327 Object visitAwaitExpression(AwaitExpression node) { |
8329 //TODO(leafp): Handle the implicit union type here | 8328 //TODO(leafp): Handle the implicit union type here |
8330 DartType contextType = InferenceContext.getType(node); | 8329 DartType contextType = InferenceContext.getType(node); |
8331 if (contextType != null) { | 8330 if (contextType != null) { |
8332 InterfaceType futureT = | 8331 InterfaceType futureT = |
8333 typeProvider.futureType.substitute4([contextType]); | 8332 typeProvider.futureType.substitute4([contextType]); |
8334 InferenceContext.setType(node.expression, futureT); | 8333 InferenceContext.setType(node.expression, futureT); |
8335 } | 8334 } |
8336 return super.visitAwaitExpression(node); | 8335 return super.visitAwaitExpression(node); |
8337 } | 8336 } |
8338 | 8337 |
8339 @override | 8338 @override |
8340 Object visitBinaryExpression(BinaryExpression node) { | 8339 Object visitBinaryExpression(BinaryExpression node) { |
8341 sc.TokenType operatorType = node.operator.type; | 8340 TokenType operatorType = node.operator.type; |
8342 Expression leftOperand = node.leftOperand; | 8341 Expression leftOperand = node.leftOperand; |
8343 Expression rightOperand = node.rightOperand; | 8342 Expression rightOperand = node.rightOperand; |
8344 if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) { | 8343 if (operatorType == TokenType.AMPERSAND_AMPERSAND) { |
8345 safelyVisit(leftOperand); | 8344 safelyVisit(leftOperand); |
8346 if (rightOperand != null) { | 8345 if (rightOperand != null) { |
8347 _overrideManager.enterScope(); | 8346 _overrideManager.enterScope(); |
8348 try { | 8347 try { |
8349 _promoteManager.enterScope(); | 8348 _promoteManager.enterScope(); |
8350 try { | 8349 try { |
8351 _propagateTrueState(leftOperand); | 8350 _propagateTrueState(leftOperand); |
8352 // Type promotion. | 8351 // Type promotion. |
8353 _promoteTypes(leftOperand); | 8352 _promoteTypes(leftOperand); |
8354 _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand); | 8353 _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand); |
8355 _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand); | 8354 _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand); |
8356 _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated( | 8355 _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated( |
8357 rightOperand); | 8356 rightOperand); |
8358 // Visit right operand. | 8357 // Visit right operand. |
8359 rightOperand.accept(this); | 8358 rightOperand.accept(this); |
8360 } finally { | 8359 } finally { |
8361 _promoteManager.exitScope(); | 8360 _promoteManager.exitScope(); |
8362 } | 8361 } |
8363 } finally { | 8362 } finally { |
8364 _overrideManager.exitScope(); | 8363 _overrideManager.exitScope(); |
8365 } | 8364 } |
8366 } | 8365 } |
8367 } else if (operatorType == sc.TokenType.BAR_BAR) { | 8366 } else if (operatorType == TokenType.BAR_BAR) { |
8368 safelyVisit(leftOperand); | 8367 safelyVisit(leftOperand); |
8369 if (rightOperand != null) { | 8368 if (rightOperand != null) { |
8370 _overrideManager.enterScope(); | 8369 _overrideManager.enterScope(); |
8371 try { | 8370 try { |
8372 _propagateFalseState(leftOperand); | 8371 _propagateFalseState(leftOperand); |
8373 rightOperand.accept(this); | 8372 rightOperand.accept(this); |
8374 } finally { | 8373 } finally { |
8375 _overrideManager.exitScope(); | 8374 _overrideManager.exitScope(); |
8376 } | 8375 } |
8377 } | 8376 } |
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9600 _promoteManager.setType(element, potentialType); | 9599 _promoteManager.setType(element, potentialType); |
9601 } | 9600 } |
9602 } | 9601 } |
9603 | 9602 |
9604 /** | 9603 /** |
9605 * Promotes type information using given condition. | 9604 * Promotes type information using given condition. |
9606 */ | 9605 */ |
9607 void _promoteTypes(Expression condition) { | 9606 void _promoteTypes(Expression condition) { |
9608 if (condition is BinaryExpression) { | 9607 if (condition is BinaryExpression) { |
9609 BinaryExpression binary = condition; | 9608 BinaryExpression binary = condition; |
9610 if (binary.operator.type == sc.TokenType.AMPERSAND_AMPERSAND) { | 9609 if (binary.operator.type == TokenType.AMPERSAND_AMPERSAND) { |
9611 Expression left = binary.leftOperand; | 9610 Expression left = binary.leftOperand; |
9612 Expression right = binary.rightOperand; | 9611 Expression right = binary.rightOperand; |
9613 _promoteTypes(left); | 9612 _promoteTypes(left); |
9614 _promoteTypes(right); | 9613 _promoteTypes(right); |
9615 _clearTypePromotionsIfPotentiallyMutatedIn(right); | 9614 _clearTypePromotionsIfPotentiallyMutatedIn(right); |
9616 } | 9615 } |
9617 } else if (condition is IsExpression) { | 9616 } else if (condition is IsExpression) { |
9618 IsExpression is2 = condition; | 9617 IsExpression is2 = condition; |
9619 if (is2.notOperator == null) { | 9618 if (is2.notOperator == null) { |
9620 _promote(is2.expression, is2.type.type); | 9619 _promote(is2.expression, is2.type.type); |
9621 } | 9620 } |
9622 } else if (condition is ParenthesizedExpression) { | 9621 } else if (condition is ParenthesizedExpression) { |
9623 _promoteTypes(condition.expression); | 9622 _promoteTypes(condition.expression); |
9624 } | 9623 } |
9625 } | 9624 } |
9626 | 9625 |
9627 /** | 9626 /** |
9628 * Propagate any type information that results from knowing that the given con
dition will have | 9627 * Propagate any type information that results from knowing that the given con
dition will have |
9629 * been evaluated to 'false'. | 9628 * been evaluated to 'false'. |
9630 * | 9629 * |
9631 * @param condition the condition that will have evaluated to 'false' | 9630 * @param condition the condition that will have evaluated to 'false' |
9632 */ | 9631 */ |
9633 void _propagateFalseState(Expression condition) { | 9632 void _propagateFalseState(Expression condition) { |
9634 if (condition is BinaryExpression) { | 9633 if (condition is BinaryExpression) { |
9635 BinaryExpression binary = condition; | 9634 BinaryExpression binary = condition; |
9636 if (binary.operator.type == sc.TokenType.BAR_BAR) { | 9635 if (binary.operator.type == TokenType.BAR_BAR) { |
9637 _propagateFalseState(binary.leftOperand); | 9636 _propagateFalseState(binary.leftOperand); |
9638 _propagateFalseState(binary.rightOperand); | 9637 _propagateFalseState(binary.rightOperand); |
9639 } | 9638 } |
9640 } else if (condition is IsExpression) { | 9639 } else if (condition is IsExpression) { |
9641 IsExpression is2 = condition; | 9640 IsExpression is2 = condition; |
9642 if (is2.notOperator != null) { | 9641 if (is2.notOperator != null) { |
9643 // Since an is-statement doesn't actually change the type, we don't | 9642 // Since an is-statement doesn't actually change the type, we don't |
9644 // let it affect the propagated type when it would result in a loss | 9643 // let it affect the propagated type when it would result in a loss |
9645 // of precision. | 9644 // of precision. |
9646 overrideExpression(is2.expression, is2.type.type, false, false); | 9645 overrideExpression(is2.expression, is2.type.type, false, false); |
9647 } | 9646 } |
9648 } else if (condition is PrefixExpression) { | 9647 } else if (condition is PrefixExpression) { |
9649 PrefixExpression prefix = condition; | 9648 PrefixExpression prefix = condition; |
9650 if (prefix.operator.type == sc.TokenType.BANG) { | 9649 if (prefix.operator.type == TokenType.BANG) { |
9651 _propagateTrueState(prefix.operand); | 9650 _propagateTrueState(prefix.operand); |
9652 } | 9651 } |
9653 } else if (condition is ParenthesizedExpression) { | 9652 } else if (condition is ParenthesizedExpression) { |
9654 _propagateFalseState(condition.expression); | 9653 _propagateFalseState(condition.expression); |
9655 } | 9654 } |
9656 } | 9655 } |
9657 | 9656 |
9658 /** | 9657 /** |
9659 * Propagate any type information that results from knowing that the given exp
ression will have | 9658 * Propagate any type information that results from knowing that the given exp
ression will have |
9660 * been evaluated without altering the flow of execution. | 9659 * been evaluated without altering the flow of execution. |
9661 * | 9660 * |
9662 * @param expression the expression that will have been evaluated | 9661 * @param expression the expression that will have been evaluated |
9663 */ | 9662 */ |
9664 void _propagateState(Expression expression) { | 9663 void _propagateState(Expression expression) { |
9665 // TODO(brianwilkerson) Implement this. | 9664 // TODO(brianwilkerson) Implement this. |
9666 } | 9665 } |
9667 | 9666 |
9668 /** | 9667 /** |
9669 * Propagate any type information that results from knowing that the given con
dition will have | 9668 * Propagate any type information that results from knowing that the given con
dition will have |
9670 * been evaluated to 'true'. | 9669 * been evaluated to 'true'. |
9671 * | 9670 * |
9672 * @param condition the condition that will have evaluated to 'true' | 9671 * @param condition the condition that will have evaluated to 'true' |
9673 */ | 9672 */ |
9674 void _propagateTrueState(Expression condition) { | 9673 void _propagateTrueState(Expression condition) { |
9675 if (condition is BinaryExpression) { | 9674 if (condition is BinaryExpression) { |
9676 BinaryExpression binary = condition; | 9675 BinaryExpression binary = condition; |
9677 if (binary.operator.type == sc.TokenType.AMPERSAND_AMPERSAND) { | 9676 if (binary.operator.type == TokenType.AMPERSAND_AMPERSAND) { |
9678 _propagateTrueState(binary.leftOperand); | 9677 _propagateTrueState(binary.leftOperand); |
9679 _propagateTrueState(binary.rightOperand); | 9678 _propagateTrueState(binary.rightOperand); |
9680 } | 9679 } |
9681 } else if (condition is IsExpression) { | 9680 } else if (condition is IsExpression) { |
9682 IsExpression is2 = condition; | 9681 IsExpression is2 = condition; |
9683 if (is2.notOperator == null) { | 9682 if (is2.notOperator == null) { |
9684 // Since an is-statement doesn't actually change the type, we don't | 9683 // Since an is-statement doesn't actually change the type, we don't |
9685 // let it affect the propagated type when it would result in a loss | 9684 // let it affect the propagated type when it would result in a loss |
9686 // of precision. | 9685 // of precision. |
9687 overrideExpression(is2.expression, is2.type.type, false, false); | 9686 overrideExpression(is2.expression, is2.type.type, false, false); |
9688 } | 9687 } |
9689 } else if (condition is PrefixExpression) { | 9688 } else if (condition is PrefixExpression) { |
9690 PrefixExpression prefix = condition; | 9689 PrefixExpression prefix = condition; |
9691 if (prefix.operator.type == sc.TokenType.BANG) { | 9690 if (prefix.operator.type == TokenType.BANG) { |
9692 _propagateFalseState(prefix.operand); | 9691 _propagateFalseState(prefix.operand); |
9693 } | 9692 } |
9694 } else if (condition is ParenthesizedExpression) { | 9693 } else if (condition is ParenthesizedExpression) { |
9695 _propagateTrueState(condition.expression); | 9694 _propagateTrueState(condition.expression); |
9696 } | 9695 } |
9697 } | 9696 } |
9698 } | 9697 } |
9699 | 9698 |
9700 /** | 9699 /** |
9701 * The abstract class `Scope` defines the behavior common to name scopes used by
the resolver | 9700 * The abstract class `Scope` defines the behavior common to name scopes used by
the resolver |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10017 new AnalysisError(source, offset, length, errorCode, arguments)); | 10016 new AnalysisError(source, offset, length, errorCode, arguments)); |
10018 } | 10017 } |
10019 | 10018 |
10020 /** | 10019 /** |
10021 * Report an error with the given error code and arguments. | 10020 * Report an error with the given error code and arguments. |
10022 * | 10021 * |
10023 * @param errorCode the error code of the error to be reported | 10022 * @param errorCode the error code of the error to be reported |
10024 * @param token the token specifying the location of the error | 10023 * @param token the token specifying the location of the error |
10025 * @param arguments the arguments to the error, used to compose the error mess
age | 10024 * @param arguments the arguments to the error, used to compose the error mess
age |
10026 */ | 10025 */ |
10027 void reportErrorForToken(ErrorCode errorCode, sc.Token token, | 10026 void reportErrorForToken(ErrorCode errorCode, Token token, |
10028 [List<Object> arguments]) { | 10027 [List<Object> arguments]) { |
10029 errorListener.onError(new AnalysisError( | 10028 errorListener.onError(new AnalysisError( |
10030 source, token.offset, token.length, errorCode, arguments)); | 10029 source, token.offset, token.length, errorCode, arguments)); |
10031 } | 10030 } |
10032 | 10031 |
10033 /** | 10032 /** |
10034 * Visit the given AST node if it is not null. | 10033 * Visit the given AST node if it is not null. |
10035 * | 10034 * |
10036 * @param node the node to be visited | 10035 * @param node the node to be visited |
10037 */ | 10036 */ |
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10760 void findIn(CompilationUnit unit) { | 10759 void findIn(CompilationUnit unit) { |
10761 _gatherTodoComments(unit.beginToken); | 10760 _gatherTodoComments(unit.beginToken); |
10762 } | 10761 } |
10763 | 10762 |
10764 /** | 10763 /** |
10765 * Search the comment tokens reachable from the given token and create errors
for each to-do | 10764 * Search the comment tokens reachable from the given token and create errors
for each to-do |
10766 * comment. | 10765 * comment. |
10767 * | 10766 * |
10768 * @param token the head of the list of tokens being searched | 10767 * @param token the head of the list of tokens being searched |
10769 */ | 10768 */ |
10770 void _gatherTodoComments(sc.Token token) { | 10769 void _gatherTodoComments(Token token) { |
10771 while (token != null && token.type != sc.TokenType.EOF) { | 10770 while (token != null && token.type != TokenType.EOF) { |
10772 sc.Token commentToken = token.precedingComments; | 10771 Token commentToken = token.precedingComments; |
10773 while (commentToken != null) { | 10772 while (commentToken != null) { |
10774 if (commentToken.type == sc.TokenType.SINGLE_LINE_COMMENT || | 10773 if (commentToken.type == TokenType.SINGLE_LINE_COMMENT || |
10775 commentToken.type == sc.TokenType.MULTI_LINE_COMMENT) { | 10774 commentToken.type == TokenType.MULTI_LINE_COMMENT) { |
10776 _scrapeTodoComment(commentToken); | 10775 _scrapeTodoComment(commentToken); |
10777 } | 10776 } |
10778 commentToken = commentToken.next; | 10777 commentToken = commentToken.next; |
10779 } | 10778 } |
10780 token = token.next; | 10779 token = token.next; |
10781 } | 10780 } |
10782 } | 10781 } |
10783 | 10782 |
10784 /** | 10783 /** |
10785 * Look for user defined tasks in comments and convert them into info level an
alysis issues. | 10784 * Look for user defined tasks in comments and convert them into info level an
alysis issues. |
10786 * | 10785 * |
10787 * @param commentToken the comment token to analyze | 10786 * @param commentToken the comment token to analyze |
10788 */ | 10787 */ |
10789 void _scrapeTodoComment(sc.Token commentToken) { | 10788 void _scrapeTodoComment(Token commentToken) { |
10790 JavaPatternMatcher matcher = | 10789 JavaPatternMatcher matcher = |
10791 new JavaPatternMatcher(TodoCode.TODO_REGEX, commentToken.lexeme); | 10790 new JavaPatternMatcher(TodoCode.TODO_REGEX, commentToken.lexeme); |
10792 if (matcher.find()) { | 10791 if (matcher.find()) { |
10793 int offset = | 10792 int offset = |
10794 commentToken.offset + matcher.start() + matcher.group(1).length; | 10793 commentToken.offset + matcher.start() + matcher.group(1).length; |
10795 int length = matcher.group(2).length; | 10794 int length = matcher.group(2).length; |
10796 _errorReporter.reportErrorForOffset( | 10795 _errorReporter.reportErrorForOffset( |
10797 TodoCode.TODO, offset, length, [matcher.group(2)]); | 10796 TodoCode.TODO, offset, length, [matcher.group(2)]); |
10798 } | 10797 } |
10799 } | 10798 } |
(...skipping 1854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12654 ClassElement element = type.element; | 12653 ClassElement element = type.element; |
12655 if (element != null && element.isEnum) { | 12654 if (element != null && element.isEnum) { |
12656 reportErrorForNode(enumTypeError, typeName); | 12655 reportErrorForNode(enumTypeError, typeName); |
12657 return null; | 12656 return null; |
12658 } | 12657 } |
12659 return type; | 12658 return type; |
12660 } | 12659 } |
12661 // If the type is not an InterfaceType, then visitTypeName() sets the type | 12660 // If the type is not an InterfaceType, then visitTypeName() sets the type |
12662 // to be a DynamicTypeImpl | 12661 // to be a DynamicTypeImpl |
12663 Identifier name = typeName.name; | 12662 Identifier name = typeName.name; |
12664 if (name.name == sc.Keyword.DYNAMIC.syntax) { | 12663 if (name.name == Keyword.DYNAMIC.syntax) { |
12665 reportErrorForNode(dynamicTypeError, name, [name.name]); | 12664 reportErrorForNode(dynamicTypeError, name, [name.name]); |
12666 } else { | 12665 } else { |
12667 reportErrorForNode(nonTypeError, name, [name.name]); | 12666 reportErrorForNode(nonTypeError, name, [name.name]); |
12668 } | 12667 } |
12669 return null; | 12668 return null; |
12670 } | 12669 } |
12671 | 12670 |
12672 /** | 12671 /** |
12673 * Resolve the types in the given list of type names. | 12672 * Resolve the types in the given list of type names. |
12674 * | 12673 * |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12727 functionElement.shareParameters(parameters); | 12726 functionElement.shareParameters(parameters); |
12728 functionElement.returnType = _computeReturnType(returnType); | 12727 functionElement.returnType = _computeReturnType(returnType); |
12729 functionElement.enclosingElement = element; | 12728 functionElement.enclosingElement = element; |
12730 element.type = new FunctionTypeImpl(functionElement); | 12729 element.type = new FunctionTypeImpl(functionElement); |
12731 } | 12730 } |
12732 | 12731 |
12733 /** | 12732 /** |
12734 * @return `true` if the name of the given [TypeName] is an built-in identifie
r. | 12733 * @return `true` if the name of the given [TypeName] is an built-in identifie
r. |
12735 */ | 12734 */ |
12736 static bool _isBuiltInIdentifier(TypeName node) { | 12735 static bool _isBuiltInIdentifier(TypeName node) { |
12737 sc.Token token = node.name.beginToken; | 12736 Token token = node.name.beginToken; |
12738 return token.type == sc.TokenType.KEYWORD; | 12737 return token.type == TokenType.KEYWORD; |
12739 } | 12738 } |
12740 | 12739 |
12741 /** | 12740 /** |
12742 * @return `true` if given [TypeName] is used as a type annotation. | 12741 * @return `true` if given [TypeName] is used as a type annotation. |
12743 */ | 12742 */ |
12744 static bool _isTypeAnnotation(TypeName node) { | 12743 static bool _isTypeAnnotation(TypeName node) { |
12745 AstNode parent = node.parent; | 12744 AstNode parent = node.parent; |
12746 if (parent is VariableDeclarationList) { | 12745 if (parent is VariableDeclarationList) { |
12747 return identical(parent.type, node); | 12746 return identical(parent.type, node); |
12748 } | 12747 } |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13316 nonFields.add(node); | 13315 nonFields.add(node); |
13317 return null; | 13316 return null; |
13318 } | 13317 } |
13319 | 13318 |
13320 @override | 13319 @override |
13321 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); | 13320 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); |
13322 | 13321 |
13323 @override | 13322 @override |
13324 Object visitWithClause(WithClause node) => null; | 13323 Object visitWithClause(WithClause node) => null; |
13325 } | 13324 } |
OLD | NEW |