| 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.source_class_builder; | 5 library fasta.source_class_builder; |
| 6 | 6 |
| 7 import 'package:kernel/ast.dart' show | 7 import 'package:kernel/ast.dart' show |
| 8 Class, | 8 Class, |
| 9 Constructor, | 9 Constructor, |
| 10 Supertype, | 10 Supertype, |
| 11 TreeNode, | 11 TreeNode, |
| 12 setParents; | 12 setParents; |
| 13 | 13 |
| 14 import '../errors.dart' show | 14 import '../errors.dart' show |
| 15 internalError, | 15 internalError; |
| 16 inputError; | |
| 17 | 16 |
| 18 import '../kernel/kernel_builder.dart' show | 17 import '../kernel/kernel_builder.dart' show |
| 19 Builder, | 18 Builder, |
| 20 ConstructorReferenceBuilder, | 19 ConstructorReferenceBuilder, |
| 21 KernelClassBuilder, | 20 KernelClassBuilder, |
| 22 KernelFieldBuilder, | 21 KernelFieldBuilder, |
| 23 KernelFunctionBuilder, | 22 KernelFunctionBuilder, |
| 24 KernelLibraryBuilder, | 23 KernelLibraryBuilder, |
| 25 KernelProcedureBuilder, | |
| 26 KernelTypeBuilder, | 24 KernelTypeBuilder, |
| 27 KernelTypeVariableBuilder, | 25 KernelTypeVariableBuilder, |
| 28 LibraryBuilder, | 26 LibraryBuilder, |
| 29 MemberBuilder, | |
| 30 MetadataBuilder, | 27 MetadataBuilder, |
| 31 ProcedureBuilder, | 28 ProcedureBuilder, |
| 32 TypeVariableBuilder; | 29 TypeVariableBuilder; |
| 33 | 30 |
| 34 import '../dill/dill_member_builder.dart' show | 31 import '../dill/dill_member_builder.dart' show |
| 35 DillMemberBuilder; | 32 DillMemberBuilder; |
| 36 | 33 |
| 37 import '../util/relativize.dart' show | 34 import '../util/relativize.dart' show |
| 38 relativizeUri; | 35 relativizeUri; |
| 39 | 36 |
| 40 Class initializeClass(Class cls, String name, LibraryBuilder parent, | 37 Class initializeClass(Class cls, String name, LibraryBuilder parent, |
| 41 int charOffset) { | 38 int charOffset) { |
| 42 cls ??= new Class(name: name); | 39 cls ??= new Class(name: name); |
| 43 cls.fileUri ??= relativizeUri(parent.fileUri); | 40 cls.fileUri ??= relativizeUri(parent.fileUri); |
| 44 if (cls.fileOffset != TreeNode.noOffset) { | 41 if (cls.fileOffset != TreeNode.noOffset) { |
| 45 cls.fileOffset = charOffset; | 42 cls.fileOffset = charOffset; |
| 46 } | 43 } |
| 47 return cls; | 44 return cls; |
| 48 } | 45 } |
| 49 | 46 |
| 50 class SourceClassBuilder extends KernelClassBuilder { | 47 class SourceClassBuilder extends KernelClassBuilder { |
| 51 final Class cls; | 48 final Class cls; |
| 52 | 49 |
| 53 final Map<String, Builder> constructors = <String, Builder>{}; | 50 final Map<String, Builder> constructors; |
| 54 | 51 |
| 55 final Map<String, Builder> membersInScope; | 52 final Map<String, Builder> membersInScope; |
| 56 | 53 |
| 57 final List<ConstructorReferenceBuilder> constructorReferences; | 54 final List<ConstructorReferenceBuilder> constructorReferences; |
| 58 | 55 |
| 59 SourceClassBuilder(List<MetadataBuilder> metadata, int modifiers, | 56 SourceClassBuilder(List<MetadataBuilder> metadata, int modifiers, |
| 60 String name, List<TypeVariableBuilder> typeVariables, | 57 String name, List<TypeVariableBuilder> typeVariables, |
| 61 KernelTypeBuilder supertype, List<KernelTypeBuilder>interfaces, | 58 KernelTypeBuilder supertype, List<KernelTypeBuilder>interfaces, |
| 62 Map<String, Builder> members, LibraryBuilder parent, | 59 Map<String, Builder> members, LibraryBuilder parent, |
| 63 this.constructorReferences, int charOffset, [Class cls]) | 60 this.constructorReferences, int charOffset, [Class cls]) |
| 64 : cls = initializeClass(cls, name, parent, charOffset), | 61 : cls = initializeClass(cls, name, parent, charOffset), |
| 65 membersInScope = computeMembersInScope(members, name), | 62 membersInScope = computeMembersInScope(members), |
| 63 constructors = computeConstructors(members), |
| 66 super(metadata, modifiers, name, typeVariables, supertype, interfaces, | 64 super(metadata, modifiers, name, typeVariables, supertype, interfaces, |
| 67 members, parent, charOffset); | 65 members, parent, charOffset); |
| 68 | 66 |
| 69 int resolveTypes(LibraryBuilder library) { | 67 int resolveTypes(LibraryBuilder library) { |
| 70 int count = 0; | 68 int count = 0; |
| 71 if (typeVariables != null) { | 69 if (typeVariables != null) { |
| 72 for (KernelTypeVariableBuilder t in typeVariables) { | 70 for (KernelTypeVariableBuilder t in typeVariables) { |
| 73 cls.typeParameters.add(t.parameter); | 71 cls.typeParameters.add(t.parameter); |
| 74 } | 72 } |
| 75 setParents(cls.typeParameters, cls); | 73 setParents(cls.typeParameters, cls); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 105 Supertype supertype = interface.buildSupertype(); | 103 Supertype supertype = interface.buildSupertype(); |
| 106 if (supertype != null) { | 104 if (supertype != null) { |
| 107 // TODO(ahe): Report an error if supertype is null. | 105 // TODO(ahe): Report an error if supertype is null. |
| 108 cls.implementedTypes.add(supertype); | 106 cls.implementedTypes.add(supertype); |
| 109 } | 107 } |
| 110 } | 108 } |
| 111 } | 109 } |
| 112 return cls; | 110 return cls; |
| 113 } | 111 } |
| 114 | 112 |
| 115 int convertConstructors(KernelLibraryBuilder library) { | |
| 116 List<String> oldConstructorNames = <String>[]; | |
| 117 members.forEach((String name, MemberBuilder builder) { | |
| 118 if (isConstructorName(name, this.name)) { | |
| 119 oldConstructorNames.add(name); | |
| 120 String newName = ""; | |
| 121 int index = name.indexOf("."); | |
| 122 if (index != -1) { | |
| 123 newName = name.substring(index + 1); | |
| 124 } | |
| 125 if (builder is KernelProcedureBuilder) { | |
| 126 Builder constructor = builder.toConstructor(newName, typeVariables); | |
| 127 Builder other = members[newName]; | |
| 128 if (other != null) { | |
| 129 return inputError(null, null, "Constructor name '$newName' " | |
| 130 "conflicts with other declaration."); | |
| 131 } | |
| 132 constructors[newName] = constructor; | |
| 133 } else { | |
| 134 return inputError(null, null, "Expected a constructor or factory."); | |
| 135 } | |
| 136 } | |
| 137 }); | |
| 138 for (String name in oldConstructorNames) { | |
| 139 members.remove(name); | |
| 140 } | |
| 141 constructors.forEach((String name, Builder builder) { | |
| 142 members[name] = builder; | |
| 143 }); | |
| 144 return oldConstructorNames.length; | |
| 145 } | |
| 146 | |
| 147 Builder findConstructorOrFactory(String name) => constructors[name]; | 113 Builder findConstructorOrFactory(String name) => constructors[name]; |
| 148 | 114 |
| 149 void addSyntheticConstructor(Constructor constructor) { | 115 void addSyntheticConstructor(Constructor constructor) { |
| 150 String name = constructor.name.name; | 116 String name = constructor.name.name; |
| 151 cls.constructors.add(constructor); | 117 cls.constructors.add(constructor); |
| 152 constructor.parent = cls; | 118 constructor.parent = cls; |
| 153 DillMemberBuilder memberBuilder = new DillMemberBuilder(constructor, this); | 119 DillMemberBuilder memberBuilder = new DillMemberBuilder(constructor, this); |
| 154 memberBuilder.next = constructors[name]; | 120 memberBuilder.next = constructors[name]; |
| 155 constructors[name] = memberBuilder; | 121 constructors[name] = memberBuilder; |
| 156 } | 122 } |
| 157 } | 123 } |
| 158 | 124 |
| 159 bool isConstructorName(String name, String className) { | 125 Map<String, Builder> computeMembersInScope(Map<String, Builder> members) { |
| 160 if (name.startsWith(className)) { | |
| 161 if (name.length == className.length) return true; | |
| 162 if (name.startsWith(".", className.length)) return true; | |
| 163 } | |
| 164 return false; | |
| 165 } | |
| 166 | |
| 167 Map<String, Builder> computeMembersInScope(Map<String, Builder> members, | |
| 168 String className) { | |
| 169 Map<String, Builder> membersInScope = <String, Builder>{}; | 126 Map<String, Builder> membersInScope = <String, Builder>{}; |
| 170 members.forEach((String name, Builder builder) { | 127 members.forEach((String name, Builder builder) { |
| 171 if (builder is ProcedureBuilder) { | 128 if (builder is ProcedureBuilder) { |
| 172 if (isConstructorName(builder.name, className)) return; | 129 if (builder.isConstructor || builder.isFactory) return; |
| 173 } | |
| 174 if (name.indexOf(".") != -1) { | |
| 175 inputError(null, null, "Only constructors and factories can have names " | |
| 176 "containing a period ('.'): $name"); | |
| 177 } | 130 } |
| 178 membersInScope[name] = builder; | 131 membersInScope[name] = builder; |
| 179 }); | 132 }); |
| 180 return membersInScope; | 133 return membersInScope; |
| 181 } | 134 } |
| 135 |
| 136 Map<String, Builder> computeConstructors(Map<String, Builder> members) { |
| 137 Map<String, Builder> constructors = <String, Builder>{}; |
| 138 members.forEach((String name, Builder builder) { |
| 139 if (builder is ProcedureBuilder && |
| 140 (builder.isConstructor || builder.isFactory)) { |
| 141 constructors[name] = builder; |
| 142 } |
| 143 }); |
| 144 return constructors; |
| 145 } |
| OLD | NEW |