C. Scott Ananian has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/403695 )

Change subject: WTS: Use `yield` instead of directly returning Promises
......................................................................

WTS: Use `yield` instead of directly returning Promises

Direct return of Promises from async functions, although convenient,
can obscure the callstack if an exception is thrown (since the caller
is no longer on the callstack when the returned Promise is resolved),
and may confuse readers which have to keep track of whether the return
value is of Promise type or not in order to figure out control flow
in the case of an exception.

Prefer to explicitly `yield` rather than directly returning a Promise,
at least in the WTS code.

Change-Id: I88d5b628d3e0ac0a208f6d8188ba23b78c8ce03a
---
M lib/html2wt/DOMHandlers.js
1 file changed, 28 insertions(+), 28 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid 
refs/changes/95/403695/1

diff --git a/lib/html2wt/DOMHandlers.js b/lib/html2wt/DOMHandlers.js
index 46c7824..6e3ed47 100644
--- a/lib/html2wt/DOMHandlers.js
+++ b/lib/html2wt/DOMHandlers.js
@@ -734,7 +734,7 @@
                                );
                        }
 
-                       return state.serializeChildren(node);
+                       yield state.serializeChildren(node);
                }),
                sepnls: {
                        before: function(node, otherNode) {
@@ -780,7 +780,7 @@
                        );
                        var thHandler = state.serializer.wteHandlers.thHandler
                                .bind(state.serializer.wteHandlers, node);
-                       return state.serializeChildren(node, thHandler);
+                       yield state.serializeChildren(node, thHandler);
                }),
                sepnls: {
                        before: function(node, otherNode, state) {
@@ -830,7 +830,7 @@
                        WTSUtils.emitStartTag(tableTag, node, state);
                        var tdHandler = state.serializer.wteHandlers.tdHandler
                                .bind(state.serializer.wteHandlers, node, 
inWideTD);
-                       return state.serializeChildren(node, tdHandler);
+                       yield state.serializeChildren(node, tdHandler);
                }),
                sepnls: {
                        before: function(node, otherNode, state) {
@@ -856,7 +856,7 @@
                                wrapperUnmodified
                        );
                        WTSUtils.emitStartTag(tableTag, node, state);
-                       return state.serializeChildren(node);
+                       yield state.serializeChildren(node);
                }),
                sepnls: {
                        before: function(node, otherNode) {
@@ -878,9 +878,9 @@
                // escapeWikitext nowiking will deal with leading space for 
content
                // inside the p-tag, but forceSOL suppresses whitespace before 
the p-tag.
                forceSOL: true,
-               handle: Promise.async(function *(node, state, 
wrapperUnmodified) { // eslint-disable-line require-yield
+               handle: Promise.async(function *(node, state, 
wrapperUnmodified) {
                        // XXX: Handle single-line mode by switching to HTML 
handler!
-                       return state.serializeChildren(node);
+                       yield state.serializeChildren(node);
                }),
                sepnls: {
                        before: function(node, otherNode, state) {
@@ -1021,8 +1021,8 @@
        },
        // HTML pre
        pre_html: {
-               handle: Promise.async(function *(node, state, 
wrapperUnmodified) { // eslint-disable-line require-yield
-                       return _htmlElementHandler(node, state);
+               handle: Promise.async(function *(node, state, 
wrapperUnmodified) {
+                       yield _htmlElementHandler(node, state);
                }),
                sepnls: {
                        before: id({}),
@@ -1076,7 +1076,7 @@
                                        }
                                        state.emitChunk(out, node);
                                } else {
-                                       return _htmlElementHandler(node, state);
+                                       yield _htmlElementHandler(node, state);
                                }
                        } else if (type) {
                                switch (type) {
@@ -1103,10 +1103,10 @@
                                                // just ignore it
                                                break;
                                        default:
-                                               return 
_htmlElementHandler(node, state);
+                                               yield _htmlElementHandler(node, 
state);
                                }
                        } else {
-                               return _htmlElementHandler(node, state);
+                               yield _htmlElementHandler(node, state);
                        }
                }),
                sepnls: {
@@ -1151,12 +1151,12 @@
                        if (isRecognizedSpanWrapper(type)) {
                                if (type === 'mw:Nowiki') {
                                        var nativeExt = 
env.conf.wiki.extensionTags.get('nowiki');
-                                       return 
nativeExt.serialHandler.handle(node, state, wrapperUnmodified);
+                                       yield 
nativeExt.serialHandler.handle(node, state, wrapperUnmodified);
                                } else if 
(/(?:^|\s)mw:(?:Image|Video|Audio)(\/(Frame|Frameless|Thumb))?/.test(type)) {
                                        // TODO: Remove when 1.5.0 content is 
deprecated,
                                        // since we no longer emit media in 
spans.  See the test,
                                        // "Serialize simple image with span 
wrapper"
-                                       return 
state.serializer.figureHandler(node);
+                                       yield 
state.serializer.figureHandler(node);
                                } else if (/(?:^|\s)mw\:Entity/.test(type) && 
DU.hasNChildren(node, 1)) {
                                        // handle a new mw:Entity (not handled 
by selser) by
                                        // serializing its children
@@ -1167,7 +1167,7 @@
                                                        
Util.entityEncodeAll(node.firstChild.nodeValue),
                                                        node.firstChild);
                                        } else {
-                                               return 
state.serializeChildren(node);
+                                               yield 
state.serializeChildren(node);
                                        }
                                } else if 
(/(^|\s)mw:Placeholder(\/\w*)?/.test(type)) {
                                        if (dp.src !== undefined) {
@@ -1183,7 +1183,7 @@
                                                        ' 
'.repeat(node.firstChild.nodeValue.length),
                                                        node.firstChild);
                                        } else {
-                                               return 
_htmlElementHandler(node, state);
+                                               yield _htmlElementHandler(node, 
state);
                                        }
                                } else if (type === 'mw:FallbackId') {
                                        /* ignore contents, this is just a 
legacy compat ID */
@@ -1209,8 +1209,8 @@
                }),
        },
        figure: {
-               handle: Promise.async(function *(node, state, 
wrapperUnmodified) { // eslint-disable-line require-yield
-                       return state.serializer.figureHandler(node);
+               handle: Promise.async(function *(node, state, 
wrapperUnmodified) {
+                       yield state.serializer.figureHandler(node);
                }),
                sepnls: {
                        // TODO: Avoid code duplication
@@ -1242,17 +1242,17 @@
                }),
        },
        img: {
-               handle: Promise.async(function *(node, state, 
wrapperUnmodified) { // eslint-disable-line require-yield
+               handle: Promise.async(function *(node, state, 
wrapperUnmodified) {
                        if (node.getAttribute('rel') === 'mw:externalImage') {
                                
state.serializer.emitWikitext(node.getAttribute('src') || '', node);
                        } else {
-                               return state.serializer.figureHandler(node);
+                               yield state.serializer.figureHandler(node);
                        }
                }),
        },
        video: {
-               handle: Promise.async(function *(node, state, 
wrapperUnmodified) { // eslint-disable-line require-yield
-                       return state.serializer.figureHandler(node);
+               handle: Promise.async(function *(node, state, 
wrapperUnmodified) {
+                       yield state.serializer.figureHandler(node);
                }),
        },
        hr: {
@@ -1316,14 +1316,14 @@
                },
        },
        a:  {
-               handle: Promise.async(function *(node, state, 
wrapperUnmodified) { // eslint-disable-line require-yield
-                       return state.serializer.linkHandler(node);
+               handle: Promise.async(function *(node, state, 
wrapperUnmodified) {
+                       yield state.serializer.linkHandler(node);
                }),
                // TODO: Implement link tail escaping with nowiki in DOM 
handler!
        },
        link:  {
-               handle: Promise.async(function *(node, state, 
wrapperUnmodified) { // eslint-disable-line require-yield
-                       return state.serializer.linkHandler(node);
+               handle: Promise.async(function *(node, state, 
wrapperUnmodified) {
+                       yield state.serializer.linkHandler(node);
                }),
                sepnls: {
                        before: function(node, otherNode) {
@@ -1358,13 +1358,13 @@
                },
        },
        div: {
-               handle: Promise.async(function *(node, state, 
wrapperUnmodified) { // eslint-disable-line require-yield
+               handle: Promise.async(function *(node, state, 
wrapperUnmodified) {
                        if (/\bmw-references-wrap\b/.test(node.classList)) {
                                // Just serialize the children
-                               return state.serializeChildren(node);
+                               yield state.serializeChildren(node);
                        } else {
                                // Fall back to plain HTML serialization
-                               return _htmlElementHandler(node, state);
+                               yield _htmlElementHandler(node, state);
                        }
                }),
        },

-- 
To view, visit https://gerrit.wikimedia.org/r/403695
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I88d5b628d3e0ac0a208f6d8188ba23b78c8ce03a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: C. Scott Ananian <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to