| 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 engine.resolver; |
| 6 | 6 |
| 7 import "dart:math" as math; | 7 import "dart:math" as math; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 import 'package:analyzer/src/generated/utilities_collection.dart'; | 10 import 'package:analyzer/src/generated/utilities_collection.dart'; |
| (...skipping 2606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2617 element.periodOffset = node.period.offset; | 2617 element.periodOffset = node.period.offset; |
| 2618 element.nameEnd = constructorName.end; | 2618 element.nameEnd = constructorName.end; |
| 2619 } | 2619 } |
| 2620 holder.validate(); | 2620 holder.validate(); |
| 2621 return null; | 2621 return null; |
| 2622 } | 2622 } |
| 2623 | 2623 |
| 2624 @override | 2624 @override |
| 2625 Object visitDeclaredIdentifier(DeclaredIdentifier node) { | 2625 Object visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 2626 SimpleIdentifier variableName = node.identifier; | 2626 SimpleIdentifier variableName = node.identifier; |
| 2627 sc.Token keyword = node.keyword; | |
| 2628 LocalVariableElementImpl element = | 2627 LocalVariableElementImpl element = |
| 2629 new LocalVariableElementImpl.forNode(variableName); | 2628 new LocalVariableElementImpl.forNode(variableName); |
| 2630 ForEachStatement statement = node.parent as ForEachStatement; | 2629 ForEachStatement statement = node.parent as ForEachStatement; |
| 2631 int declarationEnd = node.offset + node.length; | 2630 int declarationEnd = node.offset + node.length; |
| 2632 int statementEnd = statement.offset + statement.length; | 2631 int statementEnd = statement.offset + statement.length; |
| 2633 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1); | 2632 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1); |
| 2634 element.const3 = _matches(keyword, sc.Keyword.CONST); | 2633 element.const3 = node.isConst; |
| 2635 element.final2 = _matches(keyword, sc.Keyword.FINAL); | 2634 element.final2 = node.isFinal; |
| 2636 _currentHolder.addLocalVariable(element); | 2635 _currentHolder.addLocalVariable(element); |
| 2637 variableName.staticElement = element; | 2636 variableName.staticElement = element; |
| 2638 return super.visitDeclaredIdentifier(node); | 2637 return super.visitDeclaredIdentifier(node); |
| 2639 } | 2638 } |
| 2640 | 2639 |
| 2641 @override | 2640 @override |
| 2642 Object visitDefaultFormalParameter(DefaultFormalParameter node) { | 2641 Object visitDefaultFormalParameter(DefaultFormalParameter node) { |
| 2643 ElementHolder holder = new ElementHolder(); | 2642 ElementHolder holder = new ElementHolder(); |
| 2644 NormalFormalParameter normalParameter = node.parameter; | 2643 NormalFormalParameter normalParameter = node.parameter; |
| 2645 SimpleIdentifier parameterName = normalParameter.identifier; | 2644 SimpleIdentifier parameterName = normalParameter.identifier; |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2779 } | 2778 } |
| 2780 String propertyName = propertyNameNode.name; | 2779 String propertyName = propertyNameNode.name; |
| 2781 TopLevelVariableElementImpl variable = | 2780 TopLevelVariableElementImpl variable = |
| 2782 _currentHolder.getTopLevelVariable(propertyName) as TopLevelVariable
ElementImpl; | 2781 _currentHolder.getTopLevelVariable(propertyName) as TopLevelVariable
ElementImpl; |
| 2783 if (variable == null) { | 2782 if (variable == null) { |
| 2784 variable = new TopLevelVariableElementImpl(node.name.name, -1); | 2783 variable = new TopLevelVariableElementImpl(node.name.name, -1); |
| 2785 variable.final2 = true; | 2784 variable.final2 = true; |
| 2786 variable.synthetic = true; | 2785 variable.synthetic = true; |
| 2787 _currentHolder.addTopLevelVariable(variable); | 2786 _currentHolder.addTopLevelVariable(variable); |
| 2788 } | 2787 } |
| 2789 if (_matches(property, sc.Keyword.GET)) { | 2788 if (node.isGetter) { |
| 2790 PropertyAccessorElementImpl getter = | 2789 PropertyAccessorElementImpl getter = |
| 2791 new PropertyAccessorElementImpl.forNode(propertyNameNode); | 2790 new PropertyAccessorElementImpl.forNode(propertyNameNode); |
| 2792 getter.functions = holder.functions; | 2791 getter.functions = holder.functions; |
| 2793 getter.labels = holder.labels; | 2792 getter.labels = holder.labels; |
| 2794 getter.localVariables = holder.localVariables; | 2793 getter.localVariables = holder.localVariables; |
| 2795 if (body.isAsynchronous) { | 2794 if (body.isAsynchronous) { |
| 2796 getter.asynchronous = true; | 2795 getter.asynchronous = true; |
| 2797 } | 2796 } |
| 2798 if (body.isGenerator) { | 2797 if (body.isGenerator) { |
| 2799 getter.generator = true; | 2798 getter.generator = true; |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2972 String propertyName = propertyNameNode.name; | 2971 String propertyName = propertyNameNode.name; |
| 2973 FieldElementImpl field = | 2972 FieldElementImpl field = |
| 2974 _currentHolder.getField(propertyName) as FieldElementImpl; | 2973 _currentHolder.getField(propertyName) as FieldElementImpl; |
| 2975 if (field == null) { | 2974 if (field == null) { |
| 2976 field = new FieldElementImpl(node.name.name, -1); | 2975 field = new FieldElementImpl(node.name.name, -1); |
| 2977 field.final2 = true; | 2976 field.final2 = true; |
| 2978 field.static = isStatic; | 2977 field.static = isStatic; |
| 2979 field.synthetic = true; | 2978 field.synthetic = true; |
| 2980 _currentHolder.addField(field); | 2979 _currentHolder.addField(field); |
| 2981 } | 2980 } |
| 2982 if (_matches(property, sc.Keyword.GET)) { | 2981 if (node.isGetter) { |
| 2983 PropertyAccessorElementImpl getter = | 2982 PropertyAccessorElementImpl getter = |
| 2984 new PropertyAccessorElementImpl.forNode(propertyNameNode); | 2983 new PropertyAccessorElementImpl.forNode(propertyNameNode); |
| 2985 getter.functions = holder.functions; | 2984 getter.functions = holder.functions; |
| 2986 getter.labels = holder.labels; | 2985 getter.labels = holder.labels; |
| 2987 getter.localVariables = holder.localVariables; | 2986 getter.localVariables = holder.localVariables; |
| 2988 if (body.isAsynchronous) { | 2987 if (body.isAsynchronous) { |
| 2989 getter.asynchronous = true; | 2988 getter.asynchronous = true; |
| 2990 } | 2989 } |
| 2991 if (body.isGenerator) { | 2990 if (body.isGenerator) { |
| 2992 getter.generator = true; | 2991 getter.generator = true; |
| 2993 } | 2992 } |
| 2994 getter.variable = field; | 2993 getter.variable = field; |
| 2995 getter.abstract = | 2994 getter.abstract = node.isAbstract; |
| 2996 body is EmptyFunctionBody && node.externalKeyword == null; | |
| 2997 getter.getter = true; | 2995 getter.getter = true; |
| 2998 getter.static = isStatic; | 2996 getter.static = isStatic; |
| 2999 field.getter = getter; | 2997 field.getter = getter; |
| 3000 _currentHolder.addAccessor(getter); | 2998 _currentHolder.addAccessor(getter); |
| 3001 propertyNameNode.staticElement = getter; | 2999 propertyNameNode.staticElement = getter; |
| 3002 } else { | 3000 } else { |
| 3003 PropertyAccessorElementImpl setter = | 3001 PropertyAccessorElementImpl setter = |
| 3004 new PropertyAccessorElementImpl.forNode(propertyNameNode); | 3002 new PropertyAccessorElementImpl.forNode(propertyNameNode); |
| 3005 setter.functions = holder.functions; | 3003 setter.functions = holder.functions; |
| 3006 setter.labels = holder.labels; | 3004 setter.labels = holder.labels; |
| 3007 setter.localVariables = holder.localVariables; | 3005 setter.localVariables = holder.localVariables; |
| 3008 setter.parameters = holder.parameters; | 3006 setter.parameters = holder.parameters; |
| 3009 if (body.isAsynchronous) { | 3007 if (body.isAsynchronous) { |
| 3010 setter.asynchronous = true; | 3008 setter.asynchronous = true; |
| 3011 } | 3009 } |
| 3012 if (body.isGenerator) { | 3010 if (body.isGenerator) { |
| 3013 setter.generator = true; | 3011 setter.generator = true; |
| 3014 } | 3012 } |
| 3015 setter.variable = field; | 3013 setter.variable = field; |
| 3016 setter.abstract = body is EmptyFunctionBody && | 3014 setter.abstract = node.isAbstract; |
| 3017 !_matches(node.externalKeyword, sc.Keyword.EXTERNAL); | |
| 3018 setter.setter = true; | 3015 setter.setter = true; |
| 3019 setter.static = isStatic; | 3016 setter.static = isStatic; |
| 3020 field.setter = setter; | 3017 field.setter = setter; |
| 3021 field.final2 = false; | 3018 field.final2 = false; |
| 3022 _currentHolder.addAccessor(setter); | 3019 _currentHolder.addAccessor(setter); |
| 3023 propertyNameNode.staticElement = setter; | 3020 propertyNameNode.staticElement = setter; |
| 3024 } | 3021 } |
| 3025 } | 3022 } |
| 3026 holder.validate(); | 3023 holder.validate(); |
| 3027 } catch (exception, stackTrace) { | 3024 } catch (exception, stackTrace) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3114 TypeParameterTypeImpl typeParameterType = | 3111 TypeParameterTypeImpl typeParameterType = |
| 3115 new TypeParameterTypeImpl(typeParameter); | 3112 new TypeParameterTypeImpl(typeParameter); |
| 3116 typeParameter.type = typeParameterType; | 3113 typeParameter.type = typeParameterType; |
| 3117 _currentHolder.addTypeParameter(typeParameter); | 3114 _currentHolder.addTypeParameter(typeParameter); |
| 3118 parameterName.staticElement = typeParameter; | 3115 parameterName.staticElement = typeParameter; |
| 3119 return super.visitTypeParameter(node); | 3116 return super.visitTypeParameter(node); |
| 3120 } | 3117 } |
| 3121 | 3118 |
| 3122 @override | 3119 @override |
| 3123 Object visitVariableDeclaration(VariableDeclaration node) { | 3120 Object visitVariableDeclaration(VariableDeclaration node) { |
| 3124 sc.Token keyword = (node.parent as VariableDeclarationList).keyword; | 3121 bool isConst = node.isConst; |
| 3125 bool isConst = _matches(keyword, sc.Keyword.CONST); | 3122 bool isFinal = node.isFinal; |
| 3126 bool isFinal = _matches(keyword, sc.Keyword.FINAL); | |
| 3127 bool hasInitializer = node.initializer != null; | 3123 bool hasInitializer = node.initializer != null; |
| 3128 VariableElementImpl element; | 3124 VariableElementImpl element; |
| 3129 if (_inFieldContext) { | 3125 if (_inFieldContext) { |
| 3130 SimpleIdentifier fieldName = node.name; | 3126 SimpleIdentifier fieldName = node.name; |
| 3131 FieldElementImpl field; | 3127 FieldElementImpl field; |
| 3132 if (isConst && hasInitializer) { | 3128 if (isConst && hasInitializer) { |
| 3133 field = new ConstFieldElementImpl.con1(fieldName); | 3129 field = new ConstFieldElementImpl.con1(fieldName); |
| 3134 } else { | 3130 } else { |
| 3135 field = new FieldElementImpl.forNode(fieldName); | 3131 field = new FieldElementImpl.forNode(fieldName); |
| 3136 } | 3132 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3183 initializer.labels = holder.labels; | 3179 initializer.labels = holder.labels; |
| 3184 initializer.localVariables = holder.localVariables; | 3180 initializer.localVariables = holder.localVariables; |
| 3185 initializer.synthetic = true; | 3181 initializer.synthetic = true; |
| 3186 element.initializer = initializer; | 3182 element.initializer = initializer; |
| 3187 holder.validate(); | 3183 holder.validate(); |
| 3188 } | 3184 } |
| 3189 if (element is PropertyInducingElementImpl) { | 3185 if (element is PropertyInducingElementImpl) { |
| 3190 PropertyInducingElementImpl variable = | 3186 PropertyInducingElementImpl variable = |
| 3191 element as PropertyInducingElementImpl; | 3187 element as PropertyInducingElementImpl; |
| 3192 if (_inFieldContext) { | 3188 if (_inFieldContext) { |
| 3193 (variable as FieldElementImpl).static = _matches( | 3189 (variable as FieldElementImpl).static = |
| 3194 (node.parent.parent as FieldDeclaration).staticKeyword, | 3190 (node.parent.parent as FieldDeclaration).isStatic; |
| 3195 sc.Keyword.STATIC); | |
| 3196 } | 3191 } |
| 3197 PropertyAccessorElementImpl getter = | 3192 PropertyAccessorElementImpl getter = |
| 3198 new PropertyAccessorElementImpl.forVariable(variable); | 3193 new PropertyAccessorElementImpl.forVariable(variable); |
| 3199 getter.getter = true; | 3194 getter.getter = true; |
| 3200 _currentHolder.addAccessor(getter); | 3195 _currentHolder.addAccessor(getter); |
| 3201 variable.getter = getter; | 3196 variable.getter = getter; |
| 3202 if (!isConst && !isFinal) { | 3197 if (!isConst && !isFinal) { |
| 3203 PropertyAccessorElementImpl setter = | 3198 PropertyAccessorElementImpl setter = |
| 3204 new PropertyAccessorElementImpl.forVariable(variable); | 3199 new PropertyAccessorElementImpl.forVariable(variable); |
| 3205 setter.setter = true; | 3200 setter.setter = true; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3286 return (parent as FunctionExpression).body; | 3281 return (parent as FunctionExpression).body; |
| 3287 } else if (parent is MethodDeclaration) { | 3282 } else if (parent is MethodDeclaration) { |
| 3288 return (parent as MethodDeclaration).body; | 3283 return (parent as MethodDeclaration).body; |
| 3289 } | 3284 } |
| 3290 parent = parent.parent; | 3285 parent = parent.parent; |
| 3291 } | 3286 } |
| 3292 return null; | 3287 return null; |
| 3293 } | 3288 } |
| 3294 | 3289 |
| 3295 /** | 3290 /** |
| 3296 * Return `true` if the given token is a token for the given keyword. | |
| 3297 * | |
| 3298 * @param token the token being tested | |
| 3299 * @param keyword the keyword being tested for | |
| 3300 * @return `true` if the given token is a token for the given keyword | |
| 3301 */ | |
| 3302 bool _matches(sc.Token token, sc.Keyword keyword) => | |
| 3303 token != null && | |
| 3304 token.type == sc.TokenType.KEYWORD && | |
| 3305 (token as sc.KeywordToken).keyword == keyword; | |
| 3306 | |
| 3307 /** | |
| 3308 * Sets the visible source range for formal parameter. | 3291 * Sets the visible source range for formal parameter. |
| 3309 */ | 3292 */ |
| 3310 void _setParameterVisibleRange(FormalParameter node, | 3293 void _setParameterVisibleRange(FormalParameter node, |
| 3311 ParameterElementImpl element) { | 3294 ParameterElementImpl element) { |
| 3312 FunctionBody body = _getFunctionBody(node); | 3295 FunctionBody body = _getFunctionBody(node); |
| 3313 if (body != null) { | 3296 if (body != null) { |
| 3314 element.setVisibleRange(body.offset, body.length); | 3297 element.setVisibleRange(body.offset, body.length); |
| 3315 } | 3298 } |
| 3316 } | 3299 } |
| 3317 | 3300 |
| (...skipping 12352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15670 * library. | 15653 * library. |
| 15671 */ | 15654 */ |
| 15672 final HashSet<String> members = new HashSet<String>(); | 15655 final HashSet<String> members = new HashSet<String>(); |
| 15673 | 15656 |
| 15674 /** | 15657 /** |
| 15675 * Names of resolved or unresolved class members that are read in the | 15658 * Names of resolved or unresolved class members that are read in the |
| 15676 * library. | 15659 * library. |
| 15677 */ | 15660 */ |
| 15678 final HashSet<String> readMembers = new HashSet<String>(); | 15661 final HashSet<String> readMembers = new HashSet<String>(); |
| 15679 } | 15662 } |
| OLD | NEW |