Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(674)

Side by Side Diff: pkg/kernel/lib/transformations/argument_extraction_for_redirecting.dart

Issue 2944433002: Add tests for handling closures in LocalInitializers (Closed)
Patch Set: Merge in latest changes in master (e340ee517a) Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/kernel/lib/transformations/closure/converter.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library kernel.transformations.argument_extraction_for_redirecting;
6
7 import '../ast.dart'
8 show
9 Program,
10 Constructor,
11 RedirectingInitializer,
12 Library,
13 LocalInitializer,
14 VariableDeclaration,
15 VariableGet,
16 Expression,
17 NamedExpression;
18 import '../core_types.dart' show CoreTypes;
19 import '../visitor.dart' show Transformer;
20
21 Program transformProgram(CoreTypes coreTypes, Program program) {
22 new ArgumentExtractionForRedirecting().visitProgram(program);
23 return program;
24 }
25
26 void transformLibraries(CoreTypes coreTypes, List<Library> libraries) {
27 var transformer = new ArgumentExtractionForRedirecting();
28 for (var library in libraries) {
29 transformer.visitLibrary(library);
30 }
31 }
32
33 class ArgumentExtractionForRedirecting extends Transformer {
34 visitConstructor(Constructor node) {
35 if (node.initializers.length == 1 &&
36 node.initializers[0] is RedirectingInitializer) {
37 int index = 0;
38 RedirectingInitializer redirectingInitializer = node.initializers[0];
39 List<Expression> positionalArguments =
40 redirectingInitializer.arguments.positional;
41 List<NamedExpression> namedArguments =
42 redirectingInitializer.arguments.named;
43 for (int i = 0; i < positionalArguments.length; i++) {
44 Expression argument = positionalArguments[i];
45 VariableDeclaration extractedArgument =
46 new VariableDeclaration("extracted#$index", initializer: argument);
47 LocalInitializer initializer = new LocalInitializer(extractedArgument)
48 ..parent = node;
49 node.initializers.insert(index++, initializer);
50 positionalArguments[i] = new VariableGet(extractedArgument)
51 ..parent = redirectingInitializer.arguments;
52 }
53 for (int i = 0; i < namedArguments.length; i++) {
54 Expression argument = namedArguments[i].value;
55 VariableDeclaration extractedArgument =
56 new VariableDeclaration("extracted#$index", initializer: argument);
57 LocalInitializer initializer = new LocalInitializer(extractedArgument)
58 ..parent = node;
59 node.initializers.insert(index++, initializer);
60 namedArguments[i].value = new VariableGet(extractedArgument)
61 ..parent = redirectingInitializer.arguments;
62 }
63 }
64 return super.visitConstructor(node);
65 }
66 }
OLDNEW
« no previous file with comments | « no previous file | pkg/kernel/lib/transformations/closure/converter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698