| 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 |