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

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: Update subpackage dependencies. 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 27 matching lines...) Expand all
103 if (arguments != null) { 106 if (arguments != null) {
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 int resolveConstructors(KernelLibraryBuilder library) { 113 int resolveConstructors(KernelLibraryBuilder library) {
111 int count = super.resolveConstructors(library); 114 int count = super.resolveConstructors(library);
112 if (count != 0) { 115 if (count != 0) {
116 Map<String, MemberBuilder> constructors = this.constructors.local;
113 // Copy keys to avoid concurrent modification error. 117 // Copy keys to avoid concurrent modification error.
114 List<String> names = members.keys.toList(); 118 List<String> names = constructors.keys.toList();
115 for (String name in names) { 119 for (String name in names) {
116 Builder builder = members[name]; 120 Builder builder = constructors[name];
117 if (builder is KernelProcedureBuilder && builder.isFactory) { 121 if (builder is KernelProcedureBuilder && builder.isFactory) {
118 // Compute the immediate redirection target, not the effective. 122 // Compute the immediate redirection target, not the effective.
119 ConstructorReferenceBuilder redirectionTarget = 123 ConstructorReferenceBuilder redirectionTarget =
120 builder.redirectionTarget; 124 builder.redirectionTarget;
121 if (redirectionTarget != null) { 125 if (redirectionTarget != null) {
122 assert(builder.actualBody == null); 126 assert(builder.actualBody == null);
123 Builder targetBuilder = redirectionTarget.target; 127 Builder targetBuilder = redirectionTarget.target;
124 addRedirectingConstructor(builder, library); 128 addRedirectingConstructor(builder, library);
125 if (targetBuilder is ProcedureBuilder) { 129 if (targetBuilder is ProcedureBuilder) {
126 Member target = targetBuilder.target; 130 Member target = targetBuilder.target;
(...skipping 24 matching lines...) Expand all
151 // 155 //
152 // The synthetic field looks like this: 156 // The synthetic field looks like this:
153 // 157 //
154 // final _redirecting# = [c1, ..., cn]; 158 // final _redirecting# = [c1, ..., cn];
155 // 159 //
156 // Where each c1 ... cn are an instance of [StaticGet] whose target is 160 // Where each c1 ... cn are an instance of [StaticGet] whose target is
157 // [constructor.target]. 161 // [constructor.target].
158 // 162 //
159 // TODO(ahe): Generate the correct factory body instead. 163 // TODO(ahe): Generate the correct factory body instead.
160 DillMemberBuilder constructorsField = 164 DillMemberBuilder constructorsField =
161 members.putIfAbsent("_redirecting#", () { 165 scope.local.putIfAbsent("_redirecting#", () {
162 ListLiteral literal = new ListLiteral(<Expression>[]); 166 ListLiteral literal = new ListLiteral(<Expression>[]);
163 Name name = new Name("_redirecting#", library.library); 167 Name name = new Name("_redirecting#", library.library);
164 Field field = new Field(name, 168 Field field = new Field(name,
165 isStatic: true, 169 isStatic: true,
166 initializer: literal, 170 initializer: literal,
167 fileUri: cls.fileUri)..fileOffset = cls.fileOffset; 171 fileUri: cls.fileUri)..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;
(...skipping 90 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

Powered by Google App Engine
This is Rietveld 408576698