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

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

Issue 2682333004: Remove convertConstructors. (Closed)
Patch Set: Long line. Created 3 years, 10 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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698