Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 } |
| OLD | NEW |