OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library fasta.kernel_enum_builder; | 5 library fasta.kernel_enum_builder; |
6 | 6 |
7 import 'package:kernel/ast.dart' | 7 import 'package:kernel/ast.dart' |
8 show | 8 show |
9 Arguments, | 9 Arguments, |
10 AsyncMarker, | 10 AsyncMarker, |
(...skipping 14 matching lines...) Expand all Loading... |
25 ReturnStatement, | 25 ReturnStatement, |
26 StaticGet, | 26 StaticGet, |
27 StringLiteral, | 27 StringLiteral, |
28 ThisExpression, | 28 ThisExpression, |
29 VariableGet; | 29 VariableGet; |
30 | 30 |
31 import '../errors.dart' show inputError; | 31 import '../errors.dart' show inputError; |
32 | 32 |
33 import '../modifier.dart' show constMask, finalMask, staticMask; | 33 import '../modifier.dart' show constMask, finalMask, staticMask; |
34 | 34 |
35 import "../source/source_class_builder.dart" show SourceClassBuilder; | 35 import '../names.dart' show indexGetName; |
| 36 |
| 37 import '../source/source_class_builder.dart' show SourceClassBuilder; |
36 | 38 |
37 import 'kernel_builder.dart' | 39 import 'kernel_builder.dart' |
38 show | 40 show |
39 Builder, | 41 Builder, |
40 EnumBuilder, | 42 EnumBuilder, |
41 FormalParameterBuilder, | 43 FormalParameterBuilder, |
42 KernelConstructorBuilder, | 44 KernelConstructorBuilder, |
43 KernelFieldBuilder, | 45 KernelFieldBuilder, |
44 KernelFormalParameterBuilder, | 46 KernelFormalParameterBuilder, |
45 KernelLibraryBuilder, | 47 KernelLibraryBuilder, |
46 KernelNamedTypeBuilder, | 48 KernelNamedTypeBuilder, |
47 KernelProcedureBuilder, | 49 KernelProcedureBuilder, |
48 KernelTypeBuilder, | 50 KernelTypeBuilder, |
49 LibraryBuilder, | 51 LibraryBuilder, |
50 MemberBuilder, | 52 MemberBuilder, |
51 MetadataBuilder; | 53 MetadataBuilder, |
52 | 54 Scope; |
53 import '../names.dart' show indexGetName; | |
54 | 55 |
55 class KernelEnumBuilder extends SourceClassBuilder | 56 class KernelEnumBuilder extends SourceClassBuilder |
56 implements EnumBuilder<KernelTypeBuilder, InterfaceType> { | 57 implements EnumBuilder<KernelTypeBuilder, InterfaceType> { |
57 final List<Object> constantNamesAndOffsets; | 58 final List<Object> constantNamesAndOffsets; |
58 | 59 |
59 final MapLiteral toStringMap; | 60 final MapLiteral toStringMap; |
60 | 61 |
61 final KernelTypeBuilder intType; | 62 final KernelTypeBuilder intType; |
62 | 63 |
63 final KernelTypeBuilder stringType; | 64 final KernelTypeBuilder stringType; |
64 | 65 |
65 KernelEnumBuilder.internal( | 66 KernelEnumBuilder.internal( |
66 List<MetadataBuilder> metadata, | 67 List<MetadataBuilder> metadata, |
67 String name, | 68 String name, |
68 Map<String, Builder> members, | 69 Scope scope, |
| 70 Scope constructors, |
69 Class cls, | 71 Class cls, |
70 this.constantNamesAndOffsets, | 72 this.constantNamesAndOffsets, |
71 this.toStringMap, | 73 this.toStringMap, |
72 this.intType, | 74 this.intType, |
73 this.stringType, | 75 this.stringType, |
74 LibraryBuilder parent, | 76 LibraryBuilder parent, |
75 int charOffset) | 77 int charOffset) |
76 : super(metadata, 0, name, null, null, null, members, parent, null, | 78 : super(metadata, 0, name, null, null, null, scope, constructors, parent, |
77 charOffset, cls); | 79 null, charOffset, cls); |
78 | 80 |
79 factory KernelEnumBuilder( | 81 factory KernelEnumBuilder( |
80 List<MetadataBuilder> metadata, | 82 List<MetadataBuilder> metadata, |
81 String name, | 83 String name, |
82 List<Object> constantNamesAndOffsets, | 84 List<Object> constantNamesAndOffsets, |
83 KernelLibraryBuilder parent, | 85 KernelLibraryBuilder parent, |
84 int charOffset, | 86 int charOffset, |
85 int charEndOffset) { | 87 int charEndOffset) { |
86 constantNamesAndOffsets ??= const <Object>[]; | 88 constantNamesAndOffsets ??= const <Object>[]; |
87 // TODO(ahe): These types shouldn't be looked up in scope, they come | 89 // TODO(ahe): These types shouldn't be looked up in scope, they come |
88 // directly from dart:core. | 90 // directly from dart:core. |
89 KernelTypeBuilder intType = parent.addType( | 91 KernelTypeBuilder intType = parent.addType( |
90 new KernelNamedTypeBuilder("int", null, charOffset, parent.fileUri)); | 92 new KernelNamedTypeBuilder("int", null, charOffset, parent.fileUri)); |
91 KernelTypeBuilder stringType = parent.addType( | 93 KernelTypeBuilder stringType = parent.addType( |
92 new KernelNamedTypeBuilder("String", null, charOffset, parent.fileUri)); | 94 new KernelNamedTypeBuilder("String", null, charOffset, parent.fileUri)); |
93 Class cls = new Class(name: name); | 95 Class cls = new Class(name: name); |
94 Map<String, Builder> members = <String, Builder>{}; | 96 Map<String, MemberBuilder> members = <String, MemberBuilder>{}; |
| 97 Map<String, MemberBuilder> constructors = <String, MemberBuilder>{}; |
95 KernelNamedTypeBuilder selfType = | 98 KernelNamedTypeBuilder selfType = |
96 new KernelNamedTypeBuilder(name, null, charOffset, parent.fileUri); | 99 new KernelNamedTypeBuilder(name, null, charOffset, parent.fileUri); |
97 KernelTypeBuilder listType = parent.addType(new KernelNamedTypeBuilder( | 100 KernelTypeBuilder listType = parent.addType(new KernelNamedTypeBuilder( |
98 "List", <KernelTypeBuilder>[selfType], charOffset, parent.fileUri)); | 101 "List", <KernelTypeBuilder>[selfType], charOffset, parent.fileUri)); |
99 | 102 |
100 /// From Dart Programming Language Specification 4th Edition/December 2015: | 103 /// From Dart Programming Language Specification 4th Edition/December 2015: |
101 /// metadata class E { | 104 /// metadata class E { |
102 /// final int index; | 105 /// final int index; |
103 /// const E(this.index); | 106 /// const E(this.index); |
104 /// static const E id0 = const E(0); | 107 /// static const E id0 = const E(0); |
(...skipping 11 matching lines...) Expand all Loading... |
116 "", | 119 "", |
117 null, | 120 null, |
118 <FormalParameterBuilder>[ | 121 <FormalParameterBuilder>[ |
119 new KernelFormalParameterBuilder( | 122 new KernelFormalParameterBuilder( |
120 null, 0, intType, "index", true, parent, charOffset) | 123 null, 0, intType, "index", true, parent, charOffset) |
121 ], | 124 ], |
122 parent, | 125 parent, |
123 charOffset, | 126 charOffset, |
124 charOffset, | 127 charOffset, |
125 charEndOffset); | 128 charEndOffset); |
126 members[""] = constructorBuilder; | 129 constructors[""] = constructorBuilder; |
127 int index = 0; | 130 int index = 0; |
128 List<MapEntry> toStringEntries = <MapEntry>[]; | 131 List<MapEntry> toStringEntries = <MapEntry>[]; |
129 KernelFieldBuilder valuesBuilder = new KernelFieldBuilder( | 132 KernelFieldBuilder valuesBuilder = new KernelFieldBuilder( |
130 null, listType, "values", constMask | staticMask, parent, charOffset); | 133 null, listType, "values", constMask | staticMask, parent, charOffset); |
131 members["values"] = valuesBuilder; | 134 members["values"] = valuesBuilder; |
132 KernelProcedureBuilder toStringBuilder = new KernelProcedureBuilder( | 135 KernelProcedureBuilder toStringBuilder = new KernelProcedureBuilder( |
133 null, | 136 null, |
134 0, | 137 0, |
135 stringType, | 138 stringType, |
136 "toString", | 139 "toString", |
(...skipping 18 matching lines...) Expand all Loading... |
155 null, selfType, name, constMask | staticMask, parent, charOffset); | 158 null, selfType, name, constMask | staticMask, parent, charOffset); |
156 members[name] = fieldBuilder; | 159 members[name] = fieldBuilder; |
157 toStringEntries.add(new MapEntry( | 160 toStringEntries.add(new MapEntry( |
158 new IntLiteral(index), new StringLiteral("$className.$name"))); | 161 new IntLiteral(index), new StringLiteral("$className.$name"))); |
159 index++; | 162 index++; |
160 } | 163 } |
161 MapLiteral toStringMap = new MapLiteral(toStringEntries, isConst: true); | 164 MapLiteral toStringMap = new MapLiteral(toStringEntries, isConst: true); |
162 KernelEnumBuilder enumBuilder = new KernelEnumBuilder.internal( | 165 KernelEnumBuilder enumBuilder = new KernelEnumBuilder.internal( |
163 metadata, | 166 metadata, |
164 name, | 167 name, |
165 members, | 168 new Scope(members, null, parent.scope, isModifiable: false), |
| 169 new Scope(constructors, null, null, isModifiable: false), |
166 cls, | 170 cls, |
167 constantNamesAndOffsets, | 171 constantNamesAndOffsets, |
168 toStringMap, | 172 toStringMap, |
169 intType, | 173 intType, |
170 stringType, | 174 stringType, |
171 parent, | 175 parent, |
172 charOffset); | 176 charOffset); |
173 // TODO(sigmund): dynamic should be `covariant MemberBuilder`. | 177 // TODO(sigmund): dynamic should be `covariant MemberBuilder`. |
174 members.forEach((String name, dynamic b) { | 178 void setParent(String name, dynamic b) { |
175 MemberBuilder builder = b; | 179 MemberBuilder builder = b; |
176 builder.parent = enumBuilder; | 180 builder.parent = enumBuilder; |
177 }); | 181 } |
| 182 |
| 183 members.forEach(setParent); |
| 184 constructors.forEach(setParent); |
178 selfType.builder = enumBuilder; | 185 selfType.builder = enumBuilder; |
179 return enumBuilder; | 186 return enumBuilder; |
180 } | 187 } |
181 | 188 |
182 KernelTypeBuilder get mixedInType => null; | 189 KernelTypeBuilder get mixedInType => null; |
183 | 190 |
184 InterfaceType buildType( | 191 InterfaceType buildType( |
185 LibraryBuilder library, List<KernelTypeBuilder> arguments) { | 192 LibraryBuilder library, List<KernelTypeBuilder> arguments) { |
186 return cls.rawType; | 193 return cls.rawType; |
187 } | 194 } |
(...skipping 17 matching lines...) Expand all Loading... |
205 List<Expression> values = <Expression>[]; | 212 List<Expression> values = <Expression>[]; |
206 for (int i = 0; i < constantNamesAndOffsets.length; i += 2) { | 213 for (int i = 0; i < constantNamesAndOffsets.length; i += 2) { |
207 String name = constantNamesAndOffsets[i]; | 214 String name = constantNamesAndOffsets[i]; |
208 KernelFieldBuilder builder = this[name]; | 215 KernelFieldBuilder builder = this[name]; |
209 values.add(new StaticGet(builder.build(libraryBuilder))); | 216 values.add(new StaticGet(builder.build(libraryBuilder))); |
210 } | 217 } |
211 KernelFieldBuilder valuesBuilder = this["values"]; | 218 KernelFieldBuilder valuesBuilder = this["values"]; |
212 valuesBuilder.build(libraryBuilder); | 219 valuesBuilder.build(libraryBuilder); |
213 valuesBuilder.initializer = | 220 valuesBuilder.initializer = |
214 new ListLiteral(values, typeArgument: cls.rawType, isConst: true); | 221 new ListLiteral(values, typeArgument: cls.rawType, isConst: true); |
215 KernelConstructorBuilder constructorBuilder = this[""]; | 222 KernelConstructorBuilder constructorBuilder = constructorScopeBuilder[""]; |
216 Constructor constructor = constructorBuilder.build(libraryBuilder); | 223 Constructor constructor = constructorBuilder.build(libraryBuilder); |
217 constructor.initializers.insert( | 224 constructor.initializers.insert( |
218 0, | 225 0, |
219 new FieldInitializer(indexField, | 226 new FieldInitializer(indexField, |
220 new VariableGet(constructor.function.positionalParameters.single)) | 227 new VariableGet(constructor.function.positionalParameters.single)) |
221 ..parent = constructor); | 228 ..parent = constructor); |
222 int index = 0; | 229 int index = 0; |
223 for (int i = 0; i < constantNamesAndOffsets.length; i += 2) { | 230 for (int i = 0; i < constantNamesAndOffsets.length; i += 2) { |
224 String constant = constantNamesAndOffsets[i]; | 231 String constant = constantNamesAndOffsets[i]; |
225 KernelFieldBuilder field = this[constant]; | 232 KernelFieldBuilder field = this[constant]; |
226 field.build(libraryBuilder); | 233 field.build(libraryBuilder); |
227 Arguments arguments = | 234 Arguments arguments = |
228 new Arguments(<Expression>[new IntLiteral(index++)]); | 235 new Arguments(<Expression>[new IntLiteral(index++)]); |
229 field.initializer = | 236 field.initializer = |
230 new ConstructorInvocation(constructor, arguments, isConst: true); | 237 new ConstructorInvocation(constructor, arguments, isConst: true); |
231 } | 238 } |
232 return super.build(libraryBuilder); | 239 return super.build(libraryBuilder); |
233 } | 240 } |
234 | 241 |
235 @override | 242 @override |
236 Builder findConstructorOrFactory(String name, int charOffset, Uri uri) { | 243 Builder findConstructorOrFactory(String name, int charOffset, Uri uri) { |
237 return null; | 244 return null; |
238 } | 245 } |
239 } | 246 } |
OLD | NEW |