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

Side by Side Diff: pkg/kernel/lib/transformations/closure/mock.dart

Issue 2937213002: Remove ContextClass that is not needed since we're using Vectors (Closed)
Patch Set: Merge in latest changes in master (f99509ad42) Created 3 years, 6 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
OLDNEW
(Empty)
1 // Copyright (c) 2016, 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.closure.mock;
6
7 import '../../ast.dart'
8 show
9 Arguments,
10 Block,
11 Class,
12 Constructor,
13 ConstructorInvocation,
14 DartType,
15 DynamicType,
16 EmptyStatement,
17 Expression,
18 ExpressionStatement,
19 Field,
20 FieldInitializer,
21 FunctionNode,
22 Initializer,
23 IntLiteral,
24 Library,
25 MethodInvocation,
26 Name,
27 NullLiteral,
28 Procedure,
29 ProcedureKind,
30 Program,
31 PropertyGet,
32 ReturnStatement,
33 Source,
34 Statement,
35 StaticInvocation,
36 Supertype,
37 TreeNode,
38 VariableDeclaration,
39 VariableGet;
40
41 import '../../core_types.dart' show CoreTypes;
42
43 import '../../frontend/accessors.dart'
44 show
45 Accessor,
46 IndexAccessor,
47 PropertyAccessor,
48 ThisPropertyAccessor,
49 VariableAccessor;
50
51 /// TODO(dmitryas): make the "[]=" operator return the value.
52 /// Extend the program with this mock:
53 ///
54 /// class Context {
55 /// final List list;
56 /// var parent;
57 /// Context(int i) : list = new List(i);
58 /// operator[] (int i) => list[i];
59 /// operator[]= (int i, value) {
60 /// list[i] = value;
61 /// }
62 /// Context copy() {
63 /// Context c = new Context(list.length);
64 /// c.parent = parent;
65 /// c.list.setRange(0, list.length, list);
66 /// return c;
67 /// }
68 /// }
69 ///
70 /// Returns the mock.
71 Library mockUpContextLibrary(CoreTypes coreTypes) {
72 String fileUri = "dart:mock";
73
74 /// final List list;
75 Field listField = new Field(new Name("list"),
76 type: coreTypes.listClass.rawType, isFinal: true, fileUri: fileUri);
77 Accessor listFieldAccessor = new ThisPropertyAccessor(
78 listField.name, listField, null, TreeNode.noOffset);
79
80 /// var parent;
81 Field parentField = new Field(new Name("parent"), fileUri: fileUri);
82 Accessor parentFieldAccessor = new ThisPropertyAccessor(
83 parentField.name, parentField, parentField, TreeNode.noOffset);
84
85 List<Field> fields = <Field>[listField, parentField];
86
87 /// Context(int i) : list = new List(i);
88 VariableDeclaration iParameter = new VariableDeclaration("i",
89 type: coreTypes.intClass.rawType, isFinal: true);
90
91 // TODO(karlklose): use the default factory when it is exposed again.
92 Procedure listConstructor = coreTypes.listClass.procedures
93 .firstWhere((Procedure p) => p.name.name == 'filled');
94
95 Constructor constructor = new Constructor(
96 new FunctionNode(new EmptyStatement(),
97 positionalParameters: <VariableDeclaration>[iParameter]),
98 name: new Name(""),
99 initializers: <Initializer>[
100 new FieldInitializer(
101 listField,
102 new StaticInvocation(
103 listConstructor,
104 new Arguments(<Expression>[
105 new VariableAccessor(iParameter, null, TreeNode.noOffset)
106 .buildSimpleRead(),
107 new NullLiteral(),
108 ], types: <DartType>[
109 const DynamicType()
110 ])))
111 ]);
112
113 /// operator[] (int i) => list[i];
114 iParameter = new VariableDeclaration("i",
115 type: coreTypes.intClass.rawType, isFinal: true);
116 Accessor accessor = IndexAccessor.make(
117 listFieldAccessor.buildSimpleRead(),
118 new VariableAccessor(iParameter, null, TreeNode.noOffset)
119 .buildSimpleRead(),
120 null,
121 null);
122 Procedure indexGet = new Procedure(
123 new Name("[]"),
124 ProcedureKind.Operator,
125 new FunctionNode(new ReturnStatement(accessor.buildSimpleRead()),
126 positionalParameters: <VariableDeclaration>[iParameter]),
127 fileUri: fileUri);
128
129 /// operator[]= (int i, value) {
130 /// list[i] = value;
131 /// }
132 iParameter = new VariableDeclaration("i",
133 type: coreTypes.intClass.rawType, isFinal: true);
134 VariableDeclaration valueParameter =
135 new VariableDeclaration("value", isFinal: true);
136 accessor = IndexAccessor.make(
137 listFieldAccessor.buildSimpleRead(),
138 new VariableAccessor(iParameter, null, TreeNode.noOffset)
139 .buildSimpleRead(),
140 null,
141 null);
142 Expression expression = accessor.buildAssignment(
143 new VariableAccessor(valueParameter, null, TreeNode.noOffset)
144 .buildSimpleRead(),
145 voidContext: true);
146 Procedure indexSet = new Procedure(
147 new Name("[]="),
148 ProcedureKind.Operator,
149 new FunctionNode(new ExpressionStatement(expression),
150 positionalParameters: <VariableDeclaration>[
151 iParameter,
152 valueParameter
153 ]),
154 fileUri: fileUri);
155
156 /// Context copy() {
157 /// Context c = new Context(list.length);
158 /// c.parent = parent;
159 /// c.list.setRange(0, list.length, list);
160 /// return c;
161 /// }
162 VariableDeclaration c = new VariableDeclaration("c",
163 initializer: new ConstructorInvocation(
164 constructor,
165 new Arguments(<Expression>[
166 new PropertyGet(
167 listFieldAccessor.buildSimpleRead(), new Name("length"))
168 ])));
169 Accessor accessCParent = PropertyAccessor.make(
170 new VariableGet(c), parentField.name, parentField, parentField);
171 Accessor accessCList = PropertyAccessor.make(
172 new VariableGet(c), listField.name, listField, null);
173 List<Statement> statements = <Statement>[
174 c,
175 new ExpressionStatement(accessCParent.buildAssignment(
176 parentFieldAccessor.buildSimpleRead(),
177 voidContext: true)),
178 new ExpressionStatement(new MethodInvocation(
179 accessCList.buildSimpleRead(),
180 new Name("setRange"),
181 new Arguments(<Expression>[
182 new IntLiteral(0),
183 new PropertyGet(
184 listFieldAccessor.buildSimpleRead(), new Name("length")),
185 listFieldAccessor.buildSimpleRead()
186 ]))),
187 new ReturnStatement(new VariableGet(c))
188 ];
189 Procedure copy = new Procedure(new Name("copy"), ProcedureKind.Method,
190 new FunctionNode(new Block(statements)),
191 fileUri: fileUri);
192
193 List<Procedure> procedures = <Procedure>[indexGet, indexSet, copy];
194
195 Class contextClass = new Class(
196 name: "Context",
197 supertype: new Supertype(coreTypes.objectClass, const <DartType>[]),
198 constructors: [constructor],
199 fields: fields,
200 procedures: procedures,
201 fileUri: fileUri);
202 Library mock =
203 new Library(Uri.parse(fileUri), name: "mock", classes: [contextClass])
204 ..fileUri = fileUri;
205
206 return mock;
207 }
208
209 Class mockUpContextForLibraries(CoreTypes coreTypes, List<Library> libraries) {
210 Library mock = mockUpContextLibrary(coreTypes);
211 Program parent = libraries.length > 0 ? libraries[0]?.parent : null;
212 libraries.add(mock);
213 mock.parent = parent;
214 parent?.uriToSource[mock.fileUri] = new Source(<int>[0], const <int>[]);
215 return mock.classes[0];
216 }
217
218 Class mockUpContextForProgram(CoreTypes coreTypes, Program program) {
219 Library mock = mockUpContextLibrary(coreTypes);
220 program.libraries.add(mock);
221 mock.parent = program;
222 program.uriToSource[mock.fileUri] = new Source(<int>[0], const <int>[]);
223 return mock.classes[0];
224 }
OLDNEW
« no previous file with comments | « pkg/kernel/lib/transformations/closure/converter.dart ('k') | pkg/kernel/lib/transformations/closure_conversion.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698