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

Side by Side Diff: pkg/fasta/lib/src/source/source_class_builder.dart

Issue 2627223005: Fasta source builders. (Closed)
Patch Set: Add TODO about shared interface. Created 3 years, 11 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
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 library fasta.source_class_builder;
6
7 import 'package:kernel/ast.dart' show
8 Class,
9 Constructor,
10 Supertype,
11 setParents;
12
13 import '../errors.dart' show
14 internalError,
15 inputError;
16
17 import '../kernel/kernel_builder.dart' show
18 Builder,
19 ConstructorReferenceBuilder,
20 KernelClassBuilder,
21 KernelFieldBuilder,
22 KernelFunctionBuilder,
23 KernelLibraryBuilder,
24 KernelProcedureBuilder,
25 KernelTypeBuilder,
26 KernelTypeVariableBuilder,
27 LibraryBuilder,
28 MemberBuilder,
29 MetadataBuilder,
30 ProcedureBuilder,
31 TypeVariableBuilder;
32
33 import '../dill/dill_member_builder.dart' show
34 DillMemberBuilder;
35
36 class SourceClassBuilder extends KernelClassBuilder {
37 final Class cls;
38
39 final Map<String, Builder> constructors = <String, Builder>{};
40
41 final Map<String, Builder> membersInScope;
42
43 final List<ConstructorReferenceBuilder> constructorReferences;
44
45 SourceClassBuilder(List<MetadataBuilder> metadata, int modifiers,
46 String name, List<TypeVariableBuilder> typeVariables,
47 KernelTypeBuilder supertype, List<KernelTypeBuilder>interfaces,
48 Map<String, Builder> members, List<KernelTypeBuilder> types,
49 LibraryBuilder parent, this.constructorReferences, [Class cls])
50 : cls = cls ?? new Class(name: name),
51 membersInScope = computeMembersInScope(members, name),
52 super(metadata, modifiers, name, typeVariables, supertype, interfaces,
53 members, types, parent);
54
55 int resolveTypes(LibraryBuilder library) {
56 int count = 0;
57 if (typeVariables != null) {
58 for (KernelTypeVariableBuilder t in typeVariables) {
59 cls.typeParameters.add(t.parameter);
60 }
61 setParents(cls.typeParameters, cls);
62 count += cls.typeParameters.length;
63 }
64 return count + super.resolveTypes(library);
65 }
66
67 Class build(KernelLibraryBuilder library) {
68 void buildBuilder(Builder builder) {
69 if (builder is KernelFieldBuilder) {
70 // TODO(ahe): It would be nice to have a common interface for the build
71 // method to avoid duplicating these two cases.
72 cls.addMember(builder.build(library.library));
73 } else if (builder is KernelFunctionBuilder) {
74 cls.addMember(builder.build(library.library));
75 } else {
76 internalError("Unhandled builder: ${builder.runtimeType}");
77 }
78 }
79 members.forEach((String name, Builder builder) {
80 do {
81 buildBuilder(builder);
82 builder = builder.next;
83 } while (builder != null);
84 });
85 cls.supertype = supertype?.buildSupertype();
86 // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
87 // compile-time error.
88 cls.isAbstract = isAbstract;
89 if (interfaces != null) {
90 for (KernelTypeBuilder interface in interfaces) {
91 Supertype supertype = interface.buildSupertype();
92 if (supertype != null) {
93 // TODO(ahe): Report an error if supertype is null.
94 cls.implementedTypes.add(supertype);
95 }
96 }
97 }
98 return cls;
99 }
100
101 int convertConstructors(KernelLibraryBuilder library) {
102 List<String> oldConstructorNames = <String>[];
103 members.forEach((String name, MemberBuilder builder) {
104 if (isConstructorName(name, this.name)) {
105 oldConstructorNames.add(name);
106 String newName = "";
107 int index = name.indexOf(".");
108 if (index != -1) {
109 newName = name.substring(index + 1);
110 }
111 if (builder is KernelProcedureBuilder) {
112 Builder constructor = builder.toConstructor(newName, typeVariables);
113 Builder other = members[newName];
114 if (other != null) {
115 return inputError(null, null, "Constructor name '$newName' "
116 "conflicts with other declaration.");
117 }
118 constructors[newName] = constructor;
119 } else {
120 return inputError(null, null, "Expected a constructor or factory.");
121 }
122 }
123 });
124 for (String name in oldConstructorNames) {
125 members.remove(name);
126 }
127 constructors.forEach((String name, Builder builder) {
128 members[name] = builder;
129 });
130 return oldConstructorNames.length;
131 }
132
133 Builder findConstructorOrFactory(String name) => constructors[name];
134
135 void addSyntheticConstructor(Constructor constructor) {
136 String name = constructor.name.name;
137 cls.constructors.add(constructor);
138 constructor.parent = cls;
139 DillMemberBuilder memberBuilder = new DillMemberBuilder(constructor, this);
140 memberBuilder.next = constructors[name];
141 constructors[name] = memberBuilder;
142 }
143 }
144
145 bool isConstructorName(String name, String className) {
146 if (name.startsWith(className)) {
147 if (name.length == className.length) return true;
148 if (name.startsWith(".", className.length)) return true;
149 }
150 return false;
151 }
152
153 Map<String, Builder> computeMembersInScope(Map<String, Builder> members,
154 String className) {
155 Map<String, Builder> membersInScope = <String, Builder>{};
156 members.forEach((String name, Builder builder) {
157 if (builder is ProcedureBuilder) {
158 if (isConstructorName(builder.name, className)) return;
159 }
160 if (name.indexOf(".") != -1) {
161 inputError(null, null, "Only constructors and factories can have names "
162 "containing a period ('.'): $name");
163 }
164 membersInScope[name] = builder;
165 });
166 return membersInScope;
167 }
OLDNEW
« no previous file with comments | « pkg/fasta/lib/src/source/README.md ('k') | pkg/fasta/lib/src/source/source_library_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698