| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.task.dart; | 5 library analyzer.src.task.dart; |
| 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/standard_resolution_map.dart'; | 10 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; |
| (...skipping 3137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3148 | 3148 |
| 3149 @override | 3149 @override |
| 3150 void internalPerform() { | 3150 void internalPerform() { |
| 3151 // | 3151 // |
| 3152 // Prepare inputs. | 3152 // Prepare inputs. |
| 3153 // | 3153 // |
| 3154 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 3154 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
| 3155 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); | 3155 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
| 3156 | 3156 |
| 3157 // | 3157 // |
| 3158 // Prepare fields for which inference should be disabled. | |
| 3159 // | |
| 3160 Set<FieldElement> fieldsWithDisabledInference = new Set<FieldElement>(); | |
| 3161 for (CompilationUnitMember classDeclaration in unit.declarations) { | |
| 3162 if (classDeclaration is ClassDeclaration) { | |
| 3163 for (ClassMember fieldDeclaration in classDeclaration.members) { | |
| 3164 if (fieldDeclaration is FieldDeclaration) { | |
| 3165 if (!fieldDeclaration.isStatic) { | |
| 3166 for (VariableDeclaration field | |
| 3167 in fieldDeclaration.fields.variables) { | |
| 3168 Expression initializer = field.initializer; | |
| 3169 if (initializer != null && | |
| 3170 !isValidForTypeInference(initializer)) { | |
| 3171 fieldsWithDisabledInference.add(field.element); | |
| 3172 } | |
| 3173 } | |
| 3174 } | |
| 3175 } | |
| 3176 } | |
| 3177 } | |
| 3178 } | |
| 3179 | |
| 3180 // | |
| 3181 // Infer instance members. | 3158 // Infer instance members. |
| 3182 // | 3159 // |
| 3183 if (context.analysisOptions.strongMode) { | 3160 if (context.analysisOptions.strongMode) { |
| 3184 var inheritanceManager = new InheritanceManager( | 3161 var inheritanceManager = new InheritanceManager( |
| 3185 resolutionMap.elementDeclaredByCompilationUnit(unit).library); | 3162 resolutionMap.elementDeclaredByCompilationUnit(unit).library); |
| 3186 InstanceMemberInferrer inferrer = new InstanceMemberInferrer( | 3163 InstanceMemberInferrer inferrer = new InstanceMemberInferrer( |
| 3187 typeProvider, (_) => inheritanceManager, fieldsWithDisabledInference, | 3164 typeProvider, (_) => inheritanceManager, |
| 3188 typeSystem: context.typeSystem); | 3165 typeSystem: context.typeSystem); |
| 3189 inferrer.inferCompilationUnit(unit.element); | 3166 inferrer.inferCompilationUnit(unit.element); |
| 3190 } | 3167 } |
| 3191 // | 3168 // |
| 3192 // Record outputs. | 3169 // Record outputs. |
| 3193 // | 3170 // |
| 3194 outputs[RESOLVED_UNIT10] = unit; | 3171 outputs[RESOLVED_UNIT10] = unit; |
| 3195 outputs[CREATED_RESOLVED_UNIT10] = true; | 3172 outputs[CREATED_RESOLVED_UNIT10] = true; |
| 3196 } | 3173 } |
| 3197 | 3174 |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3439 List<AnalysisError> errors = AnalysisError.NO_ERRORS; | 3416 List<AnalysisError> errors = AnalysisError.NO_ERRORS; |
| 3440 if (dependencyCycle == null && variable.hasImplicitType) { | 3417 if (dependencyCycle == null && variable.hasImplicitType) { |
| 3441 VariableDeclaration declaration = getDeclaration(unit); | 3418 VariableDeclaration declaration = getDeclaration(unit); |
| 3442 // | 3419 // |
| 3443 // Re-resolve the variable's initializer so that the inferred types | 3420 // Re-resolve the variable's initializer so that the inferred types |
| 3444 // of other variables will be propagated. | 3421 // of other variables will be propagated. |
| 3445 // | 3422 // |
| 3446 RecordingErrorListener errorListener = new RecordingErrorListener(); | 3423 RecordingErrorListener errorListener = new RecordingErrorListener(); |
| 3447 Expression initializer = declaration.initializer; | 3424 Expression initializer = declaration.initializer; |
| 3448 | 3425 |
| 3449 DartType newType; | 3426 ResolutionContext resolutionContext = |
| 3450 if (!isValidForTypeInference(initializer)) { | 3427 ResolutionContextBuilder.contextFor(initializer); |
| 3428 ResolverVisitor visitor = new ResolverVisitor( |
| 3429 variable.library, variable.source, typeProvider, errorListener, |
| 3430 nameScope: resolutionContext.scope); |
| 3431 if (resolutionContext.enclosingClassDeclaration != null) { |
| 3432 visitor.prepareToResolveMembersInClass( |
| 3433 resolutionContext.enclosingClassDeclaration); |
| 3434 } |
| 3435 visitor.initForIncrementalResolution(); |
| 3436 initializer.accept(visitor); |
| 3437 DartType newType = initializer.staticType; |
| 3438 if (newType == null || newType.isBottom || newType.isDartCoreNull) { |
| 3451 newType = typeProvider.dynamicType; | 3439 newType = typeProvider.dynamicType; |
| 3452 } else { | |
| 3453 ResolutionContext resolutionContext = | |
| 3454 ResolutionContextBuilder.contextFor(initializer); | |
| 3455 ResolverVisitor visitor = new ResolverVisitor( | |
| 3456 variable.library, variable.source, typeProvider, errorListener, | |
| 3457 nameScope: resolutionContext.scope); | |
| 3458 if (resolutionContext.enclosingClassDeclaration != null) { | |
| 3459 visitor.prepareToResolveMembersInClass( | |
| 3460 resolutionContext.enclosingClassDeclaration); | |
| 3461 } | |
| 3462 visitor.initForIncrementalResolution(); | |
| 3463 initializer.accept(visitor); | |
| 3464 newType = initializer.staticType; | |
| 3465 if (newType == null || newType.isBottom || newType.isDartCoreNull) { | |
| 3466 newType = typeProvider.dynamicType; | |
| 3467 } | |
| 3468 } | 3440 } |
| 3469 | 3441 |
| 3470 // | 3442 // |
| 3471 // Record the type of the variable. | 3443 // Record the type of the variable. |
| 3472 // | 3444 // |
| 3473 setFieldType(variable, newType); | 3445 setFieldType(variable, newType); |
| 3474 errors = getUniqueErrors(errorListener.errors); | 3446 errors = getUniqueErrors(errorListener.errors); |
| 3475 } else { | 3447 } else { |
| 3476 // TODO(brianwilkerson) For now we simply don't infer any type for | 3448 // TODO(brianwilkerson) For now we simply don't infer any type for |
| 3477 // variables or fields involved in a cycle. We could try to be smarter | 3449 // variables or fields involved in a cycle. We could try to be smarter |
| (...skipping 2390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5868 | 5840 |
| 5869 @override | 5841 @override |
| 5870 bool moveNext() { | 5842 bool moveNext() { |
| 5871 if (_newSources.isEmpty) { | 5843 if (_newSources.isEmpty) { |
| 5872 return false; | 5844 return false; |
| 5873 } | 5845 } |
| 5874 currentTarget = _newSources.removeLast(); | 5846 currentTarget = _newSources.removeLast(); |
| 5875 return true; | 5847 return true; |
| 5876 } | 5848 } |
| 5877 } | 5849 } |
| OLD | NEW |