|
12 | 12 | // See the License for the specific language governing permissions and |
13 | 13 | // limitations under the License. |
14 | 14 |
|
| 15 | +// Generator stubs for disposable and async-disposable variables. |
| 16 | +func disposableVariableGeneratorStubs( |
| 17 | + inContext contextRequirement : Context, |
| 18 | + withSymbol symbolProperty : String, |
| 19 | + genDisposableVariable : @escaping (ProgramBuilder, Variable) -> Void) -> [GeneratorStub] { |
| 20 | + return [ |
| 21 | + GeneratorStub( |
| 22 | + "DisposableObjectLiteralBeginGenerator", |
| 23 | + inContext: .single(contextRequirement), |
| 24 | + provides: [.objectLiteral] |
| 25 | + ) { b in |
| 26 | + // Ensure we have the desired symbol below. |
| 27 | + b.createSymbolProperty(symbolProperty) |
| 28 | + b.emit(BeginObjectLiteral()) |
| 29 | + }, |
| 30 | + GeneratorStub( |
| 31 | + "DisposableObjectLiteralComputedMethodBeginGenerator", |
| 32 | + inContext: .single(.objectLiteral), |
| 33 | + provides: [.javascript, .subroutine, .method] |
| 34 | + ) { b in |
| 35 | + // It should be safe to assume that we find at least the |
| 36 | + // desired symbol we created above. |
| 37 | + let symbol = b.randomVariable(forUseAs: .jsSymbol) |
| 38 | + let parameters = b.randomParameters() |
| 39 | + b.setParameterTypesForNextSubroutine(parameters.parameterTypes) |
| 40 | + b.emit( |
| 41 | + BeginObjectLiteralComputedMethod( |
| 42 | + parameters: parameters.parameters), |
| 43 | + withInputs: [symbol]) |
| 44 | + }, |
| 45 | + GeneratorStub( |
| 46 | + "DisposableObjectLiteralComputedMethodEndGenerator", |
| 47 | + inContext: .single([.javascript, .subroutine, .method]), |
| 48 | + provides: [.objectLiteral] |
| 49 | + ) { b in |
| 50 | + b.maybeReturnRandomJsVariable(0.9) |
| 51 | + b.emit(EndObjectLiteralComputedMethod()) |
| 52 | + }, |
| 53 | + GeneratorStub( |
| 54 | + "DisposableObjectLiteralEndGenerator", |
| 55 | + inContext: .single(.objectLiteral) |
| 56 | + ) { b in |
| 57 | + let disposableVariable = b.emit(EndObjectLiteral()).output |
| 58 | + genDisposableVariable(b, disposableVariable) |
| 59 | + }, |
| 60 | + ] |
| 61 | +} |
| 62 | + |
15 | 63 | // |
16 | 64 | // Code generators. |
17 | 65 | // |
@@ -423,34 +471,20 @@ public let CodeGenerators: [CodeGenerator] = [ |
423 | 471 | ]), |
424 | 472 |
|
425 | 473 | CodeGenerator( |
426 | | - "DisposableVariableGenerator", inContext: .single(.subroutine), inputs: .one |
427 | | - ) { b, val in |
428 | | - assert(b.context.contains(.subroutine)) |
429 | | - let dispose = b.createSymbolProperty("dispose") |
430 | | - let disposableVariable = b.buildObjectLiteral { obj in |
431 | | - obj.addProperty("value", as: val) |
432 | | - obj.addComputedMethod(dispose, with: .parameters(n: 0)) { args in |
433 | | - b.maybeReturnRandomJsVariable(0.9) |
434 | | - } |
435 | | - } |
436 | | - b.loadDisposableVariable(disposableVariable) |
437 | | - }, |
| 474 | + "DisposableVariableGenerator", |
| 475 | + disposableVariableGeneratorStubs( |
| 476 | + inContext: .subroutine, |
| 477 | + withSymbol: "dispose") { b, variable in |
| 478 | + b.loadDisposableVariable(variable) |
| 479 | + }), |
438 | 480 |
|
439 | 481 | CodeGenerator( |
440 | | - "AsyncDisposableVariableGenerator", inContext: .single(.asyncFunction), |
441 | | - inputs: .one |
442 | | - ) { b, val in |
443 | | - assert(b.context.contains(.asyncFunction)) |
444 | | - let asyncDispose = b.createSymbolProperty("asyncDispose") |
445 | | - let asyncDisposableVariable = b.buildObjectLiteral { obj in |
446 | | - obj.addProperty("value", as: val) |
447 | | - obj.addComputedMethod(asyncDispose, with: .parameters(n: 0)) { |
448 | | - args in |
449 | | - b.maybeReturnRandomJsVariable(0.9) |
450 | | - } |
451 | | - } |
452 | | - b.loadAsyncDisposableVariable(asyncDisposableVariable) |
453 | | - }, |
| 482 | + "AsyncDisposableVariableGenerator", |
| 483 | + disposableVariableGeneratorStubs( |
| 484 | + inContext: .asyncFunction, |
| 485 | + withSymbol: "asyncDispose") { b, variable in |
| 486 | + b.loadAsyncDisposableVariable(variable) |
| 487 | + }), |
454 | 488 |
|
455 | 489 | CodeGenerator( |
456 | 490 | "ObjectLiteralGenerator", |
|
0 commit comments