[cfe] New invocation nodes for property access in collection transformer
Change-Id: Ie70706e8b00129d60910a96f8a9704067cd0752f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/200425
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Aske Simon Christensen <askesc@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index 60ea42b..58aa856 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -574,7 +574,7 @@
List<Statement> body) {
Expression value = entry.expression.accept<TreeNode>(this);
- final DartType entryType = new InterfaceType(_mapEntryClass,
+ final InterfaceType entryType = new InterfaceType(_mapEntryClass,
_currentLibrary.nonNullable, <DartType>[keyType, valueType]);
final bool typeMatches = entry.entryType != null &&
_typeEnvironment.isSubtypeOf(
@@ -603,15 +603,15 @@
VariableDeclaration keyVar = _createVariable(
_createImplicitAs(
entry.expression.fileOffset,
- _createGetKey(
- entry.expression.fileOffset, _createVariableGet(variable)),
+ _createGetKey(entry.expression.fileOffset,
+ _createVariableGet(variable), entryType),
keyType),
keyType);
VariableDeclaration valueVar = _createVariable(
_createImplicitAs(
entry.expression.fileOffset,
- _createGetValue(
- entry.expression.fileOffset, _createVariableGet(variable)),
+ _createGetValue(entry.expression.fileOffset,
+ _createVariableGet(variable), entryType),
valueType),
valueType);
loopBody = _createBlock(<Statement>[
@@ -630,13 +630,13 @@
entry.expression.fileOffset,
_createVariableGet(result),
receiverType,
- _createGetKey(
- entry.expression.fileOffset, _createVariableGet(variable)),
- _createGetValue(
- entry.expression.fileOffset, _createVariableGet(variable))));
+ _createGetKey(entry.expression.fileOffset,
+ _createVariableGet(variable), entryType),
+ _createGetValue(entry.expression.fileOffset,
+ _createVariableGet(variable), entryType)));
}
Statement statement = _createForInStatement(entry.fileOffset, variable,
- _createGetEntries(entry.fileOffset, value), loopBody);
+ _createGetEntries(entry.fileOffset, value, receiverType), loopBody);
if (entry.isNullAware) {
statement = _createIf(
@@ -1003,25 +1003,55 @@
return new IfStatement(condition, then, otherwise)..fileOffset = fileOffset;
}
- PropertyGet _createGetKey(int fileOffset, Expression receiver) {
+ Expression _createGetKey(
+ int fileOffset, Expression receiver, InterfaceType entryType) {
assert(fileOffset != null);
assert(fileOffset != TreeNode.noOffset);
- return new PropertyGet(receiver, new Name('key'), _mapEntryKey)
- ..fileOffset = fileOffset;
+ if (useNewMethodInvocationEncoding) {
+ DartType resultType = Substitution.fromInterfaceType(entryType)
+ .substituteType(_mapEntryKey.type);
+ return new InstanceGet(
+ InstanceAccessKind.Instance, receiver, new Name('key'),
+ interfaceTarget: _mapEntryKey, resultType: resultType)
+ ..fileOffset = fileOffset;
+ } else {
+ return new PropertyGet(receiver, new Name('key'), _mapEntryKey)
+ ..fileOffset = fileOffset;
+ }
}
- PropertyGet _createGetValue(int fileOffset, Expression receiver) {
+ Expression _createGetValue(
+ int fileOffset, Expression receiver, InterfaceType entryType) {
assert(fileOffset != null);
assert(fileOffset != TreeNode.noOffset);
- return new PropertyGet(receiver, new Name('value'), _mapEntryValue)
- ..fileOffset = fileOffset;
+ if (useNewMethodInvocationEncoding) {
+ DartType resultType = Substitution.fromInterfaceType(entryType)
+ .substituteType(_mapEntryValue.type);
+ return new InstanceGet(
+ InstanceAccessKind.Instance, receiver, new Name('value'),
+ interfaceTarget: _mapEntryValue, resultType: resultType)
+ ..fileOffset = fileOffset;
+ } else {
+ return new PropertyGet(receiver, new Name('value'), _mapEntryValue)
+ ..fileOffset = fileOffset;
+ }
}
- PropertyGet _createGetEntries(int fileOffset, Expression receiver) {
+ Expression _createGetEntries(
+ int fileOffset, Expression receiver, InterfaceType mapType) {
assert(fileOffset != null);
assert(fileOffset != TreeNode.noOffset);
- return new PropertyGet(receiver, new Name('entries'), _mapEntries)
- ..fileOffset = fileOffset;
+ if (useNewMethodInvocationEncoding) {
+ DartType resultType = Substitution.fromInterfaceType(mapType)
+ .substituteType(_mapEntries.getterType);
+ return new InstanceGet(
+ InstanceAccessKind.Instance, receiver, new Name('entries'),
+ interfaceTarget: _mapEntries, resultType: resultType)
+ ..fileOffset = fileOffset;
+ } else {
+ return new PropertyGet(receiver, new Name('entries'), _mapEntries)
+ ..fileOffset = fileOffset;
+ }
}
ForStatement _createForStatement(