Spaces:
Runtime error
Runtime error
; | |
const List = require('../utils/List.cjs'); | |
function getFirstMatchNode(matchNode) { | |
if ('node' in matchNode) { | |
return matchNode.node; | |
} | |
return getFirstMatchNode(matchNode.match[0]); | |
} | |
function getLastMatchNode(matchNode) { | |
if ('node' in matchNode) { | |
return matchNode.node; | |
} | |
return getLastMatchNode(matchNode.match[matchNode.match.length - 1]); | |
} | |
function matchFragments(lexer, ast, match, type, name) { | |
function findFragments(matchNode) { | |
if (matchNode.syntax !== null && | |
matchNode.syntax.type === type && | |
matchNode.syntax.name === name) { | |
const start = getFirstMatchNode(matchNode); | |
const end = getLastMatchNode(matchNode); | |
lexer.syntax.walk(ast, function(node, item, list) { | |
if (node === start) { | |
const nodes = new List.List(); | |
do { | |
nodes.appendData(item.data); | |
if (item.data === end) { | |
break; | |
} | |
item = item.next; | |
} while (item !== null); | |
fragments.push({ | |
parent: list, | |
nodes | |
}); | |
} | |
}); | |
} | |
if (Array.isArray(matchNode.match)) { | |
matchNode.match.forEach(findFragments); | |
} | |
} | |
const fragments = []; | |
if (match.matched !== null) { | |
findFragments(match.matched); | |
} | |
return fragments; | |
} | |
exports.matchFragments = matchFragments; | |