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

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

Issue 2755983002: Implement override checks for methods. (Closed)
Patch Set: Early version, untested. Created 3 years, 9 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
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/kernel/kernel_target.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 DartType, 11 DartType,
11 Expression, 12 Expression,
12 ExpressionStatement, 13 ExpressionStatement,
13 Field, 14 Field,
15 FunctionNode,
14 InterfaceType, 16 InterfaceType,
15 ListLiteral, 17 ListLiteral,
16 Member, 18 Member,
17 Name, 19 Name,
20 Procedure,
21 ProcedureKind,
18 StaticGet, 22 StaticGet,
19 StringLiteral, 23 StringLiteral,
20 Supertype, 24 Supertype,
21 Throw; 25 Throw,
26 VariableDeclaration;
22 27
23 import '../errors.dart' show internalError; 28 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
29
30 import '../errors.dart' show internalError, printUnexpected;
24 31
25 import '../messages.dart' show warning; 32 import '../messages.dart' show warning;
26 33
34 import '../dill/dill_member_builder.dart' show DillMemberBuilder;
35
27 import 'kernel_builder.dart' 36 import 'kernel_builder.dart'
28 show 37 show
29 Builder, 38 Builder,
30 ClassBuilder, 39 ClassBuilder,
31 ConstructorReferenceBuilder, 40 ConstructorReferenceBuilder,
32 KernelLibraryBuilder, 41 KernelLibraryBuilder,
33 KernelProcedureBuilder, 42 KernelProcedureBuilder,
34 KernelTypeBuilder, 43 KernelTypeBuilder,
35 LibraryBuilder, 44 LibraryBuilder,
36 MetadataBuilder, 45 MetadataBuilder,
37 ProcedureBuilder, 46 ProcedureBuilder,
38 TypeVariableBuilder, 47 TypeVariableBuilder,
39 computeDefaultTypeArguments; 48 computeDefaultTypeArguments;
40 49
41 import '../dill/dill_member_builder.dart' show DillMemberBuilder;
42
43 import 'redirecting_factory_body.dart' show RedirectingFactoryBody; 50 import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
44 51
45 abstract class KernelClassBuilder 52 abstract class KernelClassBuilder
46 extends ClassBuilder<KernelTypeBuilder, InterfaceType> { 53 extends ClassBuilder<KernelTypeBuilder, InterfaceType> {
47 KernelClassBuilder( 54 KernelClassBuilder(
48 List<MetadataBuilder> metadata, 55 List<MetadataBuilder> metadata,
49 int modifiers, 56 int modifiers,
50 String name, 57 String name,
51 List<TypeVariableBuilder> typeVariables, 58 List<TypeVariableBuilder> typeVariables,
52 KernelTypeBuilder supertype, 59 KernelTypeBuilder supertype,
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 initializer: literal, 166 initializer: literal,
160 fileUri: cls.fileUri)..fileOffset = cls.fileOffset; 167 fileUri: cls.fileUri)..fileOffset = cls.fileOffset;
161 cls.addMember(field); 168 cls.addMember(field);
162 return new DillMemberBuilder(field, this); 169 return new DillMemberBuilder(field, this);
163 }); 170 });
164 Field field = constructorsField.target; 171 Field field = constructorsField.target;
165 ListLiteral literal = field.initializer; 172 ListLiteral literal = field.initializer;
166 literal.expressions 173 literal.expressions
167 .add(new StaticGet(constructor.target)..parent = literal); 174 .add(new StaticGet(constructor.target)..parent = literal);
168 } 175 }
176
177 void checkOverrides(ClassHierarchy hierarchy) {
178 hierarchy.forEachOverridePair(cls, checkOverride);
179 }
180
181 void checkOverride(
182 Member declaredMember, Member interfaceMember, bool isSetter) {
183 if (declaredMember is Constructor || interfaceMember is Constructor) {
184 internalError(
185 "Constructor in override check.", fileUri, declaredMember.fileOffset);
186 }
187 if (declaredMember is Procedure && interfaceMember is Procedure) {
188 if (declaredMember.kind == ProcedureKind.Method &&
189 interfaceMember.kind == ProcedureKind.Method) {
190 checkMethodOverride(declaredMember, interfaceMember);
191 return;
192 }
193 }
194 }
195
196 void checkMethodOverride(
197 Procedure declaredMember, Procedure interfaceMember) {
198 assert(declaredMember.kind == ProcedureKind.Method);
199 assert(interfaceMember.kind == ProcedureKind.Method);
200 FunctionNode declaredFunction = declaredMember.function;
201 FunctionNode interfaceFunction = interfaceMember.function;
ahe 2017/03/16 17:32:37 These two function nodes have lists of parameters
202 if (declaredFunction.typeParameters?.length !=
203 interfaceFunction.typeParameters?.length) {
204 // TODO(ahe): This causes a lot of errors in typed_data.dart.
205 // printUnexpected(
206 // fileUri,
207 // declaredMember.fileOffset,
208 // "Declared type variables of '$name::${declaredMember.name.name}' "
209 // "doesn't match those on overridden method "
210 // "'${interfaceMember.enclosingClass.name}::"
211 // "${interfaceMember.name.name}'.");
212 }
213 if (declaredFunction.positionalParameters.length <
214 interfaceFunction.requiredParameterCount ||
215 declaredFunction.positionalParameters.length <
216 interfaceFunction.positionalParameters.length) {
217 printUnexpected(
218 fileUri,
219 declaredMember.fileOffset,
220 "The method '$name::${declaredMember.name.name}' has fewer "
221 "positional arguments than those of overridden method "
222 "'${interfaceMember.enclosingClass.name}::"
223 "${interfaceMember.name.name}'.");
224 }
225 if (interfaceFunction.requiredParameterCount < declaredFunction.requiredPara meterCount) {
226 printUnexpected(
227 fileUri,
228 declaredMember.fileOffset,
229 "The method '$name::${declaredMember.name.name}' has fewer "
230 "positional arguments than those of overridden method "
231 "'${interfaceMember.enclosingClass.name}::"
232 "${interfaceMember.name.name}'.");
233 }
234 if (declaredFunction.namedParameters.isEmpty &&
235 interfaceFunction.namedParameters.isEmpty) {
236 return;
237 }
238 if (declaredFunction.namedParameters.length <
239 interfaceFunction.namedParameters.length) {
240 printUnexpected(
241 fileUri,
242 declaredMember.fileOffset,
243 "The method '$name::${declaredMember.name.name}' has fewer named "
244 "arguments than those of overridden method "
245 "'${interfaceMember.enclosingClass.name}::"
246 "${interfaceMember.name.name}'.");
247 }
248 Iterator<VariableDeclaration> declaredNamedParameters =
249 declaredFunction.namedParameters.iterator;
250 Iterator<VariableDeclaration> interfaceNamedParameters =
251 interfaceFunction.namedParameters.iterator;
252 outer:
253 while (declaredNamedParameters.moveNext() &&
254 interfaceNamedParameters.moveNext()) {
255 while (declaredNamedParameters.current.name !=
256 interfaceNamedParameters.current.name) {
257 if (!declaredNamedParameters.moveNext()) {
258 printUnexpected(
259 fileUri,
260 declaredMember.fileOffset,
261 "The method '$name::${declaredMember.name.name}' doesn't have "
262 "the named parameter '${interfaceNamedParameters.current.name}' "
263 "of override method '${interfaceMember.enclosingClass.name}::"
264 "${interfaceMember.name.name}'.");
265 break outer;
266 }
267 }
268 }
269 }
169 } 270 }
OLDNEW
« no previous file with comments | « no previous file | pkg/front_end/lib/src/fasta/kernel/kernel_target.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698