| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 /** | 5 /** |
| 6 * This library is capable of producing linked summaries from unlinked | 6 * This library is capable of producing linked summaries from unlinked |
| 7 * ones (or prelinked ones). It functions by building a miniature | 7 * ones (or prelinked ones). It functions by building a miniature |
| 8 * element model to represent the contents of the summaries, and then | 8 * element model to represent the contents of the summaries, and then |
| 9 * scanning the element model to gather linked information and adding | 9 * scanning the element model to gather linked information and adding |
| 10 * it to the summary data structures. | 10 * it to the summary data structures. |
| (...skipping 1954 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1965 compilationUnit._storeLinkedType( | 1965 compilationUnit._storeLinkedType( |
| 1966 _unlinkedExecutable.inferredReturnTypeSlot, inferredReturnType, this); | 1966 _unlinkedExecutable.inferredReturnTypeSlot, inferredReturnType, this); |
| 1967 } | 1967 } |
| 1968 for (ParameterElementForLink parameterElement in parameters) { | 1968 for (ParameterElementForLink parameterElement in parameters) { |
| 1969 parameterElement.link(compilationUnit); | 1969 parameterElement.link(compilationUnit); |
| 1970 } | 1970 } |
| 1971 } | 1971 } |
| 1972 } | 1972 } |
| 1973 | 1973 |
| 1974 class ExprTypeComputer { | 1974 class ExprTypeComputer { |
| 1975 VariableElementForLink variable; | 1975 final FunctionElementForLink_Local function; |
| 1976 FunctionElementForLink_Initializer initializer; | 1976 final CompilationUnitElementForLink unit; |
| 1977 CompilationUnitElementForLink unit; | 1977 final LibraryElementForLink library; |
| 1978 LibraryElementForLink library; | 1978 final Linker linker; |
| 1979 Linker linker; | 1979 final TypeProvider typeProvider; |
| 1980 TypeProvider typeProvider; | 1980 final UnlinkedConst unlinkedConst; |
| 1981 UnlinkedConst unlinkedConst; | |
| 1982 | 1981 |
| 1983 final List<DartType> stack = <DartType>[]; | 1982 final List<DartType> stack = <DartType>[]; |
| 1984 int intPtr = 0; | 1983 int intPtr = 0; |
| 1985 int refPtr = 0; | 1984 int refPtr = 0; |
| 1986 int strPtr = 0; | 1985 int strPtr = 0; |
| 1987 int assignmentOperatorPtr = 0; | 1986 int assignmentOperatorPtr = 0; |
| 1988 | 1987 |
| 1989 ExprTypeComputer(VariableElementForLink variableElement) { | 1988 factory ExprTypeComputer(FunctionElementForLink_Local functionElement) { |
| 1990 this.variable = variableElement; | 1989 CompilationUnitElementForLink unit = functionElement.compilationUnit; |
| 1991 initializer = variableElement.initializer; | 1990 LibraryElementForLink library = unit.enclosingElement; |
| 1992 unit = variableElement.compilationUnit; | 1991 Linker linker = library._linker; |
| 1993 library = unit.enclosingElement; | 1992 TypeProvider typeProvider = linker.typeProvider; |
| 1994 linker = library._linker; | 1993 UnlinkedConst unlinkedConst = functionElement._unlinkedExecutable.bodyExpr; |
| 1995 typeProvider = linker.typeProvider; | 1994 return new ExprTypeComputer._( |
| 1996 unlinkedConst = variableElement.unlinkedVariable.initializer?.bodyExpr; | 1995 functionElement, unit, library, linker, typeProvider, unlinkedConst); |
| 1997 } | 1996 } |
| 1998 | 1997 |
| 1998 ExprTypeComputer._(this.function, this.unit, this.library, this.linker, |
| 1999 this.typeProvider, this.unlinkedConst); |
| 2000 |
| 1999 DartType compute() { | 2001 DartType compute() { |
| 2002 if (unlinkedConst == null) { |
| 2003 // No function body was stored for this function, so we can't infer its |
| 2004 // return type. Assume `dynamic`. |
| 2005 return DynamicTypeImpl.instance; |
| 2006 } |
| 2000 // Perform RPN evaluation of the constant, using a stack of inferred types. | 2007 // Perform RPN evaluation of the constant, using a stack of inferred types. |
| 2001 for (UnlinkedConstOperation operation in unlinkedConst.operations) { | 2008 for (UnlinkedConstOperation operation in unlinkedConst.operations) { |
| 2002 switch (operation) { | 2009 switch (operation) { |
| 2003 case UnlinkedConstOperation.pushInt: | 2010 case UnlinkedConstOperation.pushInt: |
| 2004 intPtr++; | 2011 intPtr++; |
| 2005 stack.add(typeProvider.intType); | 2012 stack.add(typeProvider.intType); |
| 2006 break; | 2013 break; |
| 2007 case UnlinkedConstOperation.pushLongInt: | 2014 case UnlinkedConstOperation.pushLongInt: |
| 2008 int numInts = _getNextInt(); | 2015 int numInts = _getNextInt(); |
| 2009 intPtr += numInts; | 2016 intPtr += numInts; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2151 refPtr++; | 2158 refPtr++; |
| 2152 stack.add(typeProvider.boolType); | 2159 stack.add(typeProvider.boolType); |
| 2153 break; | 2160 break; |
| 2154 case UnlinkedConstOperation.throwException: | 2161 case UnlinkedConstOperation.throwException: |
| 2155 stack.removeLast(); | 2162 stack.removeLast(); |
| 2156 stack.add(BottomTypeImpl.instance); | 2163 stack.add(BottomTypeImpl.instance); |
| 2157 break; | 2164 break; |
| 2158 case UnlinkedConstOperation.pushLocalFunctionReference: | 2165 case UnlinkedConstOperation.pushLocalFunctionReference: |
| 2159 int popCount = _getNextInt(); | 2166 int popCount = _getNextInt(); |
| 2160 assert(popCount == 0); // TODO(paulberry): handle the nonzero case. | 2167 assert(popCount == 0); // TODO(paulberry): handle the nonzero case. |
| 2161 stack.add(initializer.functions[_getNextInt()].type); | 2168 stack.add(function.functions[_getNextInt()].type); |
| 2162 break; | 2169 break; |
| 2163 default: | 2170 default: |
| 2164 // TODO(paulberry): implement. | 2171 // TODO(paulberry): implement. |
| 2165 throw new UnimplementedError('$operation'); | 2172 throw new UnimplementedError('$operation'); |
| 2166 } | 2173 } |
| 2167 } | 2174 } |
| 2168 assert(intPtr == unlinkedConst.ints.length); | 2175 assert(intPtr == unlinkedConst.ints.length); |
| 2169 assert(refPtr == unlinkedConst.references.length); | 2176 assert(refPtr == unlinkedConst.references.length); |
| 2170 assert(strPtr == unlinkedConst.strings.length); | 2177 assert(strPtr == unlinkedConst.strings.length); |
| 2171 assert(assignmentOperatorPtr == unlinkedConst.assignmentOperators.length); | 2178 assert(assignmentOperatorPtr == unlinkedConst.assignmentOperators.length); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2308 strPtr += numNamed; | 2315 strPtr += numNamed; |
| 2309 EntityRef ref = _getNextRef(); | 2316 EntityRef ref = _getNextRef(); |
| 2310 ConstructorElementForLink element = | 2317 ConstructorElementForLink element = |
| 2311 unit.resolveRef(ref.reference).asConstructor; | 2318 unit.resolveRef(ref.reference).asConstructor; |
| 2312 if (element != null) { | 2319 if (element != null) { |
| 2313 ClassElementForLink_Class enclosingClass = element.enclosingClass; | 2320 ClassElementForLink_Class enclosingClass = element.enclosingClass; |
| 2314 stack.add(enclosingClass.buildType((int i) { | 2321 stack.add(enclosingClass.buildType((int i) { |
| 2315 // Type argument explicitly specified. | 2322 // Type argument explicitly specified. |
| 2316 if (i < ref.typeArguments.length) { | 2323 if (i < ref.typeArguments.length) { |
| 2317 return unit.resolveTypeRef( | 2324 return unit.resolveTypeRef( |
| 2318 ref.typeArguments[i], variable._typeParameterContext); | 2325 ref.typeArguments[i], function.typeParameterContext); |
| 2319 } else { | 2326 } else { |
| 2320 return null; | 2327 return null; |
| 2321 } | 2328 } |
| 2322 }, const [])); | 2329 }, const [])); |
| 2323 } else { | 2330 } else { |
| 2324 stack.add(DynamicTypeImpl.instance); | 2331 stack.add(DynamicTypeImpl.instance); |
| 2325 } | 2332 } |
| 2326 } | 2333 } |
| 2327 | 2334 |
| 2328 void _doInvokeMethod() { | 2335 void _doInvokeMethod() { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2441 List<String> _getNextStrings(int n) { | 2448 List<String> _getNextStrings(int n) { |
| 2442 List<String> result = new List<String>(n); | 2449 List<String> result = new List<String>(n); |
| 2443 for (int i = 0; i < n; i++) { | 2450 for (int i = 0; i < n; i++) { |
| 2444 result[i] = _getNextString(); | 2451 result[i] = _getNextString(); |
| 2445 } | 2452 } |
| 2446 return result; | 2453 return result; |
| 2447 } | 2454 } |
| 2448 | 2455 |
| 2449 DartType _getNextTypeRef() { | 2456 DartType _getNextTypeRef() { |
| 2450 EntityRef ref = _getNextRef(); | 2457 EntityRef ref = _getNextRef(); |
| 2451 return unit.resolveTypeRef(ref, variable._typeParameterContext); | 2458 return unit.resolveTypeRef(ref, function.typeParameterContext); |
| 2452 } | 2459 } |
| 2453 | 2460 |
| 2454 /** | 2461 /** |
| 2455 * Return the type of the property with the given [propertyName] in the | 2462 * Return the type of the property with the given [propertyName] in the |
| 2456 * given [targetType]. May return `dynamic` if the property cannot be | 2463 * given [targetType]. May return `dynamic` if the property cannot be |
| 2457 * resolved. | 2464 * resolved. |
| 2458 */ | 2465 */ |
| 2459 DartType _getPropertyType(DartType targetType, String propertyName) { | 2466 DartType _getPropertyType(DartType targetType, String propertyName) { |
| 2460 return targetType is InterfaceType | 2467 return targetType is InterfaceType |
| 2461 ? targetType | 2468 ? targetType |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2751 List<TypeParameterElement> get typeParameters => const []; | 2758 List<TypeParameterElement> get typeParameters => const []; |
| 2752 | 2759 |
| 2753 @override | 2760 @override |
| 2754 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 2761 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 2755 } | 2762 } |
| 2756 | 2763 |
| 2757 /** | 2764 /** |
| 2758 * Element representing the initializer expression of a variable. | 2765 * Element representing the initializer expression of a variable. |
| 2759 */ | 2766 */ |
| 2760 class FunctionElementForLink_Initializer extends Object | 2767 class FunctionElementForLink_Initializer extends Object |
| 2761 with ReferenceableElementForLink | 2768 with ReferenceableElementForLink, TypeParameterizedElementMixin |
| 2762 implements FunctionElementForLink_Local { | 2769 implements FunctionElementForLink_Local { |
| 2763 /** | 2770 /** |
| 2764 * The variable for which this element is the initializer. | 2771 * The variable for which this element is the initializer. |
| 2765 */ | 2772 */ |
| 2766 final VariableElementForLink _variable; | 2773 final VariableElementForLink _variable; |
| 2767 | 2774 |
| 2768 List<FunctionElementForLink_Local_NonSynthetic> _functions; | 2775 List<FunctionElementForLink_Local_NonSynthetic> _functions; |
| 2769 | 2776 |
| 2770 FunctionElementForLink_Initializer(this._variable); | 2777 FunctionElementForLink_Initializer(this._variable); |
| 2771 | 2778 |
| 2772 @override | 2779 @override |
| 2780 CompilationUnitElementForLink get compilationUnit => |
| 2781 _variable.compilationUnit; |
| 2782 |
| 2783 @override |
| 2773 VariableElementForLink get enclosingElement => _variable; | 2784 VariableElementForLink get enclosingElement => _variable; |
| 2774 | 2785 |
| 2775 TypeParameterizedElementMixin get enclosingTypeParameterContext => | 2786 TypeParameterizedElementMixin get enclosingTypeParameterContext => |
| 2776 _variable.enclosingElement is ClassElementForLink | 2787 _variable.enclosingElement is ClassElementForLink |
| 2777 ? _variable.enclosingElement | 2788 ? _variable.enclosingElement |
| 2778 : null; | 2789 : null; |
| 2779 | 2790 |
| 2780 @override | 2791 @override |
| 2792 CompilationUnitElementForLink get enclosingUnit => _variable.compilationUnit; |
| 2793 |
| 2794 @override |
| 2781 List<FunctionElementForLink_Local_NonSynthetic> get functions => | 2795 List<FunctionElementForLink_Local_NonSynthetic> get functions => |
| 2782 _functions ??= _variable.unlinkedVariable.initializer.localFunctions | 2796 _functions ??= _variable.unlinkedVariable.initializer.localFunctions |
| 2783 .map((UnlinkedExecutable ex) => | 2797 .map((UnlinkedExecutable ex) => |
| 2784 new FunctionElementForLink_Local_NonSynthetic( | 2798 new FunctionElementForLink_Local_NonSynthetic( |
| 2785 _variable.compilationUnit, this, ex)) | 2799 _variable.compilationUnit, this, ex)) |
| 2786 .toList(); | 2800 .toList(); |
| 2787 | 2801 |
| 2788 @override | 2802 @override |
| 2789 DartType get returnType { | 2803 DartType get returnType { |
| 2790 // If this is a variable whose type needs inferring, infer it. | 2804 // If this is a variable whose type needs inferring, infer it. |
| 2791 if (_variable.hasImplicitType) { | 2805 if (_variable.hasImplicitType) { |
| 2792 return _variable.inferredType; | 2806 return _variable.inferredType; |
| 2793 } else { | 2807 } else { |
| 2794 // There's no reason linking should need to access the type of | 2808 // There's no reason linking should need to access the type of |
| 2795 // this FunctionElement, since the variable doesn't need its | 2809 // this FunctionElement, since the variable doesn't need its |
| 2796 // type inferred. | 2810 // type inferred. |
| 2797 assert(false); | 2811 assert(false); |
| 2798 // But for robustness, return the dynamic type. | 2812 // But for robustness, return the dynamic type. |
| 2799 return DynamicTypeImpl.instance; | 2813 return DynamicTypeImpl.instance; |
| 2800 } | 2814 } |
| 2801 } | 2815 } |
| 2802 | 2816 |
| 2803 @override | 2817 @override |
| 2804 void set returnType(DartType newType) { | 2818 void set returnType(DartType newType) { |
| 2805 // InstanceMemberInferrer stores the new type both here and on the variable | 2819 // InstanceMemberInferrer stores the new type both here and on the variable |
| 2806 // element. We don't need to record both values, so we ignore it here. | 2820 // element. We don't need to record both values, so we ignore it here. |
| 2807 } | 2821 } |
| 2808 | 2822 |
| 2809 @override | 2823 @override |
| 2810 int get typeParameterNestingLevel => | 2824 TypeParameterizedElementMixin get typeParameterContext => this; |
| 2811 enclosingTypeParameterContext?.typeParameterNestingLevel ?? 0; | |
| 2812 | 2825 |
| 2813 List<TypeParameterElement> get typeParameters => const []; | 2826 @override |
| 2827 List<UnlinkedTypeParam> get unlinkedTypeParams => const []; |
| 2828 |
| 2829 @override |
| 2830 bool get _hasTypeBeenInferred => _variable._inferredType != null; |
| 2831 |
| 2832 @override |
| 2833 UnlinkedExecutable get _unlinkedExecutable => |
| 2834 _variable.unlinkedVariable.initializer; |
| 2814 | 2835 |
| 2815 @override | 2836 @override |
| 2816 FunctionElementForLink_Local getLocalFunction(int index) { | 2837 FunctionElementForLink_Local getLocalFunction(int index) { |
| 2817 List<FunctionElementForLink_Local_NonSynthetic> functions = this.functions; | 2838 List<FunctionElementForLink_Local_NonSynthetic> functions = this.functions; |
| 2818 return index < functions.length ? functions[index] : null; | 2839 return index < functions.length ? functions[index] : null; |
| 2819 } | 2840 } |
| 2820 | 2841 |
| 2821 @override | 2842 @override |
| 2822 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 2843 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 2844 |
| 2845 @override |
| 2846 void _setInferredType(DartType type) { |
| 2847 assert(!_hasTypeBeenInferred); |
| 2848 _variable._inferredType = type; |
| 2849 } |
| 2823 } | 2850 } |
| 2824 | 2851 |
| 2825 /** | 2852 /** |
| 2826 * Element representing a local function (possibly a closure). | 2853 * Element representing a local function (possibly a closure). |
| 2827 */ | 2854 */ |
| 2828 abstract class FunctionElementForLink_Local | 2855 abstract class FunctionElementForLink_Local |
| 2829 implements | 2856 implements |
| 2830 ExecutableElementForLink, | 2857 ExecutableElementForLink, |
| 2831 FunctionElementImpl, | 2858 FunctionElementImpl, |
| 2832 ReferenceableElementForLink {} | 2859 ReferenceableElementForLink { |
| 2860 /** |
| 2861 * Indicates whether type inference has completed for this function. |
| 2862 */ |
| 2863 bool get _hasTypeBeenInferred; |
| 2864 |
| 2865 /** |
| 2866 * Stores the given [type] as the inferred return type for this function. |
| 2867 * Should only be called if [_hasTypeBeenInferred] is `false`. |
| 2868 */ |
| 2869 void _setInferredType(DartType type); |
| 2870 } |
| 2833 | 2871 |
| 2834 /** | 2872 /** |
| 2835 * Element representing a local function (possibly a closure) inside another | 2873 * Element representing a local function (possibly a closure) inside another |
| 2836 * executable. | 2874 * executable. |
| 2837 */ | 2875 */ |
| 2838 class FunctionElementForLink_Local_NonSynthetic extends ExecutableElementForLink | 2876 class FunctionElementForLink_Local_NonSynthetic extends ExecutableElementForLink |
| 2839 with ReferenceableElementForLink | 2877 with ReferenceableElementForLink |
| 2840 implements FunctionElementForLink_Local { | 2878 implements FunctionElementForLink_Local { |
| 2841 @override | 2879 @override |
| 2842 final ExecutableElementForLink enclosingElement; | 2880 final ExecutableElementForLink enclosingElement; |
| 2843 | 2881 |
| 2844 FunctionElementForLink_Local_NonSynthetic( | 2882 FunctionElementForLink_Local_NonSynthetic( |
| 2845 CompilationUnitElementForLink compilationUnit, | 2883 CompilationUnitElementForLink compilationUnit, |
| 2846 this.enclosingElement, | 2884 this.enclosingElement, |
| 2847 UnlinkedExecutable unlinkedExecutable) | 2885 UnlinkedExecutable unlinkedExecutable) |
| 2848 : super(compilationUnit, unlinkedExecutable); | 2886 : super(compilationUnit, unlinkedExecutable); |
| 2849 | 2887 |
| 2850 @override | 2888 @override |
| 2851 TypeParameterizedElementMixin get enclosingTypeParameterContext => | 2889 TypeParameterizedElementMixin get enclosingTypeParameterContext => |
| 2852 enclosingElement; | 2890 enclosingElement; |
| 2853 | 2891 |
| 2854 @override | 2892 @override |
| 2893 bool get _hasTypeBeenInferred { |
| 2894 // TODO(paulberry): add logic to infer types of nonsynthetic functions. |
| 2895 return true; |
| 2896 } |
| 2897 |
| 2898 @override |
| 2855 DartType buildType( | 2899 DartType buildType( |
| 2856 DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) { | 2900 DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) { |
| 2857 assert(implicitFunctionTypeIndices.isEmpty); | 2901 assert(implicitFunctionTypeIndices.isEmpty); |
| 2858 return type; | 2902 return type; |
| 2859 } | 2903 } |
| 2860 | 2904 |
| 2861 @override | 2905 @override |
| 2862 FunctionElementForLink_Local getLocalFunction(int index) { | 2906 FunctionElementForLink_Local getLocalFunction(int index) { |
| 2863 // TODO(paulberry): implement. | 2907 // TODO(paulberry): implement. |
| 2864 throw new UnimplementedError(); | 2908 throw new UnimplementedError(); |
| 2865 } | 2909 } |
| 2866 | 2910 |
| 2867 @override | 2911 @override |
| 2868 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 2912 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 2913 |
| 2914 @override |
| 2915 void _setInferredType(DartType type) { |
| 2916 // TODO(paulberry): add logic to infer types of nonsynthetic functions. |
| 2917 throw new UnimplementedError(); |
| 2918 } |
| 2869 } | 2919 } |
| 2870 | 2920 |
| 2871 /** | 2921 /** |
| 2872 * Element representing a typedef resynthesized from a summary during linking. | 2922 * Element representing a typedef resynthesized from a summary during linking. |
| 2873 */ | 2923 */ |
| 2874 class FunctionTypeAliasElementForLink extends Object | 2924 class FunctionTypeAliasElementForLink extends Object |
| 2875 with | 2925 with |
| 2876 TypeParameterizedElementMixin, | 2926 TypeParameterizedElementMixin, |
| 2877 ParameterParentElementForLink, | 2927 ParameterParentElementForLink, |
| 2878 ReferenceableElementForLink | 2928 ReferenceableElementForLink |
| (...skipping 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4312 } | 4362 } |
| 4313 } | 4363 } |
| 4314 } | 4364 } |
| 4315 | 4365 |
| 4316 /** | 4366 /** |
| 4317 * Specialization of [Node] used to construct the type inference dependency | 4367 * Specialization of [Node] used to construct the type inference dependency |
| 4318 * graph. | 4368 * graph. |
| 4319 */ | 4369 */ |
| 4320 class TypeInferenceNode extends Node<TypeInferenceNode> { | 4370 class TypeInferenceNode extends Node<TypeInferenceNode> { |
| 4321 /** | 4371 /** |
| 4322 * The [FieldElement] or [TopLevelVariableElement] to which this | 4372 * The [FunctionElementForLink_Local] to which this node refers. |
| 4323 * node refers. | |
| 4324 */ | 4373 */ |
| 4325 final VariableElementForLink variableElement; | 4374 final FunctionElementForLink_Local functionElement; |
| 4326 | 4375 |
| 4327 TypeInferenceNode(this.variableElement); | 4376 TypeInferenceNode(this.functionElement); |
| 4328 | 4377 |
| 4329 @override | 4378 @override |
| 4330 bool get isEvaluated => variableElement._inferredType != null; | 4379 bool get isEvaluated => functionElement._hasTypeBeenInferred; |
| 4331 | 4380 |
| 4332 /** | 4381 /** |
| 4333 * Collect the type inference dependencies in [unlinkedExecutable] (which | 4382 * Collect the type inference dependencies in [unlinkedExecutable] (which |
| 4334 * should be interpreted relative to [compilationUnit]) and store them in | 4383 * should be interpreted relative to [compilationUnit]) and store them in |
| 4335 * [dependencies]. | 4384 * [dependencies]. |
| 4336 */ | 4385 */ |
| 4337 void collectDependencies( | 4386 void collectDependencies( |
| 4338 List<TypeInferenceNode> dependencies, | 4387 List<TypeInferenceNode> dependencies, |
| 4339 UnlinkedExecutable unlinkedExecutable, | 4388 UnlinkedExecutable unlinkedExecutable, |
| 4340 CompilationUnitElementForLink compilationUnit) { | 4389 CompilationUnitElementForLink compilationUnit) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4413 break; | 4462 break; |
| 4414 } | 4463 } |
| 4415 } | 4464 } |
| 4416 assert(refPtr == unlinkedConst.references.length); | 4465 assert(refPtr == unlinkedConst.references.length); |
| 4417 assert(intPtr == unlinkedConst.ints.length); | 4466 assert(intPtr == unlinkedConst.ints.length); |
| 4418 } | 4467 } |
| 4419 | 4468 |
| 4420 @override | 4469 @override |
| 4421 List<TypeInferenceNode> computeDependencies() { | 4470 List<TypeInferenceNode> computeDependencies() { |
| 4422 List<TypeInferenceNode> dependencies = <TypeInferenceNode>[]; | 4471 List<TypeInferenceNode> dependencies = <TypeInferenceNode>[]; |
| 4423 collectDependencies( | 4472 collectDependencies(dependencies, functionElement._unlinkedExecutable, |
| 4424 dependencies, | 4473 functionElement.compilationUnit); |
| 4425 variableElement.unlinkedVariable.initializer, | |
| 4426 variableElement.compilationUnit); | |
| 4427 return dependencies; | 4474 return dependencies; |
| 4428 } | 4475 } |
| 4429 | 4476 |
| 4430 void evaluate(bool inCycle) { | 4477 void evaluate(bool inCycle) { |
| 4431 if (inCycle) { | 4478 if (inCycle) { |
| 4432 variableElement._inferredType = DynamicTypeImpl.instance; | 4479 functionElement._setInferredType(DynamicTypeImpl.instance); |
| 4433 } else { | 4480 } else { |
| 4434 variableElement._inferredType = | 4481 functionElement |
| 4435 new ExprTypeComputer(variableElement).compute(); | 4482 ._setInferredType(new ExprTypeComputer(functionElement).compute()); |
| 4436 } | 4483 } |
| 4437 } | 4484 } |
| 4438 | 4485 |
| 4439 @override | 4486 @override |
| 4440 String toString() => 'TypeInferenceNode($variableElement)'; | 4487 String toString() => 'TypeInferenceNode($functionElement)'; |
| 4441 } | 4488 } |
| 4442 | 4489 |
| 4443 class TypeProviderForLink implements TypeProvider { | 4490 class TypeProviderForLink implements TypeProvider { |
| 4444 final Linker _linker; | 4491 final Linker _linker; |
| 4445 | 4492 |
| 4446 InterfaceType _boolType; | 4493 InterfaceType _boolType; |
| 4447 InterfaceType _deprecatedType; | 4494 InterfaceType _deprecatedType; |
| 4448 InterfaceType _doubleType; | 4495 InterfaceType _doubleType; |
| 4449 InterfaceType _functionType; | 4496 InterfaceType _functionType; |
| 4450 InterfaceType _futureDynamicType; | 4497 InterfaceType _futureDynamicType; |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4633 /** | 4680 /** |
| 4634 * The compilation unit in which this variable appears. | 4681 * The compilation unit in which this variable appears. |
| 4635 */ | 4682 */ |
| 4636 final CompilationUnitElementForLink compilationUnit; | 4683 final CompilationUnitElementForLink compilationUnit; |
| 4637 | 4684 |
| 4638 VariableElementForLink(this.unlinkedVariable, this.compilationUnit) { | 4685 VariableElementForLink(this.unlinkedVariable, this.compilationUnit) { |
| 4639 if (compilationUnit.isInBuildUnit && | 4686 if (compilationUnit.isInBuildUnit && |
| 4640 unlinkedVariable.initializer?.bodyExpr != null) { | 4687 unlinkedVariable.initializer?.bodyExpr != null) { |
| 4641 _constNode = new ConstVariableNode(this); | 4688 _constNode = new ConstVariableNode(this); |
| 4642 if (unlinkedVariable.type == null) { | 4689 if (unlinkedVariable.type == null) { |
| 4643 _typeInferenceNode = new TypeInferenceNode(this); | 4690 _typeInferenceNode = new TypeInferenceNode(initializer); |
| 4644 } | 4691 } |
| 4645 } | 4692 } |
| 4646 } | 4693 } |
| 4647 | 4694 |
| 4648 /** | 4695 /** |
| 4649 * If the variable has an explicitly declared return type, return it. | 4696 * If the variable has an explicitly declared return type, return it. |
| 4650 * Otherwise return `null`. | 4697 * Otherwise return `null`. |
| 4651 */ | 4698 */ |
| 4652 DartType get declaredType { | 4699 DartType get declaredType { |
| 4653 if (unlinkedVariable.type == null) { | 4700 if (unlinkedVariable.type == null) { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4746 * there are no type parameters in scope. | 4793 * there are no type parameters in scope. |
| 4747 */ | 4794 */ |
| 4748 TypeParameterizedElementMixin get _typeParameterContext; | 4795 TypeParameterizedElementMixin get _typeParameterContext; |
| 4749 | 4796 |
| 4750 @override | 4797 @override |
| 4751 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 4798 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 4752 | 4799 |
| 4753 @override | 4800 @override |
| 4754 String toString() => '$enclosingElement.$name'; | 4801 String toString() => '$enclosingElement.$name'; |
| 4755 } | 4802 } |
| OLD | NEW |