| // Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:expect/expect.dart'; |
| import 'package:js_ast/js_ast.dart'; |
| |
| class _DeferredStatement extends DeferredStatement { |
| final Statement? _statement; |
| @override |
| Statement get statement => _statement!; |
| |
| _DeferredStatement(this._statement); |
| } |
| |
| void main() { |
| // Deferring a statement should not change how it prints. |
| var undeferredStatement = js.statement('var x = 3'); |
| var deferredStatement = _DeferredStatement(undeferredStatement); |
| Expect.equals(DebugPrint(undeferredStatement), DebugPrint(deferredStatement)); |
| |
| // Printing a non-finalized DeferredStatement throws. |
| Expect.throws(() => DebugPrint(_DeferredStatement(null))); |
| |
| // DeferredStatement with empty Block puts braces. |
| Expect.equals(DebugPrint(_DeferredStatement(Block.empty())), '{\n}\n'); |
| |
| // DeferredStatement in block with nested block gets elided. |
| Expect.equals( |
| DebugPrint(Block([_DeferredStatement(Block.empty())])), '{\n}\n'); |
| Expect.equals( |
| DebugPrint(Block([ |
| _DeferredStatement( |
| _DeferredStatement(_DeferredStatement(Block.empty()))) |
| ])), |
| '{\n}\n'); |
| |
| // Nested Blocks in DeferredStatements are elided. |
| Expect.equals( |
| DebugPrint( |
| Block([ |
| _DeferredStatement( |
| Block([ |
| _DeferredStatement(Block.empty()), |
| Block.empty(), |
| Block([ |
| _DeferredStatement(Block.empty()), |
| Block.empty(), |
| ]), |
| _DeferredStatement(_DeferredStatement(Block.empty())), |
| ]), |
| ), |
| ]), |
| ), |
| '{\n}\n'); |
| |
| // DeferredStatement with empty Statement prints semicolon and a newline. |
| Expect.equals(DebugPrint(_DeferredStatement(EmptyStatement())), ';\n'); |
| } |