@@ -933,6 +933,11 @@ class ScopeModelBuilder extends ir.Visitor<EvaluationComplexity>
933933 return const EvaluationComplexity .lazy ();
934934 }
935935
936+ @override
937+ EvaluationComplexity visitStaticTearOff (ir.StaticTearOff node) {
938+ return _evaluateImplicitConstant (node);
939+ }
940+
936941 @override
937942 EvaluationComplexity visitStaticSet (ir.StaticSet node) {
938943 node.value = _handleExpression (node.value);
@@ -1029,6 +1034,108 @@ class ScopeModelBuilder extends ir.Visitor<EvaluationComplexity>
10291034 if (receiverComplexity.combine (complexity).isConstant &&
10301035 interfaceTarget is ir.Procedure &&
10311036 interfaceTarget.kind == ir.ProcedureKind .Operator ) {
1037+ // Only operator invocations can be part of constant expressions so we
1038+ // only try to compute an implicit constant when the receiver and all
1039+ // arguments are constant - and are used in an operator call.
1040+ return _evaluateImplicitConstant (node);
1041+ }
1042+ return const EvaluationComplexity .lazy ();
1043+ }
1044+
1045+ @override
1046+ EvaluationComplexity visitInstanceInvocation (ir.InstanceInvocation node) {
1047+ node.receiver = _handleExpression (node.receiver);
1048+ EvaluationComplexity receiverComplexity = _lastExpressionComplexity;
1049+ if (node.arguments.types.isNotEmpty) {
1050+ ir.TreeNode receiver = node.receiver;
1051+ assert (
1052+ ! (receiver is ir.VariableGet &&
1053+ receiver.variable.parent is ir.LocalFunction ),
1054+ "Unexpected local function invocation ${node } "
1055+ "(${node .runtimeType })." );
1056+ VariableUse usage = new VariableUse .instanceTypeArgument (node);
1057+ visitNodesInContext (node.arguments.types, usage);
1058+ }
1059+ EvaluationComplexity complexity = visitArguments (node.arguments);
1060+ ir.Member interfaceTarget = node.interfaceTarget;
1061+ if (receiverComplexity.combine (complexity).isConstant &&
1062+ interfaceTarget is ir.Procedure &&
1063+ interfaceTarget.kind == ir.ProcedureKind .Operator ) {
1064+ // Only operator invocations can be part of constant expressions so we
1065+ // only try to compute an implicit constant when the receiver and all
1066+ // arguments are constant - and are used in an operator call.
1067+ return _evaluateImplicitConstant (node);
1068+ }
1069+ return const EvaluationComplexity .lazy ();
1070+ }
1071+
1072+ @override
1073+ EvaluationComplexity visitDynamicInvocation (ir.DynamicInvocation node) {
1074+ node.receiver = _handleExpression (node.receiver);
1075+ if (node.arguments.types.isNotEmpty) {
1076+ ir.TreeNode receiver = node.receiver;
1077+ assert (
1078+ ! (receiver is ir.VariableGet &&
1079+ receiver.variable.parent is ir.LocalFunction ),
1080+ "Unexpected local function invocation ${node } "
1081+ "(${node .runtimeType })." );
1082+ VariableUse usage = new VariableUse .instanceTypeArgument (node);
1083+ visitNodesInContext (node.arguments.types, usage);
1084+ }
1085+ visitArguments (node.arguments);
1086+ return const EvaluationComplexity .lazy ();
1087+ }
1088+
1089+ @override
1090+ EvaluationComplexity visitFunctionInvocation (ir.FunctionInvocation node) {
1091+ node.receiver = _handleExpression (node.receiver);
1092+ if (node.arguments.types.isNotEmpty) {
1093+ assert (
1094+ ! (node.receiver is ir.VariableGet &&
1095+ ((node.receiver as ir.VariableGet ).variable.parent
1096+ is ir.LocalFunction )),
1097+ "Unexpected local function invocation ${node } "
1098+ "(${node .runtimeType })." );
1099+ VariableUse usage = new VariableUse .instanceTypeArgument (node);
1100+ visitNodesInContext (node.arguments.types, usage);
1101+ }
1102+ visitArguments (node.arguments);
1103+ return const EvaluationComplexity .lazy ();
1104+ }
1105+
1106+ @override
1107+ EvaluationComplexity visitLocalFunctionInvocation (
1108+ ir.LocalFunctionInvocation node) {
1109+ if (node.arguments.types.isNotEmpty) {
1110+ assert (
1111+ node.variable.parent is ir.LocalFunction ,
1112+ "Unexpected variable in local function invocation ${node } "
1113+ "(${node .runtimeType })." );
1114+ VariableUse usage =
1115+ new VariableUse .localTypeArgument (node.variable.parent, node);
1116+ visitNodesInContext (node.arguments.types, usage);
1117+ }
1118+ visitArguments (node.arguments);
1119+ return const EvaluationComplexity .lazy ();
1120+ }
1121+
1122+ @override
1123+ EvaluationComplexity visitEqualsNull (ir.EqualsNull node) {
1124+ node.expression = _handleExpression (node.expression);
1125+ EvaluationComplexity receiverComplexity = _lastExpressionComplexity;
1126+ if (receiverComplexity.isConstant) {
1127+ return _evaluateImplicitConstant (node);
1128+ }
1129+ return const EvaluationComplexity .lazy ();
1130+ }
1131+
1132+ @override
1133+ EvaluationComplexity visitEqualsCall (ir.EqualsCall node) {
1134+ node.left = _handleExpression (node.left);
1135+ EvaluationComplexity leftComplexity = _lastExpressionComplexity;
1136+ node.right = _handleExpression (node.right);
1137+ EvaluationComplexity rightComplexity = _lastExpressionComplexity;
1138+ if (leftComplexity.combine (rightComplexity).isConstant) {
10321139 return _evaluateImplicitConstant (node);
10331140 }
10341141 return const EvaluationComplexity .lazy ();
@@ -1044,13 +1151,59 @@ class ScopeModelBuilder extends ir.Visitor<EvaluationComplexity>
10441151 return const EvaluationComplexity .lazy ();
10451152 }
10461153
1154+ @override
1155+ EvaluationComplexity visitInstanceGet (ir.InstanceGet node) {
1156+ node.receiver = _handleExpression (node.receiver);
1157+ EvaluationComplexity complexity = _lastExpressionComplexity;
1158+ if (complexity.isConstant && node.name.name == 'length' ) {
1159+ return _evaluateImplicitConstant (node);
1160+ }
1161+ return const EvaluationComplexity .lazy ();
1162+ }
1163+
1164+ @override
1165+ EvaluationComplexity visitInstanceTearOff (ir.InstanceTearOff node) {
1166+ node.receiver = _handleExpression (node.receiver);
1167+ return const EvaluationComplexity .lazy ();
1168+ }
1169+
1170+ @override
1171+ EvaluationComplexity visitDynamicGet (ir.DynamicGet node) {
1172+ node.receiver = _handleExpression (node.receiver);
1173+ EvaluationComplexity complexity = _lastExpressionComplexity;
1174+ if (complexity.isConstant && node.name.name == 'length' ) {
1175+ return _evaluateImplicitConstant (node);
1176+ }
1177+ return const EvaluationComplexity .lazy ();
1178+ }
1179+
1180+ @override
1181+ EvaluationComplexity visitFunctionTearOff (ir.FunctionTearOff node) {
1182+ node.receiver = _handleExpression (node.receiver);
1183+ return const EvaluationComplexity .lazy ();
1184+ }
1185+
10471186 @override
10481187 EvaluationComplexity visitPropertySet (ir.PropertySet node) {
10491188 node.receiver = _handleExpression (node.receiver);
10501189 node.value = _handleExpression (node.value);
10511190 return const EvaluationComplexity .lazy ();
10521191 }
10531192
1193+ @override
1194+ EvaluationComplexity visitInstanceSet (ir.InstanceSet node) {
1195+ node.receiver = _handleExpression (node.receiver);
1196+ node.value = _handleExpression (node.value);
1197+ return const EvaluationComplexity .lazy ();
1198+ }
1199+
1200+ @override
1201+ EvaluationComplexity visitDynamicSet (ir.DynamicSet node) {
1202+ node.receiver = _handleExpression (node.receiver);
1203+ node.value = _handleExpression (node.value);
1204+ return const EvaluationComplexity .lazy ();
1205+ }
1206+
10541207 @override
10551208 EvaluationComplexity visitNot (ir.Not node) {
10561209 node.operand = _handleExpression (node.operand);
0 commit comments