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

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

Issue 2627223005: Fasta source builders. (Closed)
Patch Set: 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 cls.addMember(builder.build(library.library));
71 } else if (builder is KernelFunctionBuilder) {
72 cls.addMember(builder.build(library.library));
Johnni Winther 2017/01/16 15:12:45 Why not join these two cases?
ahe 2017/01/16 15:32:17 I don't have a common interface for the build meth
73 } else {
74 internalError("Unhandled builder: ${builder.runtimeType}");
75 }
76 }
77 members.forEach((String name, Builder builder) {
78 do {
79 buildBuilder(builder);
80 builder = builder.next;
81 } while (builder != null);
82 });
83 cls.supertype = supertype?.buildSupertype();
84 // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
85 // compile-time error.
86 cls.isAbstract = isAbstract;
87 if (interfaces != null) {
88 for (KernelTypeBuilder interface in interfaces) {
89 Supertype supertype = interface.buildSupertype();
90 if (supertype != null) {
91 // TODO(ahe): Report an error if supertype is null.
92 cls.implementedTypes.add(supertype);
93 }
94 }
95 }
96 return cls;
97 }
98
99 int convertConstructors(KernelLibraryBuilder library) {
100 List<String> oldConstructorNames = <String>[];
101 members.forEach((String name, MemberBuilder builder) {
102 if (isConstructorName(name, this.name)) {
103 oldConstructorNames.add(name);
104 String newName = "";
105 int index = name.indexOf(".");
106 if (index != -1) {
107 newName = name.substring(index + 1);
108 }
109 if (builder is KernelProcedureBuilder) {
110 Builder constructor = builder.toConstructor(newName, typeVariables);
111 Builder other = members[newName];
112 if (other != null) {
113 return inputError(null, null, "Constructor name '$newName' "
114 "conflicts with other declaration.");
115 }
116 constructors[newName] = constructor;
117 } else {
118 return inputError(null, null, "Expected a constructor or factory.");
119 }
120 }
121 });
122 for (String name in oldConstructorNames) {
123 members.remove(name);
124 }
125 constructors.forEach((String name, Builder builder) {
126 members[name] = builder;
127 });
128 return oldConstructorNames.length;
129 }
130
131 Builder findConstructorOrFactory(String name) => constructors[name];
132
133 void addSyntheticConstructor(Constructor constructor) {
134 String name = constructor.name.name;
135 cls.constructors.add(constructor);
136 constructor.parent = cls;
137 DillMemberBuilder memberBuilder = new DillMemberBuilder(constructor, this);
138 memberBuilder.next = constructors[name];
139 constructors[name] = memberBuilder;
140 }
141 }
142
143 bool isConstructorName(String name, String className) {
144 if (name.startsWith(className)) {
145 if (name.length == className.length) return true;
146 if (name.startsWith(".", className.length)) return true;
147 }
148 return false;
149 }
150
151 Map<String, Builder> computeMembersInScope(Map<String, Builder> members,
152 String className) {
153 Map<String, Builder> membersInScope = <String, Builder>{};
154 members.forEach((String name, Builder builder) {
155 if (builder is ProcedureBuilder) {
156 if (isConstructorName(builder.name, className)) return;
157 }
158 if (name.indexOf(".") != -1) {
159 inputError(null, null, "Only constructors and factories can have names "
160 "containing a period ('.'): $name");
161 }
162 membersInScope[name] = builder;
163 });
164 return membersInScope;
165 }
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