OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 simple_types_inferrer; | 5 library simple_types_inferrer; |
6 | 6 |
7 import '../closure.dart' show ClosureRepresentationInfo; | 7 import '../closure.dart' show ClosureRepresentationInfo; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/names.dart' show Identifiers, Selectors; | 9 import '../common/names.dart' show Identifiers, Selectors; |
10 import '../compiler.dart' show Compiler; | 10 import '../compiler.dart' show Compiler; |
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 } | 971 } |
972 | 972 |
973 if (analyzedElement.isGenerativeConstructor) { | 973 if (analyzedElement.isGenerativeConstructor) { |
974 isThisExposed = false; | 974 isThisExposed = false; |
975 signature.forEachParameter((FormalElement _element) { | 975 signature.forEachParameter((FormalElement _element) { |
976 ParameterElement element = _element; | 976 ParameterElement element = _element; |
977 TypeInformation parameterType = inferrer.typeOfParameter(element); | 977 TypeInformation parameterType = inferrer.typeOfParameter(element); |
978 if (element.isInitializingFormal) { | 978 if (element.isInitializingFormal) { |
979 InitializingFormalElement initializingFormal = element; | 979 InitializingFormalElement initializingFormal = element; |
980 if (initializingFormal.fieldElement.isFinal) { | 980 if (initializingFormal.fieldElement.isFinal) { |
981 inferrer.recordTypeOfFinalField( | 981 inferrer.recordTypeOfField( |
982 initializingFormal.fieldElement, parameterType); | 982 initializingFormal.fieldElement, parameterType); |
983 } else { | 983 } else { |
984 locals.updateField(initializingFormal.fieldElement, parameterType); | 984 locals.updateField(initializingFormal.fieldElement, parameterType); |
985 inferrer.recordTypeOfNonFinalField( | 985 inferrer.recordTypeOfField( |
986 initializingFormal.fieldElement, parameterType); | 986 initializingFormal.fieldElement, parameterType); |
987 } | 987 } |
988 } | 988 } |
989 locals.update(element, parameterType, node); | 989 locals.update(element, parameterType, node); |
990 }); | 990 }); |
991 ClassElement cls = analyzedElement.enclosingClass; | 991 ClassElement cls = analyzedElement.enclosingClass; |
992 Spannable spannable = node; | 992 Spannable spannable = node; |
993 if (analyzedElement.isSynthesized) { | 993 if (analyzedElement.isSynthesized) { |
994 spannable = analyzedElement; | 994 spannable = analyzedElement; |
995 ConstructorElement constructor = analyzedElement; | 995 ConstructorElement constructor = analyzedElement; |
(...skipping 29 matching lines...) Expand all Loading... |
1025 inferrer.recordExposesThis(analyzedElement, isThisExposed); | 1025 inferrer.recordExposesThis(analyzedElement, isThisExposed); |
1026 } | 1026 } |
1027 if (!isConstructorRedirect) { | 1027 if (!isConstructorRedirect) { |
1028 // Iterate over all instance fields, and give a null type to | 1028 // Iterate over all instance fields, and give a null type to |
1029 // fields that we haven'TypeInformation initialized for sure. | 1029 // fields that we haven'TypeInformation initialized for sure. |
1030 cls.forEachInstanceField((_, FieldElement field) { | 1030 cls.forEachInstanceField((_, FieldElement field) { |
1031 if (field.isFinal) return; | 1031 if (field.isFinal) return; |
1032 TypeInformation type = locals.fieldScope.readField(field); | 1032 TypeInformation type = locals.fieldScope.readField(field); |
1033 ResolvedAst resolvedAst = field.resolvedAst; | 1033 ResolvedAst resolvedAst = field.resolvedAst; |
1034 if (type == null && resolvedAst.body == null) { | 1034 if (type == null && resolvedAst.body == null) { |
1035 inferrer.recordTypeOfNonFinalField(field, types.nullType); | 1035 inferrer.recordTypeOfField(field, types.nullType); |
1036 } | 1036 } |
1037 }); | 1037 }); |
1038 } | 1038 } |
1039 if (analyzedElement.isGenerativeConstructor && cls.isAbstract) { | 1039 if (analyzedElement.isGenerativeConstructor && cls.isAbstract) { |
1040 if (closedWorld.isInstantiated(cls)) { | 1040 if (closedWorld.isInstantiated(cls)) { |
1041 returnType = types.nonNullSubclass(cls); | 1041 returnType = types.nonNullSubclass(cls); |
1042 } else { | 1042 } else { |
1043 // TODO(johnniwinther): Avoid analyzing [analyzedElement] in this | 1043 // TODO(johnniwinther): Avoid analyzing [analyzedElement] in this |
1044 // case; it's never called. | 1044 // case; it's never called. |
1045 returnType = types.nonNullEmpty(); | 1045 returnType = types.nonNullEmpty(); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 if (element.isField) { | 1210 if (element.isField) { |
1211 ResolvedAst elementResolvedAst = element.resolvedAst; | 1211 ResolvedAst elementResolvedAst = element.resolvedAst; |
1212 if (!selector.isSetter && | 1212 if (!selector.isSetter && |
1213 isInClassOrSubclass(element) && | 1213 isInClassOrSubclass(element) && |
1214 !element.isFinal && | 1214 !element.isFinal && |
1215 locals.fieldScope.readField(element) == null && | 1215 locals.fieldScope.readField(element) == null && |
1216 elementResolvedAst.body == null) { | 1216 elementResolvedAst.body == null) { |
1217 // If the field is being used before this constructor | 1217 // If the field is being used before this constructor |
1218 // actually had a chance to initialize it, say it can be | 1218 // actually had a chance to initialize it, say it can be |
1219 // null. | 1219 // null. |
1220 inferrer.recordTypeOfNonFinalField(element, types.nullType); | 1220 inferrer.recordTypeOfField(element, types.nullType); |
1221 } | 1221 } |
1222 // Accessing a field does not expose [:this:]. | 1222 // Accessing a field does not expose [:this:]. |
1223 return true; | 1223 return true; |
1224 } | 1224 } |
1225 // TODO(ngeoffray): We could do better here if we knew what we | 1225 // TODO(ngeoffray): We could do better here if we knew what we |
1226 // are calling does not expose this. | 1226 // are calling does not expose this. |
1227 isThisExposed = true; | 1227 isThisExposed = true; |
1228 return false; | 1228 return false; |
1229 }); | 1229 }); |
1230 } | 1230 } |
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1995 MemberElement single = targets.first; | 1995 MemberElement single = targets.first; |
1996 if (single.isField) { | 1996 if (single.isField) { |
1997 locals.updateField(single, rhsType); | 1997 locals.updateField(single, rhsType); |
1998 } | 1998 } |
1999 } | 1999 } |
2000 } | 2000 } |
2001 handleDynamicSend( | 2001 handleDynamicSend( |
2002 node, setterSelector, setterMask, receiverType, arguments); | 2002 node, setterSelector, setterMask, receiverType, arguments); |
2003 } else if (element.isField) { | 2003 } else if (element.isField) { |
2004 if (element.isFinal) { | 2004 if (element.isFinal) { |
2005 inferrer.recordTypeOfFinalField(element, rhsType); | 2005 inferrer.recordTypeOfField(element, rhsType); |
2006 } else { | 2006 } else { |
2007 if (analyzedElement.isGenerativeConstructor) { | 2007 if (analyzedElement.isGenerativeConstructor) { |
2008 locals.updateField(element, rhsType); | 2008 locals.updateField(element, rhsType); |
2009 } | 2009 } |
2010 if (visitingInitializers) { | 2010 if (visitingInitializers) { |
2011 inferrer.recordTypeOfNonFinalField(element, rhsType); | 2011 inferrer.recordTypeOfField(element, rhsType); |
2012 } else { | 2012 } else { |
2013 handleDynamicSend( | 2013 handleDynamicSend( |
2014 node, setterSelector, setterMask, receiverType, arguments); | 2014 node, setterSelector, setterMask, receiverType, arguments); |
2015 } | 2015 } |
2016 } | 2016 } |
2017 } else if (element.isLocal) { | 2017 } else if (element.isLocal) { |
2018 locals.update(element, rhsType, node); | 2018 locals.update(element, rhsType, node); |
2019 } | 2019 } |
2020 return rhsType; | 2020 return rhsType; |
2021 } | 2021 } |
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2947 Selector moveNextSelector = Selectors.moveNext; | 2947 Selector moveNextSelector = Selectors.moveNext; |
2948 TypeMask moveNextMask = memberData.typeOfIteratorMoveNext(node); | 2948 TypeMask moveNextMask = memberData.typeOfIteratorMoveNext(node); |
2949 | 2949 |
2950 TypeInformation iteratorType = handleDynamicSend(node, iteratorSelector, | 2950 TypeInformation iteratorType = handleDynamicSend(node, iteratorSelector, |
2951 iteratorMask, expressionType, new ArgumentsTypes.empty()); | 2951 iteratorMask, expressionType, new ArgumentsTypes.empty()); |
2952 | 2952 |
2953 return handleForInLoop(node, iteratorType, currentSelector, currentMask, | 2953 return handleForInLoop(node, iteratorType, currentSelector, currentMask, |
2954 moveNextSelector, moveNextMask); | 2954 moveNextSelector, moveNextMask); |
2955 } | 2955 } |
2956 } | 2956 } |
OLD | NEW |