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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart

Issue 2788153002: Create separate scopes for constructors, setters, and other members. (Closed)
Patch Set: Update subpackage dependencies. Created 3 years, 8 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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698