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

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: 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
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;
27
28 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
22 29
23 import '../errors.dart' show internalError; 30 import '../errors.dart' show internalError;
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 }
Johnni Winther 2017/03/17 11:46:48 TODO: check getters/setters/operators
ahe 2017/03/17 13:24:37 Done.
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;
202 if (declaredFunction.typeParameters?.length !=
203 interfaceFunction.typeParameters?.length) {
204 if ("patched_sdk/lib/typed_data/typed_data.dart" !=
205 library.relativeFileUri) {
206 // TODO(ahe): https://github.com/dart-lang/sdk/issues/29100
207 addWarning(
208 declaredMember.fileOffset,
209 "Declared type variables of '$name::${declaredMember.name.name}' "
210 "doesn't match those on overridden method "
211 "'${interfaceMember.enclosingClass.name}::"
212 "${interfaceMember.name.name}'.");
213 }
214 }
215 if (declaredFunction.positionalParameters.length <
216 interfaceFunction.requiredParameterCount ||
217 declaredFunction.positionalParameters.length <
218 interfaceFunction.positionalParameters.length) {
219 addWarning(
220 declaredMember.fileOffset,
221 "The method '$name::${declaredMember.name.name}' has fewer "
222 "positional arguments than those of overridden method "
223 "'${interfaceMember.enclosingClass.name}::"
224 "${interfaceMember.name.name}'.");
225 }
226 if (interfaceFunction.requiredParameterCount <
227 declaredFunction.requiredParameterCount) {
228 addWarning(
229 declaredMember.fileOffset,
230 "The method '$name::${declaredMember.name.name}' has more "
231 "positional arguments than those of overridden method "
Johnni Winther 2017/03/17 11:46:47 'positional' -> 'required'
ahe 2017/03/17 13:24:37 That was intentional. I consider this case similar
Johnni Winther 2017/03/17 13:36:19 Yes, but from the users perspective it doesn't mak
ahe 2017/03/17 14:02:51 Good point. I'll send an update.
232 "'${interfaceMember.enclosingClass.name}::"
233 "${interfaceMember.name.name}'.");
234 }
235 if (declaredFunction.namedParameters.isEmpty &&
236 interfaceFunction.namedParameters.isEmpty) {
237 return;
238 }
239 if (declaredFunction.namedParameters.length <
240 interfaceFunction.namedParameters.length) {
241 addWarning(
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 addWarning(
259 declaredMember.fileOffset,
260 "The method '$name::${declaredMember.name.name}' doesn't have "
261 "the named parameter '${interfaceNamedParameters.current.name}' "
262 "of override method '${interfaceMember.enclosingClass.name}::"
Johnni Winther 2017/03/17 11:46:47 override -> overridden
ahe 2017/03/17 13:24:37 Done.
263 "${interfaceMember.name.name}'.");
264 break outer;
265 }
266 }
267 }
268 }
269
270 void addCompileTimeError(int charOffset, String message) {
271 library.addCompileTimeError(charOffset, message, fileUri: fileUri);
272 }
273
274 void addWarning(int charOffset, String message) {
275 library.addWarning(charOffset, message, fileUri: fileUri);
276 }
277
278 void addNit(int charOffset, String message) {
279 library.addNit(charOffset, message, fileUri: fileUri);
280 }
169 } 281 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/colors.dart ('k') | 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