| 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' |
| 8 Class, | 8 show Class, Constructor, Supertype, TreeNode, setParents; |
| 9 Constructor, | |
| 10 Supertype, | |
| 11 TreeNode, | |
| 12 setParents; | |
| 13 | 9 |
| 14 import '../errors.dart' show | 10 import '../errors.dart' show internalError; |
| 15 internalError; | |
| 16 | 11 |
| 17 import '../kernel/kernel_builder.dart' show | 12 import '../kernel/kernel_builder.dart' |
| 18 Builder, | 13 show |
| 19 ConstructorReferenceBuilder, | 14 Builder, |
| 20 KernelClassBuilder, | 15 ConstructorReferenceBuilder, |
| 21 KernelFieldBuilder, | 16 KernelClassBuilder, |
| 22 KernelFunctionBuilder, | 17 KernelFieldBuilder, |
| 23 KernelLibraryBuilder, | 18 KernelFunctionBuilder, |
| 24 KernelTypeBuilder, | 19 KernelLibraryBuilder, |
| 25 KernelTypeVariableBuilder, | 20 KernelTypeBuilder, |
| 26 LibraryBuilder, | 21 KernelTypeVariableBuilder, |
| 27 MetadataBuilder, | 22 LibraryBuilder, |
| 28 ProcedureBuilder, | 23 MetadataBuilder, |
| 29 TypeVariableBuilder; | 24 ProcedureBuilder, |
| 25 TypeVariableBuilder; |
| 30 | 26 |
| 31 import '../dill/dill_member_builder.dart' show | 27 import '../dill/dill_member_builder.dart' show DillMemberBuilder; |
| 32 DillMemberBuilder; | |
| 33 | 28 |
| 34 import '../util/relativize.dart' show | 29 import '../util/relativize.dart' show relativizeUri; |
| 35 relativizeUri; | |
| 36 | 30 |
| 37 Class initializeClass(Class cls, String name, LibraryBuilder parent, | 31 Class initializeClass( |
| 38 int charOffset) { | 32 Class cls, String name, LibraryBuilder parent, int charOffset) { |
| 39 cls ??= new Class(name: name); | 33 cls ??= new Class(name: name); |
| 40 cls.fileUri ??= relativizeUri(parent.fileUri); | 34 cls.fileUri ??= relativizeUri(parent.fileUri); |
| 41 if (cls.fileOffset != TreeNode.noOffset) { | 35 if (cls.fileOffset != TreeNode.noOffset) { |
| 42 cls.fileOffset = charOffset; | 36 cls.fileOffset = charOffset; |
| 43 } | 37 } |
| 44 return cls; | 38 return cls; |
| 45 } | 39 } |
| 46 | 40 |
| 47 class SourceClassBuilder extends KernelClassBuilder { | 41 class SourceClassBuilder extends KernelClassBuilder { |
| 48 final Class cls; | 42 final Class cls; |
| 49 | 43 |
| 50 final Map<String, Builder> constructors; | 44 final Map<String, Builder> constructors; |
| 51 | 45 |
| 52 final Map<String, Builder> membersInScope; | 46 final Map<String, Builder> membersInScope; |
| 53 | 47 |
| 54 final List<ConstructorReferenceBuilder> constructorReferences; | 48 final List<ConstructorReferenceBuilder> constructorReferences; |
| 55 | 49 |
| 56 final KernelTypeBuilder mixedInType; | 50 final KernelTypeBuilder mixedInType; |
| 57 | 51 |
| 58 SourceClassBuilder(List<MetadataBuilder> metadata, int modifiers, | 52 SourceClassBuilder( |
| 59 String name, List<TypeVariableBuilder> typeVariables, | 53 List<MetadataBuilder> metadata, |
| 60 KernelTypeBuilder supertype, List<KernelTypeBuilder> interfaces, | 54 int modifiers, |
| 61 Map<String, Builder> members, LibraryBuilder parent, | 55 String name, |
| 62 this.constructorReferences, int charOffset, [Class cls, this.mixedInType]) | 56 List<TypeVariableBuilder> typeVariables, |
| 57 KernelTypeBuilder supertype, |
| 58 List<KernelTypeBuilder> interfaces, |
| 59 Map<String, Builder> members, |
| 60 LibraryBuilder parent, |
| 61 this.constructorReferences, |
| 62 int charOffset, |
| 63 [Class cls, |
| 64 this.mixedInType]) |
| 63 : cls = initializeClass(cls, name, parent, charOffset), | 65 : cls = initializeClass(cls, name, parent, charOffset), |
| 64 membersInScope = computeMembersInScope(members), | 66 membersInScope = computeMembersInScope(members), |
| 65 constructors = computeConstructors(members), | 67 constructors = computeConstructors(members), |
| 66 super(metadata, modifiers, name, typeVariables, supertype, interfaces, | 68 super(metadata, modifiers, name, typeVariables, supertype, interfaces, |
| 67 members, parent, charOffset); | 69 members, parent, charOffset); |
| 68 | 70 |
| 69 int resolveTypes(LibraryBuilder library) { | 71 int resolveTypes(LibraryBuilder library) { |
| 70 int count = 0; | 72 int count = 0; |
| 71 if (typeVariables != null) { | 73 if (typeVariables != null) { |
| 72 for (KernelTypeVariableBuilder t in typeVariables) { | 74 for (KernelTypeVariableBuilder t in typeVariables) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 83 if (builder is KernelFieldBuilder) { | 85 if (builder is KernelFieldBuilder) { |
| 84 // TODO(ahe): It would be nice to have a common interface for the build | 86 // TODO(ahe): It would be nice to have a common interface for the build |
| 85 // method to avoid duplicating these two cases. | 87 // method to avoid duplicating these two cases. |
| 86 cls.addMember(builder.build(library.library)); | 88 cls.addMember(builder.build(library.library)); |
| 87 } else if (builder is KernelFunctionBuilder) { | 89 } else if (builder is KernelFunctionBuilder) { |
| 88 cls.addMember(builder.build(library.library)); | 90 cls.addMember(builder.build(library.library)); |
| 89 } else { | 91 } else { |
| 90 internalError("Unhandled builder: ${builder.runtimeType}"); | 92 internalError("Unhandled builder: ${builder.runtimeType}"); |
| 91 } | 93 } |
| 92 } | 94 } |
| 95 |
| 93 members.forEach((String name, Builder builder) { | 96 members.forEach((String name, Builder builder) { |
| 94 do { | 97 do { |
| 95 buildBuilder(builder); | 98 buildBuilder(builder); |
| 96 builder = builder.next; | 99 builder = builder.next; |
| 97 } while (builder != null); | 100 } while (builder != null); |
| 98 }); | 101 }); |
| 99 cls.supertype = supertype?.buildSupertype(); | 102 cls.supertype = supertype?.buildSupertype(); |
| 100 cls.mixedInType = mixedInType?.buildSupertype(); | 103 cls.mixedInType = mixedInType?.buildSupertype(); |
| 101 // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a | 104 // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a |
| 102 // compile-time error. | 105 // compile-time error. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 Map<String, Builder> computeConstructors(Map<String, Builder> members) { | 142 Map<String, Builder> computeConstructors(Map<String, Builder> members) { |
| 140 Map<String, Builder> constructors = <String, Builder>{}; | 143 Map<String, Builder> constructors = <String, Builder>{}; |
| 141 members.forEach((String name, Builder builder) { | 144 members.forEach((String name, Builder builder) { |
| 142 if (builder is ProcedureBuilder && | 145 if (builder is ProcedureBuilder && |
| 143 (builder.isConstructor || builder.isFactory)) { | 146 (builder.isConstructor || builder.isFactory)) { |
| 144 constructors[name] = builder; | 147 constructors[name] = builder; |
| 145 } | 148 } |
| 146 }); | 149 }); |
| 147 return constructors; | 150 return constructors; |
| 148 } | 151 } |
| OLD | NEW |