Skip to content

Commit 2da37f0

Browse files
PIG208gnprice
authored andcommitted
content [nfc]: Replace else-if's with switch for BlockContentNode.
Signed-off-by: Zixuan James Li <[email protected]>
1 parent dd1fa5a commit 2da37f0

File tree

2 files changed

+29
-40
lines changed

2 files changed

+29
-40
lines changed

lib/model/content.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class ZulipContent extends ContentNode {
9999
/// <https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_flow_layout/Block_and_inline_layout_in_normal_flow>
100100
///
101101
/// Almost all nodes are either a [BlockContentNode] or an [InlineContentNode].
102-
abstract class BlockContentNode extends ContentNode {
102+
sealed class BlockContentNode extends ContentNode {
103103
const BlockContentNode({super.debugHtmlNode});
104104
}
105105

@@ -134,7 +134,7 @@ class _BlockContentListNode extends DiagnosticableTree {
134134
/// but provides an inline layout context for its children.
135135
///
136136
/// See also [InlineContainerNode].
137-
class BlockInlineContainerNode extends BlockContentNode {
137+
sealed class BlockInlineContainerNode extends BlockContentNode {
138138
const BlockInlineContainerNode({
139139
super.debugHtmlNode,
140140
required this.links,

lib/widgets/content.dart

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -266,44 +266,33 @@ class BlockContentList extends StatelessWidget {
266266
Widget build(BuildContext context) {
267267
return Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
268268
...nodes.map((node) {
269-
if (node is LineBreakNode) {
270-
// This goes in a Column. So to get the effect of a newline,
271-
// just use an empty Text.
272-
return const Text('');
273-
} else if (node is ThematicBreakNode) {
274-
return const ThematicBreak();
275-
} else if (node is ParagraphNode) {
276-
return Paragraph(node: node);
277-
} else if (node is HeadingNode) {
278-
return Heading(node: node);
279-
} else if (node is QuotationNode) {
280-
return Quotation(node: node);
281-
} else if (node is ListNode) {
282-
return ListNodeWidget(node: node);
283-
} else if (node is SpoilerNode) {
284-
return Spoiler(node: node);
285-
} else if (node is CodeBlockNode) {
286-
return CodeBlock(node: node);
287-
} else if (node is MathBlockNode) {
288-
return MathBlock(node: node);
289-
} else if (node is ImageNodeList) {
290-
return MessageImageList(node: node);
291-
} else if (node is ImageNode) {
292-
assert(false,
293-
"[ImageNode] not allowed in [BlockContentList]. "
294-
"It should be wrapped in [ImageNodeList]."
295-
);
296-
return MessageImage(node: node);
297-
} else if (node is InlineVideoNode) {
298-
return MessageInlineVideo(node: node);
299-
} else if (node is EmbedVideoNode) {
300-
return MessageEmbedVideo(node: node);
301-
} else if (node is UnimplementedBlockContentNode) {
302-
return Text.rich(_errorUnimplemented(node, context: context));
303-
} else {
304-
// TODO(dart-3): Use a sealed class / pattern-matching to exclude this.
305-
throw Exception("impossible BlockContentNode: ${node.debugHtmlText}");
306-
}
269+
return switch (node) {
270+
LineBreakNode() =>
271+
// This goes in a Column. So to get the effect of a newline,
272+
// just use an empty Text.
273+
const Text(''),
274+
ThematicBreakNode() => const ThematicBreak(),
275+
ParagraphNode() => Paragraph(node: node),
276+
HeadingNode() => Heading(node: node),
277+
QuotationNode() => Quotation(node: node),
278+
ListNode() => ListNodeWidget(node: node),
279+
SpoilerNode() => Spoiler(node: node),
280+
CodeBlockNode() => CodeBlock(node: node),
281+
MathBlockNode() => MathBlock(node: node),
282+
ImageNodeList() => MessageImageList(node: node),
283+
ImageNode() => (){
284+
assert(false,
285+
"[ImageNode] not allowed in [BlockContentList]. "
286+
"It should be wrapped in [ImageNodeList]."
287+
);
288+
return MessageImage(node: node);
289+
}(),
290+
InlineVideoNode() => MessageInlineVideo(node: node),
291+
EmbedVideoNode() => MessageEmbedVideo(node: node),
292+
UnimplementedBlockContentNode() =>
293+
Text.rich(_errorUnimplemented(node, context: context)),
294+
};
295+
307296
}),
308297
]);
309298
}

0 commit comments

Comments
 (0)