Skip to content

Commit 9e89e91

Browse files
jensjohaCommit Queue
authored andcommitted
[CFE] Fix crash in expression evaluation related to type parameters
Change-Id: I9e86877a75c937fbb313ad1e492e15ced4a1be9d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448400 Commit-Queue: Jens Johansen <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent a757154 commit 9e89e91

File tree

5 files changed

+53
-25
lines changed

5 files changed

+53
-25
lines changed

pkg/front_end/lib/src/base/incremental_compiler.dart

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ import 'package:kernel/kernel.dart'
5656
VariableSet,
5757
VisitorDefault,
5858
VisitorVoidMixin,
59-
Member;
59+
Member,
60+
TypeParameterType;
6061
import 'package:kernel/kernel.dart' as kernel show Combinator;
6162
import 'package:kernel/reference_from_index.dart';
6263
import 'package:kernel/target/changed_structure_notifier.dart'
6364
show ChangedStructureNotifier;
65+
import 'package:kernel/type_algebra.dart' show Substitution;
6466
import 'package:package_config/package_config.dart' show Package, PackageConfig;
6567

6668
import '../api_prototype/experimental_flags.dart';
@@ -1863,6 +1865,25 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
18631865
cls,
18641866
offset,
18651867
);
1868+
1869+
Map<TypeParameter, TypeParameterType> substitutionMap = {};
1870+
Map<String, TypeParameter> typeDefinitionNamesMap = {};
1871+
for (TypeParameter typeDefinition in typeDefinitions) {
1872+
if (typeDefinition.name != null) {
1873+
typeDefinitionNamesMap[typeDefinition.name!] = typeDefinition;
1874+
}
1875+
}
1876+
for (TypeParameter typeParameter in foundScope.typeParameters) {
1877+
TypeParameter? match = typeDefinitionNamesMap[typeParameter.name];
1878+
if (match != null) {
1879+
substitutionMap[typeParameter] = new TypeParameterType(
1880+
match,
1881+
match.computeNullabilityFromBound(),
1882+
);
1883+
}
1884+
}
1885+
Substitution substitution = Substitution.fromMap(substitutionMap);
1886+
18661887
final bool alwaysInlineConstants = lastGoodKernelTarget
18671888
.backendTarget
18681889
.constantsBackend
@@ -1886,7 +1907,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
18861907
extraKnownVariables.add(
18871908
new VariableDeclarationImpl(
18881909
def.key,
1889-
type: def.value.type,
1910+
type: substitution.substituteType(def.value.type),
18901911
isConst: true,
18911912
hasDeclaredInitializer: true,
18921913
initializer: def.value.initializer,
@@ -1905,7 +1926,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
19051926
extraKnownVariables.add(
19061927
new VariableDeclarationImpl(
19071928
def.key,
1908-
type: def.value.type,
1929+
type: substitution.substituteType(def.value.type),
19091930
isConst: false,
19101931
)..fileOffset = def.value.fileOffset,
19111932
);
@@ -1914,7 +1935,9 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
19141935
_ExtensionTypeFinder.isOrContainsExtensionType(
19151936
def.value.type,
19161937
)) {
1917-
usedDefinitions[def.key] = def.value.type;
1938+
usedDefinitions[def.key] = substitution.substituteType(
1939+
def.value.type,
1940+
);
19181941
}
19191942
}
19201943
}

pkg/front_end/test/scopes/data/constructor.dart

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,7 @@ class Foo2<E extends num> {
101101
class=Foo2,
102102
member=foo,
103103
static,
104-
typeParameters=[
105-
Foo2.E,
106-
Foo2.foo.E],
104+
typeParameters=[Foo2.foo.E],
107105
variables=[a]
108106
*/
109107
x;
@@ -131,7 +129,6 @@ class Foo2<E extends num> {
131129
class=Foo2,
132130
member=bar,
133131
static,
134-
typeParameters=[Foo2.E],
135132
variables=[a]
136133
*/
137134
x;
@@ -143,9 +140,7 @@ class Foo2<E extends num> {
143140
class=Foo2,
144141
member=baz,
145142
static,
146-
typeParameters=[
147-
Foo2.E,
148-
Foo2.baz.E],
143+
typeParameters=[Foo2.baz.E],
149144
variables=[a]
150145
*/
151146
x;

pkg/front_end/test/scopes/data/mixins.dart

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,15 @@ mixin GenericMixin<T> {
9494

9595
static var field = /*
9696
class=GenericMixin,
97-
member=field,
98-
typeParameters=[GenericMixin.T]
97+
member=field
9998
*/
10099
x;
101100

102101
static empty() {
103102
/*
104103
class=GenericMixin,
105104
member=empty,
106-
static,
107-
typeParameters=[GenericMixin.T]
105+
static
108106
*/
109107
x;
110108
}
@@ -114,7 +112,6 @@ mixin GenericMixin<T> {
114112
class=GenericMixin,
115113
member=oneParameter,
116114
static,
117-
typeParameters=[GenericMixin.T],
118115
variables=[a]
119116
*/
120117
x;
@@ -125,7 +122,6 @@ mixin GenericMixin<T> {
125122
class=GenericMixin,
126123
member=twoParameters,
127124
static,
128-
typeParameters=[GenericMixin.T],
129125
variables=[
130126
a,
131127
b]
@@ -138,7 +134,6 @@ mixin GenericMixin<T> {
138134
class=GenericMixin,
139135
member=optionalParameter,
140136
static,
141-
typeParameters=[GenericMixin.T],
142137
variables=[
143138
a,
144139
b]
@@ -151,7 +146,6 @@ mixin GenericMixin<T> {
151146
class=GenericMixin,
152147
member=namedParameter,
153148
static,
154-
typeParameters=[GenericMixin.T],
155149
variables=[
156150
a,
157151
b]
@@ -164,9 +158,7 @@ mixin GenericMixin<T> {
164158
class=GenericMixin,
165159
member=oneTypeParameter,
166160
static,
167-
typeParameters=[
168-
GenericMixin.T,
169-
GenericMixin.oneTypeParameter.T]
161+
typeParameters=[GenericMixin.oneTypeParameter.T]
170162
*/
171163
x;
172164
}

pkg/kernel/lib/dart_scope_calculator.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,19 @@ class DartScopeBuilder2 extends VisitorDefault<void> with VisitorVoidMixin {
111111
}
112112
}
113113
}
114-
// TODO(jensj): If the current member is static and we're in a class we have
115-
// to skip the typeParameters from the class.
114+
int fromIndex = 0;
115+
if (_currentCls != null &&
116+
_currentMember != null &&
117+
!_currentMember!.isInstanceMember &&
118+
_currentMember is! Constructor) {
119+
// We're inside a class, but currently in a static member (that is not a
120+
// constructor). The first list in [typeParameterScopes] are the class
121+
// ones, so we'll skip those here.
122+
fromIndex = 1;
123+
}
116124
List<TypeParameter> typeParameters = [];
117-
for (List<TypeParameter> typeParameterScope in typeParameterScopes) {
125+
for (int i = fromIndex; i < typeParameterScopes.length; i++) {
126+
List<TypeParameter> typeParameterScope = typeParameterScopes[i];
118127
typeParameters.addAll(typeParameterScope);
119128
}
120129
DartScope2 findScope = new DartScope2(node, _library, _currentCls,

pkg/kernel/test/dart_scope_calculator_test.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,15 @@ class ScopeTestingBinaryPrinter extends BinaryPrinter {
350350

351351
List<Object> expectedTypeParameters =
352352
getTypeParameterIndexerForTesting().index.keys.toList();
353+
if (currentMember != null &&
354+
!currentMember!.isInstanceMember &&
355+
currentMember is! Constructor &&
356+
currentClass != null &&
357+
currentClass!.typeParameters.isNotEmpty) {
358+
expectedTypeParameters = (expectedTypeParameters.toSet()
359+
..removeAll(currentClass!.typeParameters))
360+
.toList();
361+
}
353362

354363
VariableIndexer2? varIndexer =
355364
getVariableIndexerForTesting() as VariableIndexer2?;

0 commit comments

Comments
 (0)