@@ -9,7 +9,11 @@ import 'package:kernel/class_hierarchy.dart' as ir;
99import 'package:kernel/type_environment.dart' as ir;
1010
1111import '../common.dart' ;
12+ import '../common/elements.dart' ;
13+ import '../elements/entities.dart' ;
14+ import '../elements/types.dart' ;
1215import '../ir/scope.dart' ;
16+ import '../kernel/element_map.dart' ;
1317import '../serialization/serialization.dart' ;
1418import '../util/enumset.dart' ;
1519import 'constants.dart' ;
@@ -21,6 +25,7 @@ import 'util.dart';
2125/// Visitor that builds an [ImpactData] object for the world impact.
2226class ImpactBuilder extends StaticTypeVisitor implements ImpactRegistry {
2327 final ImpactData _data = ImpactData ();
28+ final KernelToElementMap _elementMap;
2429
2530 @override
2631 final VariableScopeModel variableScopeModel;
@@ -34,12 +39,24 @@ class ImpactBuilder extends StaticTypeVisitor implements ImpactRegistry {
3439 @override
3540 final inferEffectivelyFinalVariableTypes;
3641
37- ImpactBuilder (this .staticTypeContext, StaticTypeCacheImpl staticTypeCache,
38- ir.ClassHierarchy classHierarchy, this .variableScopeModel,
39- {this .useAsserts = false , this .inferEffectivelyFinalVariableTypes = true })
42+ ImpactBuilder (
43+ this ._elementMap,
44+ this .staticTypeContext,
45+ StaticTypeCacheImpl staticTypeCache,
46+ ir.ClassHierarchy classHierarchy,
47+ this .variableScopeModel,
48+ {this .useAsserts = false ,
49+ this .inferEffectivelyFinalVariableTypes = true })
4050 : super (
4151 staticTypeContext.typeEnvironment, classHierarchy, staticTypeCache);
4252
53+ CommonElements get _commonElements => _elementMap.commonElements;
54+
55+ DiagnosticReporter get _reporter => _elementMap.reporter;
56+
57+ String _typeToString (DartType type) =>
58+ type.toStructuredText (_elementMap.types, _elementMap.options);
59+
4360 /// Return the named arguments names as a list of strings.
4461 List <String > _getNamedArguments (ir.Arguments arguments) =>
4562 arguments.named.map ((n) => n.name).toList ();
@@ -313,6 +330,23 @@ class ImpactBuilder extends StaticTypeVisitor implements ImpactRegistry {
313330 registerProcedureNode (procedure);
314331 }
315332
333+ void _handleConstConstructorInvocation (ir.ConstructorInvocation node) {
334+ assert (node.isConst);
335+ ConstructorEntity constructor = _elementMap.getConstructor (node.target);
336+ if (_commonElements.isSymbolConstructor (constructor)) {
337+ DartType argumentType = _elementMap.getDartType (
338+ node.arguments.positional.first.getStaticType (staticTypeContext));
339+ // TODO(joshualitt): Does the CFE check this for us?
340+ if (argumentType != _commonElements.stringType) {
341+ // TODO(het): Get the actual span for the Symbol constructor argument
342+ _reporter.reportErrorMessage (CURRENT_ELEMENT_SPANNABLE ,
343+ MessageKind .STRING_EXPECTED , {'type' : _typeToString (argumentType)});
344+ return ;
345+ }
346+ registerConstSymbolConstructorInvocationNode ();
347+ }
348+ }
349+
316350 @override
317351 void handleConstructorInvocation (ir.ConstructorInvocation node,
318352 ArgumentTypes argumentTypes, ir.DartType resultType) {
@@ -325,7 +359,7 @@ class ImpactBuilder extends StaticTypeVisitor implements ImpactRegistry {
325359 getDeferredImport (node),
326360 isConst: node.isConst);
327361 if (node.isConst) {
328- registerConstConstructorInvocationNode (node);
362+ _handleConstConstructorInvocation (node);
329363 }
330364 }
331365
@@ -959,13 +993,15 @@ class ImpactBuilder extends StaticTypeVisitor implements ImpactRegistry {
959993 }
960994
961995 @override
962- void registerConstConstructorInvocationNode (ir.ConstructorInvocation node) {
963- _data._constConstructorInvocationNodes ?? = [];
964- _data._constConstructorInvocationNodes.add (node);
996+ void registerConstSymbolConstructorInvocationNode () {
997+ _data._hasConstSymbolConstructorInvocation = true ;
965998 }
966999}
9671000
9681001/// Data object that contains the world impact data derived purely from kernel.
1002+ /// It is critical that all of the data in this class be invariant to changes in
1003+ /// the AST that occur after modular compilation and before deserializing the
1004+ /// impact data.
9691005class ImpactData {
9701006 static const String tag = 'ImpactData' ;
9711007
@@ -1012,7 +1048,7 @@ class ImpactData {
10121048 List <ir.Procedure > _procedureNodes;
10131049 List <ir.SwitchStatement > _switchStatementNodes;
10141050 List <ir.StaticInvocation > _staticInvocationNodes;
1015- List <ir. ConstructorInvocation > _constConstructorInvocationNodes ;
1051+ bool _hasConstSymbolConstructorInvocation = false ;
10161052
10171053 ImpactData ();
10181054
@@ -1109,8 +1145,7 @@ class ImpactData {
11091145 source.readTreeNodes< ir.SwitchStatement > (emptyAsNull: true );
11101146 _staticInvocationNodes =
11111147 source.readTreeNodes< ir.StaticInvocation > (emptyAsNull: true );
1112- _constConstructorInvocationNodes =
1113- source.readTreeNodes< ir.ConstructorInvocation > (emptyAsNull: true );
1148+ _hasConstSymbolConstructorInvocation = source.readBool ();
11141149 source.end (tag);
11151150 }
11161151
@@ -1186,13 +1221,12 @@ class ImpactData {
11861221 sink.writeList (_runtimeTypeUses, (_RuntimeTypeUse o) => o.toDataSink (sink),
11871222 allowNull: true );
11881223
1189- // TODO(johnniwinther): Remove these when CFE provides constants.
11901224 sink.writeMemberNodes (_constructorNodes, allowNull: true );
11911225 sink.writeMemberNodes (_fieldNodes, allowNull: true );
11921226 sink.writeMemberNodes (_procedureNodes, allowNull: true );
11931227 sink.writeTreeNodes (_switchStatementNodes, allowNull: true );
11941228 sink.writeTreeNodes (_staticInvocationNodes, allowNull: true );
1195- sink.writeTreeNodes (_constConstructorInvocationNodes, allowNull : true );
1229+ sink.writeBool (_hasConstSymbolConstructorInvocation );
11961230
11971231 sink.end (tag);
11981232 }
@@ -1527,10 +1561,8 @@ class ImpactData {
15271561 registry.registerStaticInvocationNode (data);
15281562 }
15291563 }
1530- if (_constConstructorInvocationNodes != null ) {
1531- for (ir.ConstructorInvocation data in _constConstructorInvocationNodes) {
1532- registry.registerConstConstructorInvocationNode (data);
1533- }
1564+ if (_hasConstSymbolConstructorInvocation) {
1565+ registry.registerConstSymbolConstructorInvocationNode ();
15341566 }
15351567 }
15361568}
0 commit comments