| 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_procedure_builder; | 5 library fasta.kernel_procedure_builder; |
| 6 | 6 |
| 7 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' | 7 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' |
| 8 show KernelProcedure; | 8 show KernelProcedure; |
| 9 | 9 |
| 10 import 'package:front_end/src/fasta/source/source_library_builder.dart' | 10 import 'package:front_end/src/fasta/source/source_library_builder.dart' |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 StringLiteral, | 37 StringLiteral, |
| 38 SuperInitializer, | 38 SuperInitializer, |
| 39 TypeParameter, | 39 TypeParameter, |
| 40 VariableDeclaration, | 40 VariableDeclaration, |
| 41 VariableGet, | 41 VariableGet, |
| 42 VoidType, | 42 VoidType, |
| 43 setParents; | 43 setParents; |
| 44 | 44 |
| 45 import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute; | 45 import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute; |
| 46 | 46 |
| 47 import '../errors.dart' show internalError; | 47 import '../deprecated_problems.dart' show deprecated_internalProblem; |
| 48 | 48 |
| 49 import '../messages.dart' show warning; | 49 import '../messages.dart' show deprecated_warning; |
| 50 | 50 |
| 51 import '../loader.dart' show Loader; | 51 import '../loader.dart' show Loader; |
| 52 | 52 |
| 53 import 'kernel_builder.dart' | 53 import 'kernel_builder.dart' |
| 54 show | 54 show |
| 55 Builder, | 55 Builder, |
| 56 ClassBuilder, | 56 ClassBuilder, |
| 57 ConstructorReferenceBuilder, | 57 ConstructorReferenceBuilder, |
| 58 FormalParameterBuilder, | 58 FormalParameterBuilder, |
| 59 KernelFormalParameterBuilder, | 59 KernelFormalParameterBuilder, |
| 60 KernelLibraryBuilder, | 60 KernelLibraryBuilder, |
| 61 KernelTypeBuilder, | 61 KernelTypeBuilder, |
| 62 KernelTypeVariableBuilder, | 62 KernelTypeVariableBuilder, |
| 63 LibraryBuilder, | 63 LibraryBuilder, |
| 64 MetadataBuilder, | 64 MetadataBuilder, |
| 65 ProcedureBuilder, | 65 ProcedureBuilder, |
| 66 TypeVariableBuilder, | 66 TypeVariableBuilder, |
| 67 isRedirectingGenerativeConstructorImplementation, | 67 isRedirectingGenerativeConstructorImplementation, |
| 68 memberError; | 68 deprecated_memberError; |
| 69 | 69 |
| 70 abstract class KernelFunctionBuilder | 70 abstract class KernelFunctionBuilder |
| 71 extends ProcedureBuilder<KernelTypeBuilder> { | 71 extends ProcedureBuilder<KernelTypeBuilder> { |
| 72 final String nativeMethodName; | 72 final String nativeMethodName; |
| 73 | 73 |
| 74 FunctionNode function; | 74 FunctionNode function; |
| 75 | 75 |
| 76 Statement actualBody; | 76 Statement actualBody; |
| 77 | 77 |
| 78 KernelFunctionBuilder( | 78 KernelFunctionBuilder( |
| 79 List<MetadataBuilder> metadata, | 79 List<MetadataBuilder> metadata, |
| 80 int modifiers, | 80 int modifiers, |
| 81 KernelTypeBuilder returnType, | 81 KernelTypeBuilder returnType, |
| 82 String name, | 82 String name, |
| 83 List<TypeVariableBuilder> typeVariables, | 83 List<TypeVariableBuilder> typeVariables, |
| 84 List<FormalParameterBuilder> formals, | 84 List<FormalParameterBuilder> formals, |
| 85 KernelLibraryBuilder compilationUnit, | 85 KernelLibraryBuilder compilationUnit, |
| 86 int charOffset, | 86 int charOffset, |
| 87 this.nativeMethodName) | 87 this.nativeMethodName) |
| 88 : super(metadata, modifiers, returnType, name, typeVariables, formals, | 88 : super(metadata, modifiers, returnType, name, typeVariables, formals, |
| 89 compilationUnit, charOffset); | 89 compilationUnit, charOffset); |
| 90 | 90 |
| 91 void set body(Statement newBody) { | 91 void set body(Statement newBody) { |
| 92 if (newBody != null) { | 92 if (newBody != null) { |
| 93 if (isAbstract) { | 93 if (isAbstract) { |
| 94 return internalError("Attempting to set body on abstract method."); | 94 return deprecated_internalProblem( |
| 95 "Attempting to set body on abstract method."); |
| 95 } | 96 } |
| 96 if (isExternal) { | 97 if (isExternal) { |
| 97 return library.addCompileTimeError( | 98 return library.deprecated_addCompileTimeError( |
| 98 newBody.fileOffset, "An external method can't have a body."); | 99 newBody.fileOffset, "An external method can't have a body."); |
| 99 } | 100 } |
| 100 if (isConstructor && isConst) { | 101 if (isConstructor && isConst) { |
| 101 return library.addCompileTimeError( | 102 return library.deprecated_addCompileTimeError( |
| 102 newBody.fileOffset, "A const constructor can't have a body."); | 103 newBody.fileOffset, "A const constructor can't have a body."); |
| 103 } | 104 } |
| 104 } | 105 } |
| 105 actualBody = newBody; | 106 actualBody = newBody; |
| 106 if (function != null) { | 107 if (function != null) { |
| 107 function.body = newBody; | 108 function.body = newBody; |
| 108 newBody?.parent = function; | 109 newBody?.parent = function; |
| 109 } | 110 } |
| 110 } | 111 } |
| 111 | 112 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 List<TypeParameter> typeParameters = parent.target.typeParameters; | 144 List<TypeParameter> typeParameters = parent.target.typeParameters; |
| 144 if (typeParameters.isNotEmpty) { | 145 if (typeParameters.isNotEmpty) { |
| 145 Map<TypeParameter, DartType> substitution; | 146 Map<TypeParameter, DartType> substitution; |
| 146 DartType removeTypeVariables(DartType type) { | 147 DartType removeTypeVariables(DartType type) { |
| 147 if (substitution == null) { | 148 if (substitution == null) { |
| 148 substitution = <TypeParameter, DartType>{}; | 149 substitution = <TypeParameter, DartType>{}; |
| 149 for (TypeParameter parameter in typeParameters) { | 150 for (TypeParameter parameter in typeParameters) { |
| 150 substitution[parameter] = const DynamicType(); | 151 substitution[parameter] = const DynamicType(); |
| 151 } | 152 } |
| 152 } | 153 } |
| 153 warning(fileUri, charOffset, | 154 deprecated_warning(fileUri, charOffset, |
| 154 "Can only use type variables in instance methods."); | 155 "Can only use type variables in instance methods."); |
| 155 return substitute(type, substitution); | 156 return substitute(type, substitution); |
| 156 } | 157 } |
| 157 | 158 |
| 158 Set<TypeParameter> set = typeParameters.toSet(); | 159 Set<TypeParameter> set = typeParameters.toSet(); |
| 159 for (VariableDeclaration parameter in result.positionalParameters) { | 160 for (VariableDeclaration parameter in result.positionalParameters) { |
| 160 if (containsTypeVariable(parameter.type, set)) { | 161 if (containsTypeVariable(parameter.type, set)) { |
| 161 parameter.type = removeTypeVariables(parameter.type); | 162 parameter.type = removeTypeVariables(parameter.type); |
| 162 } | 163 } |
| 163 } | 164 } |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 | 347 |
| 347 FunctionNode buildFunction(LibraryBuilder library) { | 348 FunctionNode buildFunction(LibraryBuilder library) { |
| 348 // TODO(ahe): Should complain if another type is explicitly set. | 349 // TODO(ahe): Should complain if another type is explicitly set. |
| 349 return super.buildFunction(library)..returnType = const VoidType(); | 350 return super.buildFunction(library)..returnType = const VoidType(); |
| 350 } | 351 } |
| 351 | 352 |
| 352 Constructor get target => constructor; | 353 Constructor get target => constructor; |
| 353 | 354 |
| 354 void checkSuperOrThisInitializer(Initializer initializer) { | 355 void checkSuperOrThisInitializer(Initializer initializer) { |
| 355 if (superInitializer != null || redirectingInitializer != null) { | 356 if (superInitializer != null || redirectingInitializer != null) { |
| 356 memberError( | 357 deprecated_memberError( |
| 357 target, | 358 target, |
| 358 "Can't have more than one 'super' or 'this' initializer.", | 359 "Can't have more than one 'super' or 'this' initializer.", |
| 359 initializer.fileOffset); | 360 initializer.fileOffset); |
| 360 } | 361 } |
| 361 } | 362 } |
| 362 | 363 |
| 363 void addInitializer(Initializer initializer) { | 364 void addInitializer(Initializer initializer) { |
| 364 List<Initializer> initializers = constructor.initializers; | 365 List<Initializer> initializers = constructor.initializers; |
| 365 if (initializer is SuperInitializer) { | 366 if (initializer is SuperInitializer) { |
| 366 checkSuperOrThisInitializer(initializer); | 367 checkSuperOrThisInitializer(initializer); |
| 367 superInitializer = initializer; | 368 superInitializer = initializer; |
| 368 } else if (initializer is RedirectingInitializer) { | 369 } else if (initializer is RedirectingInitializer) { |
| 369 checkSuperOrThisInitializer(initializer); | 370 checkSuperOrThisInitializer(initializer); |
| 370 redirectingInitializer = initializer; | 371 redirectingInitializer = initializer; |
| 371 if (constructor.initializers.isNotEmpty) { | 372 if (constructor.initializers.isNotEmpty) { |
| 372 memberError(target, "'this' initializer must be the only initializer.", | 373 deprecated_memberError( |
| 374 target, |
| 375 "'this' initializer must be the only initializer.", |
| 373 initializer.fileOffset); | 376 initializer.fileOffset); |
| 374 } | 377 } |
| 375 } else if (redirectingInitializer != null) { | 378 } else if (redirectingInitializer != null) { |
| 376 memberError(target, "'this' initializer must be the only initializer.", | 379 deprecated_memberError( |
| 380 target, |
| 381 "'this' initializer must be the only initializer.", |
| 377 initializer.fileOffset); | 382 initializer.fileOffset); |
| 378 } else if (superInitializer != null) { | 383 } else if (superInitializer != null) { |
| 379 // If there is a super initializer ([initializer] isn't it), we need to | 384 // If there is a super initializer ([initializer] isn't it), we need to |
| 380 // insert [initializer] before the super initializer (thus ensuring that | 385 // insert [initializer] before the super initializer (thus ensuring that |
| 381 // the super initializer is always last). | 386 // the super initializer is always last). |
| 382 assert(superInitializer != initializer); | 387 assert(superInitializer != initializer); |
| 383 assert(initializers.last == superInitializer); | 388 assert(initializers.last == superInitializer); |
| 384 initializers.removeLast(); | 389 initializers.removeLast(); |
| 385 if (!hasMovedSuperInitializer) { | 390 if (!hasMovedSuperInitializer) { |
| 386 // To preserve correct evaluation order, the arguments to super call | 391 // To preserve correct evaluation order, the arguments to super call |
| (...skipping 19 matching lines...) Expand all Loading... |
| 406 } | 411 } |
| 407 } | 412 } |
| 408 initializers.add(initializer..parent = constructor); | 413 initializers.add(initializer..parent = constructor); |
| 409 initializers.add(superInitializer); | 414 initializers.add(superInitializer); |
| 410 return; | 415 return; |
| 411 } | 416 } |
| 412 initializers.add(initializer); | 417 initializers.add(initializer); |
| 413 initializer.parent = constructor; | 418 initializer.parent = constructor; |
| 414 } | 419 } |
| 415 } | 420 } |
| OLD | NEW |