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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart

Issue 2788153002: Create separate scopes for constructors, setters, and other members. (Closed)
Patch Set: One more flaky standalone/io test. Created 3 years, 8 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.kernel_class_builder; 5 library fasta.kernel_class_builder;
6 6
7 import 'package:kernel/ast.dart' 7 import 'package:kernel/ast.dart'
8 show 8 show
9 Class, 9 Class,
10 Constructor, 10 Constructor,
(...skipping 24 matching lines...) Expand all
35 35
36 import 'kernel_builder.dart' 36 import 'kernel_builder.dart'
37 show 37 show
38 Builder, 38 Builder,
39 ClassBuilder, 39 ClassBuilder,
40 ConstructorReferenceBuilder, 40 ConstructorReferenceBuilder,
41 KernelLibraryBuilder, 41 KernelLibraryBuilder,
42 KernelProcedureBuilder, 42 KernelProcedureBuilder,
43 KernelTypeBuilder, 43 KernelTypeBuilder,
44 LibraryBuilder, 44 LibraryBuilder,
45 MemberBuilder,
45 MetadataBuilder, 46 MetadataBuilder,
46 ProcedureBuilder, 47 ProcedureBuilder,
48 Scope,
47 TypeVariableBuilder, 49 TypeVariableBuilder,
48 computeDefaultTypeArguments; 50 computeDefaultTypeArguments;
49 51
50 import 'redirecting_factory_body.dart' show RedirectingFactoryBody; 52 import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
51 53
52 abstract class KernelClassBuilder 54 abstract class KernelClassBuilder
53 extends ClassBuilder<KernelTypeBuilder, InterfaceType> { 55 extends ClassBuilder<KernelTypeBuilder, InterfaceType> {
54 KernelClassBuilder( 56 KernelClassBuilder(
55 List<MetadataBuilder> metadata, 57 List<MetadataBuilder> metadata,
56 int modifiers, 58 int modifiers,
57 String name, 59 String name,
58 List<TypeVariableBuilder> typeVariables, 60 List<TypeVariableBuilder> typeVariables,
59 KernelTypeBuilder supertype, 61 KernelTypeBuilder supertype,
60 List<KernelTypeBuilder> interfaces, 62 List<KernelTypeBuilder> interfaces,
61 Map<String, Builder> members, 63 Scope scope,
64 Scope constructors,
62 LibraryBuilder parent, 65 LibraryBuilder parent,
63 int charOffset) 66 int charOffset)
64 : super(metadata, modifiers, name, typeVariables, supertype, interfaces, 67 : super(metadata, modifiers, name, typeVariables, supertype, interfaces,
65 members, parent, charOffset); 68 scope, constructors, parent, charOffset);
66 69
67 Class get cls; 70 Class get cls;
68 71
69 Class get target => cls; 72 Class get target => cls;
70 73
71 /// [arguments] have already been built. 74 /// [arguments] have already been built.
72 InterfaceType buildTypesWithBuiltArguments( 75 InterfaceType buildTypesWithBuiltArguments(
73 LibraryBuilder library, List<DartType> arguments) { 76 LibraryBuilder library, List<DartType> arguments) {
74 assert(arguments == null || cls.typeParameters.length == arguments.length); 77 assert(arguments == null || cls.typeParameters.length == arguments.length);
75 return arguments == null ? cls.rawType : new InterfaceType(cls, arguments); 78 return arguments == null ? cls.rawType : new InterfaceType(cls, arguments);
(...skipping 28 matching lines...) Expand all
104 return new Supertype(cls, buildTypeArguments(library, arguments)); 107 return new Supertype(cls, buildTypeArguments(library, arguments));
105 } else { 108 } else {
106 return cls.asRawSupertype; 109 return cls.asRawSupertype;
107 } 110 }
108 } 111 }
109 112
110 @override 113 @override
111 int resolveConstructors(LibraryBuilder library) { 114 int resolveConstructors(LibraryBuilder library) {
112 int count = super.resolveConstructors(library); 115 int count = super.resolveConstructors(library);
113 if (count != 0) { 116 if (count != 0) {
117 Map<String, MemberBuilder> constructors = this.constructors.local;
114 // Copy keys to avoid concurrent modification error. 118 // Copy keys to avoid concurrent modification error.
115 List<String> names = members.keys.toList(); 119 List<String> names = constructors.keys.toList();
116 for (String name in names) { 120 for (String name in names) {
117 Builder builder = members[name]; 121 Builder builder = constructors[name];
118 if (builder is KernelProcedureBuilder && builder.isFactory) { 122 if (builder is KernelProcedureBuilder && builder.isFactory) {
119 // Compute the immediate redirection target, not the effective. 123 // Compute the immediate redirection target, not the effective.
120 ConstructorReferenceBuilder redirectionTarget = 124 ConstructorReferenceBuilder redirectionTarget =
121 builder.redirectionTarget; 125 builder.redirectionTarget;
122 if (redirectionTarget != null) { 126 if (redirectionTarget != null) {
123 assert(builder.actualBody == null); 127 assert(builder.actualBody == null);
124 Builder targetBuilder = redirectionTarget.target; 128 Builder targetBuilder = redirectionTarget.target;
125 addRedirectingConstructor(builder, library); 129 addRedirectingConstructor(builder, library);
126 if (targetBuilder is ProcedureBuilder) { 130 if (targetBuilder is ProcedureBuilder) {
127 Member target = targetBuilder.target; 131 Member target = targetBuilder.target;
(...skipping 24 matching lines...) Expand all
152 // 156 //
153 // The synthetic field looks like this: 157 // The synthetic field looks like this:
154 // 158 //
155 // final _redirecting# = [c1, ..., cn]; 159 // final _redirecting# = [c1, ..., cn];
156 // 160 //
157 // Where each c1 ... cn are an instance of [StaticGet] whose target is 161 // Where each c1 ... cn are an instance of [StaticGet] whose target is
158 // [constructor.target]. 162 // [constructor.target].
159 // 163 //
160 // TODO(ahe): Generate the correct factory body instead. 164 // TODO(ahe): Generate the correct factory body instead.
161 DillMemberBuilder constructorsField = 165 DillMemberBuilder constructorsField =
162 members.putIfAbsent("_redirecting#", () { 166 scope.local.putIfAbsent("_redirecting#", () {
163 ListLiteral literal = new ListLiteral(<Expression>[]); 167 ListLiteral literal = new ListLiteral(<Expression>[]);
164 Name name = new Name("_redirecting#", library.library); 168 Name name = new Name("_redirecting#", library.library);
165 Field field = new Field(name, 169 Field field = new Field(name,
166 isStatic: true, initializer: literal, fileUri: cls.fileUri) 170 isStatic: true, initializer: literal, fileUri: cls.fileUri)
167 ..fileOffset = cls.fileOffset; 171 ..fileOffset = cls.fileOffset;
168 cls.addMember(field); 172 cls.addMember(field);
169 return new DillMemberBuilder(field, this); 173 return new DillMemberBuilder(field, this);
170 }); 174 });
171 Field field = constructorsField.target; 175 Field field = constructorsField.target;
172 ListLiteral literal = field.initializer; 176 ListLiteral literal = field.initializer;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 "The method '$name::${declaredMember.name.name}' doesn't have " 266 "The method '$name::${declaredMember.name.name}' doesn't have "
263 "the named parameter '${interfaceNamedParameters.current.name}' " 267 "the named parameter '${interfaceNamedParameters.current.name}' "
264 "of overriden method '${interfaceMember.enclosingClass.name}::" 268 "of overriden method '${interfaceMember.enclosingClass.name}::"
265 "${interfaceMember.name.name}'."); 269 "${interfaceMember.name.name}'.");
266 break outer; 270 break outer;
267 } 271 }
268 } 272 }
269 } 273 }
270 } 274 }
271 } 275 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart ('k') | pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698