Index: pkg/compiler/lib/src/types/types.dart |
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart |
index 71672c32b7ff088523a69b643595296e8be7d099..b15a286ad13e8a6de71c309fe27c4762fd591ece 100644 |
--- a/pkg/compiler/lib/src/types/types.dart |
+++ b/pkg/compiler/lib/src/types/types.dart |
@@ -85,24 +85,6 @@ abstract class GlobalTypeInferenceElementResultImpl |
final bool _isJsInterop; |
final TypeMask _dynamic; |
- factory GlobalTypeInferenceElementResultImpl( |
- Element owner, |
- GlobalTypeInferenceElementData data, |
- TypesInferrer inferrer, |
- bool isJsInterop, |
- TypeMask _dynamic) { |
- if (owner.isParameter) { |
- return new GlobalTypeInferenceParameterResult( |
- owner, data, inferrer, isJsInterop, _dynamic); |
- } else if (owner.isLocal) { |
- return new GlobalTypeInferenceLocalFunctionResult( |
- owner, data, inferrer, isJsInterop, _dynamic); |
- } else { |
- return new GlobalTypeInferenceMemberResult( |
- owner, data, inferrer, isJsInterop, _dynamic); |
- } |
- } |
- |
GlobalTypeInferenceElementResultImpl.internal(this._owner, this._data, |
this._inferrer, this._isJsInterop, this._dynamic); |
@@ -112,11 +94,10 @@ abstract class GlobalTypeInferenceElementResultImpl |
return mask != null && mask.isEmpty; |
} |
- TypeMask typeOfNewList(Send node) => |
- _inferrer.getTypeForNewList(_owner, node); |
+ TypeMask typeOfNewList(Send node) => _inferrer.getTypeForNewList(node); |
TypeMask typeOfListLiteral(LiteralList node) => |
- _inferrer.getTypeForNewList(_owner, node); |
+ _inferrer.getTypeForNewList(node); |
TypeMask typeOfSend(Send node) => _data?.typeOfSend(node); |
TypeMask typeOfGetter(SendSet node) => _data?.typeOfGetter(node); |
@@ -150,12 +131,8 @@ class GlobalTypeInferenceMemberResult |
class GlobalTypeInferenceParameterResult |
extends GlobalTypeInferenceElementResultImpl { |
GlobalTypeInferenceParameterResult( |
- ParameterElement owner, |
- GlobalTypeInferenceElementData data, |
- TypesInferrer inferrer, |
- bool isJsInterop, |
- TypeMask _dynamic) |
- : super.internal(owner, data, inferrer, isJsInterop, _dynamic); |
+ ParameterElement owner, TypesInferrer inferrer, TypeMask _dynamic) |
+ : super.internal(owner, null, inferrer, false, _dynamic); |
bool get isCalledOnce => _inferrer.isParameterCalledOnce(_owner); |
@@ -166,45 +143,6 @@ class GlobalTypeInferenceParameterResult |
_isJsInterop ? _dynamic : _inferrer.getTypeOfParameter(_owner); |
} |
-@deprecated |
-class GlobalTypeInferenceLocalFunctionResult |
- extends GlobalTypeInferenceElementResultImpl { |
- GlobalTypeInferenceLocalFunctionResult( |
- LocalFunctionElement owner, |
- GlobalTypeInferenceElementData data, |
- TypesInferrer inferrer, |
- bool isJsInterop, |
- TypeMask _dynamic) |
- : super.internal(owner, data, inferrer, isJsInterop, _dynamic); |
- |
- bool get isCalledOnce => _inferrer.isLocalFunctionCalledOnce(_owner); |
- |
- TypeMask get returnType => |
- _isJsInterop ? _dynamic : _inferrer.getReturnTypeOfLocalFunction(_owner); |
- |
- TypeMask get type => |
- _isJsInterop ? _dynamic : _inferrer.getTypeOfLocalFunction(_owner); |
-} |
- |
-class GlobalTypeInferenceLocalFunctionResultImpl |
- extends GlobalTypeInferenceElementResultImpl { |
- GlobalTypeInferenceLocalFunctionResultImpl( |
- LocalFunctionElement owner, |
- GlobalTypeInferenceElementData data, |
- TypesInferrer inferrer, |
- bool isJsInterop, |
- TypeMask _dynamic) |
- : super.internal(owner, data, inferrer, isJsInterop, _dynamic); |
- |
- bool get isCalledOnce => _inferrer.isLocalFunctionCalledOnce(_owner); |
- |
- TypeMask get returnType => |
- _isJsInterop ? _dynamic : _inferrer.getReturnTypeOfLocalFunction(_owner); |
- |
- TypeMask get type => |
- _isJsInterop ? _dynamic : _inferrer.getTypeOfLocalFunction(_owner); |
-} |
- |
/// Internal data used during type-inference to store intermediate results about |
/// a single element. |
class GlobalTypeInferenceElementData { |
@@ -278,7 +216,7 @@ abstract class TypesInferrer { |
TypeMask getTypeOfLocalFunction(LocalFunctionElement element); |
TypeMask getTypeOfMember(MemberElement element); |
TypeMask getTypeOfParameter(ParameterElement element); |
- TypeMask getTypeForNewList(Element owner, Node node); |
+ TypeMask getTypeForNewList(Node node); |
TypeMask getTypeOfSelector(Selector selector, TypeMask mask); |
void clear(); |
@@ -303,53 +241,48 @@ class GlobalTypeInferenceResults { |
// TODO(sigmund): store relevant data & drop reference to inference engine. |
final TypeGraphInferrer _inferrer; |
final ClosedWorld closedWorld; |
- final Map<Element, GlobalTypeInferenceElementResult> _elementResults = {}; |
- |
- GlobalTypeInferenceElementResult resultOfMember(MemberElement element) { |
- return _resultOf(element); |
- } |
- |
- GlobalTypeInferenceElementResult resultOfParameter(ParameterElement element) { |
- return _resultOf(element); |
- } |
- |
- @deprecated |
- GlobalTypeInferenceElementResult resultOfElement(AstElement element) { |
- return _resultOf(element); |
- } |
+ final Map<MemberElement, GlobalTypeInferenceMemberResult> _memberResults = |
+ <MemberElement, GlobalTypeInferenceMemberResult>{}; |
+ final Map<ParameterElement, GlobalTypeInferenceParameterResult> |
+ _parameterResults = |
+ <ParameterElement, GlobalTypeInferenceParameterResult>{}; |
// TODO(sigmund,johnniwinther): compute result objects eagerly and make it an |
// error to query for results that don't exist. |
- GlobalTypeInferenceElementResult _resultOf(AstElement element) { |
+ GlobalTypeInferenceElementResult resultOfMember(MemberElement member) { |
assert( |
- !element.isGenerativeConstructorBody, |
+ !member.isGenerativeConstructorBody, |
failedAt( |
- element, |
+ member, |
"unexpected input: ConstructorBodyElements are created" |
" after global type inference, no data is avaiable for them.")); |
// TODO(sigmund): store closure data directly in the closure element and |
// not in the context of the enclosing method? |
- var key = (element is SynthesizedCallMethodElementX) |
- ? element.memberContext |
- : element; |
- bool isJsInterop = false; |
- if (element is MemberElement) { |
- isJsInterop = closedWorld.nativeData.isJsInteropMember(element); |
- } else if (element is ClassElement) { |
- // TODO(johnniwinther): Can we meet classes here? |
- isJsInterop = closedWorld.nativeData.isJsInteropClass(element); |
- } |
- return _elementResults.putIfAbsent( |
- element, |
- () => new GlobalTypeInferenceElementResultImpl( |
- element, |
- _inferrer.inferrer.inTreeData[key], |
+ MemberElement key = (member is SynthesizedCallMethodElementX) |
+ ? member.memberContext |
+ : member; |
+ bool isJsInterop = closedWorld.nativeData.isJsInteropMember(member); |
+ return _memberResults.putIfAbsent( |
+ member, |
+ () => new GlobalTypeInferenceMemberResult( |
+ member, |
+ _inferrer.inferrer.lookupDataOfMember(key), |
_inferrer, |
isJsInterop, |
dynamicType)); |
} |
+ // TODO(sigmund,johnniwinther): compute result objects eagerly and make it an |
+ // error to query for results that don't exist. |
+ GlobalTypeInferenceElementResult resultOfParameter( |
+ ParameterElement parameter) { |
+ return _parameterResults.putIfAbsent( |
+ parameter, |
+ () => new GlobalTypeInferenceParameterResult( |
+ parameter, _inferrer, dynamicType)); |
+ } |
+ |
GlobalTypeInferenceResults( |
this._inferrer, this.closedWorld, TypeSystem types); |