Index: pkg/compiler/lib/src/ssa/kernel_impact.dart |
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart |
index 15efe23e8b2da8e019c868e3dae9b1b49672008c..f03bd1f61372d7b4ae273ad2d6e43e6eb6ff3e92 100644 |
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart |
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart |
@@ -5,6 +5,7 @@ |
import 'package:kernel/ast.dart' as ir; |
import '../common.dart'; |
+import '../common/names.dart'; |
import '../compiler.dart'; |
import '../constants/expressions.dart'; |
import '../dart_types.dart'; |
@@ -243,10 +244,17 @@ class KernelImpactBuilder extends ir.Visitor { |
@override |
void visitMethodInvocation(ir.MethodInvocation invocation) { |
- invocation.receiver.accept(this); |
+ var receiver = invocation.receiver; |
+ if (receiver is ir.VariableGet && |
+ receiver.variable.isFinal && |
+ receiver.variable.parent is ir.FunctionDeclaration) { |
+ // Invocation of a local function. No need for dynamic use. |
+ } else { |
+ invocation.receiver.accept(this); |
+ impactBuilder.registerDynamicUse( |
+ new DynamicUse(astAdapter.getSelector(invocation), null)); |
+ } |
_visitArguments(invocation.arguments); |
- impactBuilder.registerDynamicUse( |
- new DynamicUse(astAdapter.getSelector(invocation), null)); |
} |
@override |
@@ -265,11 +273,6 @@ class KernelImpactBuilder extends ir.Visitor { |
} |
@override |
- void visitNot(ir.Not not) { |
- not.operand.accept(this); |
- } |
- |
- @override |
void visitAssertStatement(ir.AssertStatement node) { |
impactBuilder.registerFeature( |
node.message != null ? Feature.ASSERT_WITH_MESSAGE : Feature.ASSERT); |
@@ -277,5 +280,19 @@ class KernelImpactBuilder extends ir.Visitor { |
} |
@override |
+ void visitStringConcatenation(ir.StringConcatenation node) { |
+ impactBuilder.registerFeature(Feature.STRING_INTERPOLATION); |
+ impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION); |
+ node.visitChildren(this); |
+ } |
+ |
+ @override |
+ void visitFunctionDeclaration(ir.FunctionDeclaration node) { |
+ impactBuilder |
+ .registerStaticUse(new StaticUse.closure(astAdapter.getElement(node))); |
+ node.visitChildren(this); |
+ } |
+ |
+ @override |
void defaultNode(ir.Node node) => node.visitChildren(this); |
} |