| 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' show | 7 import 'package:kernel/ast.dart' show |
| 8 Arguments, | 8 Arguments, |
| 9 AsyncMarker, | 9 AsyncMarker, |
| 10 Class, | 10 Class, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 | 60 |
| 61 final MapLiteral toStringMap; | 61 final MapLiteral toStringMap; |
| 62 | 62 |
| 63 final KernelTypeBuilder intType; | 63 final KernelTypeBuilder intType; |
| 64 | 64 |
| 65 final KernelTypeBuilder stringType; | 65 final KernelTypeBuilder stringType; |
| 66 | 66 |
| 67 KernelEnumBuilder.internal(List<MetadataBuilder> metadata, String name, | 67 KernelEnumBuilder.internal(List<MetadataBuilder> metadata, String name, |
| 68 Map<String, Builder> members, List<KernelTypeBuilder> types, Class cls, | 68 Map<String, Builder> members, List<KernelTypeBuilder> types, Class cls, |
| 69 this.constants, this.toStringMap, this.intType, this.stringType, | 69 this.constants, this.toStringMap, this.intType, this.stringType, |
| 70 LibraryBuilder parent) | 70 LibraryBuilder parent, int charOffset) |
| 71 : super(metadata, 0, name, null, null, null, members, types, parent, null, | 71 : super(metadata, 0, name, null, null, null, members, types, parent, null, |
| 72 cls); | 72 charOffset, cls); |
| 73 | 73 |
| 74 factory KernelEnumBuilder(List<MetadataBuilder> metadata, String name, | 74 factory KernelEnumBuilder(List<MetadataBuilder> metadata, String name, |
| 75 List<String> constants, LibraryBuilder parent) { | 75 List<String> constants, LibraryBuilder parent, int charOffset) { |
| 76 constants ??= const <String>[]; | 76 constants ??= const <String>[]; |
| 77 // TODO(ahe): These types shouldn't be looked up in scope, they come | 77 // TODO(ahe): These types shouldn't be looked up in scope, they come |
| 78 // directly from dart:core. | 78 // directly from dart:core. |
| 79 KernelTypeBuilder objectType = | 79 KernelTypeBuilder objectType = |
| 80 new KernelNamedTypeBuilder("Object", null); | 80 new KernelNamedTypeBuilder("Object", null, charOffset, parent.fileUri); |
| 81 KernelTypeBuilder intType = | 81 KernelTypeBuilder intType = |
| 82 new KernelNamedTypeBuilder("int", null); | 82 new KernelNamedTypeBuilder("int", null, charOffset, parent.fileUri); |
| 83 KernelTypeBuilder stringType = | 83 KernelTypeBuilder stringType = |
| 84 new KernelNamedTypeBuilder("String", null); | 84 new KernelNamedTypeBuilder("String", null, charOffset, parent.fileUri); |
| 85 List<KernelTypeBuilder> types = <KernelTypeBuilder>[ | 85 List<KernelTypeBuilder> types = <KernelTypeBuilder>[ |
| 86 objectType, | 86 objectType, |
| 87 intType, | 87 intType, |
| 88 stringType]; | 88 stringType]; |
| 89 Class cls = new Class(name: name); | 89 Class cls = new Class(name: name); |
| 90 Map<String, Builder> members = <String, Builder>{}; | 90 Map<String, Builder> members = <String, Builder>{}; |
| 91 KernelNamedTypeBuilder selfType = new KernelNamedTypeBuilder( | 91 KernelNamedTypeBuilder selfType = new KernelNamedTypeBuilder( |
| 92 name, null); | 92 name, null, charOffset, parent.fileUri); |
| 93 KernelTypeBuilder listType = | 93 KernelTypeBuilder listType = |
| 94 new KernelNamedTypeBuilder("List", <KernelTypeBuilder>[selfType]); | 94 new KernelNamedTypeBuilder( |
| 95 "List", <KernelTypeBuilder>[selfType], charOffset, parent.fileUri); |
| 95 types.add(listType); | 96 types.add(listType); |
| 96 | 97 |
| 97 /// From Dart Programming Language Specification 4th Edition/December 2015: | 98 /// From Dart Programming Language Specification 4th Edition/December 2015: |
| 98 /// metadata class E { | 99 /// metadata class E { |
| 99 /// final int index; | 100 /// final int index; |
| 100 /// const E(this.index); | 101 /// const E(this.index); |
| 101 /// static const E id0 = const E(0); | 102 /// static const E id0 = const E(0); |
| 102 /// ... | 103 /// ... |
| 103 /// static const E idn-1 = const E(n - 1); | 104 /// static const E idn-1 = const E(n - 1); |
| 104 /// static const List<E> values = const <E>[id0, ..., idn-1]; | 105 /// static const List<E> values = const <E>[id0, ..., idn-1]; |
| 105 /// String toString() => { 0: ‘E.id0’, . . ., n-1: ‘E.idn-1’}[index] | 106 /// String toString() => { 0: ‘E.id0’, . . ., n-1: ‘E.idn-1’}[index] |
| 106 /// } | 107 /// } |
| 107 members["index"] = | 108 members["index"] = new KernelFieldBuilder(null, intType, "index", finalMask, |
| 108 new KernelFieldBuilder(null, intType, "index", finalMask); | 109 parent, charOffset); |
| 109 KernelConstructorBuilder constructorBuilder = new KernelConstructorBuilder( | 110 KernelConstructorBuilder constructorBuilder = new KernelConstructorBuilder( |
| 110 null, constMask, null, "", null, <FormalParameterBuilder>[ | 111 null, constMask, null, "", null, <FormalParameterBuilder>[ |
| 111 new KernelFormalParameterBuilder(null, 0, intType, "index", true)]); | 112 new KernelFormalParameterBuilder(null, 0, intType, "index", true, |
| 113 parent, charOffset)], parent, charOffset); |
| 112 members[""] = constructorBuilder; | 114 members[""] = constructorBuilder; |
| 113 int index = 0; | 115 int index = 0; |
| 114 List<MapEntry> toStringEntries = <MapEntry>[]; | 116 List<MapEntry> toStringEntries = <MapEntry>[]; |
| 115 KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(null, listType, | 117 KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(null, listType, |
| 116 "values", constMask | staticMask); | 118 "values", constMask | staticMask, parent, charOffset); |
| 117 members["values"] = valuesBuilder; | 119 members["values"] = valuesBuilder; |
| 118 KernelProcedureBuilder toStringBuilder = new KernelProcedureBuilder(null, 0, | 120 KernelProcedureBuilder toStringBuilder = new KernelProcedureBuilder(null, 0, |
| 119 stringType, "toString", null, null, AsyncMarker.Sync, | 121 stringType, "toString", null, null, AsyncMarker.Sync, |
| 120 ProcedureKind.Method); | 122 ProcedureKind.Method, parent, charOffset); |
| 121 members["toString"] = toStringBuilder; | 123 members["toString"] = toStringBuilder; |
| 122 String className = name; | 124 String className = name; |
| 123 for (String name in constants) { | 125 for (String name in constants) { |
| 124 if (members.containsKey(name)) { | 126 if (members.containsKey(name)) { |
| 125 inputError(null, null, "Duplicated name: $name"); | 127 inputError(null, null, "Duplicated name: $name"); |
| 126 continue; | 128 continue; |
| 127 } | 129 } |
| 128 KernelFieldBuilder fieldBuilder = | 130 KernelFieldBuilder fieldBuilder = |
| 129 new KernelFieldBuilder(null, selfType, name, constMask | staticMask); | 131 new KernelFieldBuilder(null, selfType, name, constMask | staticMask, |
| 132 parent, charOffset); // TODO(ahe): Get charOffset from [name]. |
| 130 members[name] = fieldBuilder; | 133 members[name] = fieldBuilder; |
| 131 toStringEntries.add(new MapEntry( | 134 toStringEntries.add(new MapEntry( |
| 132 new IntLiteral(index), new StringLiteral("$className.$name"))); | 135 new IntLiteral(index), new StringLiteral("$className.$name"))); |
| 133 index++; | 136 index++; |
| 134 } | 137 } |
| 135 MapLiteral toStringMap = new MapLiteral(toStringEntries, isConst: true); | 138 MapLiteral toStringMap = new MapLiteral(toStringEntries, isConst: true); |
| 136 KernelEnumBuilder enumBuilder = new KernelEnumBuilder.internal(metadata, | 139 KernelEnumBuilder enumBuilder = new KernelEnumBuilder.internal(metadata, |
| 137 name, members, types, cls, constants, toStringMap, intType, stringType, | 140 name, members, types, cls, constants, toStringMap, intType, stringType, |
| 138 parent); | 141 parent, charOffset); |
| 139 members.forEach((String name, MemberBuilder builder) { | 142 members.forEach((String name, MemberBuilder builder) { |
| 140 builder.parent = enumBuilder; | 143 builder.parent = enumBuilder; |
| 141 }); | 144 }); |
| 142 selfType.builder = enumBuilder; | 145 selfType.builder = enumBuilder; |
| 143 return enumBuilder; | 146 return enumBuilder; |
| 144 } | 147 } |
| 145 | 148 |
| 146 InterfaceType buildType(List<KernelTypeBuilder> arguments) { | 149 InterfaceType buildType(List<KernelTypeBuilder> arguments) { |
| 147 return cls.rawType; | 150 return cls.rawType; |
| 148 } | 151 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 Arguments arguments = | 185 Arguments arguments = |
| 183 new Arguments(<Expression>[new IntLiteral(index++)]); | 186 new Arguments(<Expression>[new IntLiteral(index++)]); |
| 184 field.initializer = | 187 field.initializer = |
| 185 new ConstructorInvocation(constructor, arguments, isConst: true); | 188 new ConstructorInvocation(constructor, arguments, isConst: true); |
| 186 } | 189 } |
| 187 return super.build(libraryBuilder); | 190 return super.build(libraryBuilder); |
| 188 } | 191 } |
| 189 | 192 |
| 190 Builder findConstructorOrFactory(String name) => null; | 193 Builder findConstructorOrFactory(String name) => null; |
| 191 } | 194 } |
| OLD | NEW |