66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var List = require('../common/List');
 | |
| 
 | |
| 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) {
 | |
|             var start = getFirstMatchNode(matchNode);
 | |
|             var end = getLastMatchNode(matchNode);
 | |
| 
 | |
|             lexer.syntax.walk(ast, function(node, item, list) {
 | |
|                 if (node === start) {
 | |
|                     var nodes = new List();
 | |
| 
 | |
|                     do {
 | |
|                         nodes.appendData(item.data);
 | |
| 
 | |
|                         if (item.data === end) {
 | |
|                             break;
 | |
|                         }
 | |
| 
 | |
|                         item = item.next;
 | |
|                     } while (item !== null);
 | |
| 
 | |
|                     fragments.push({
 | |
|                         parent: list,
 | |
|                         nodes: nodes
 | |
|                     });
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         if (Array.isArray(matchNode.match)) {
 | |
|             matchNode.match.forEach(findFragments);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     var fragments = [];
 | |
| 
 | |
|     if (match.matched !== null) {
 | |
|         findFragments(match.matched);
 | |
|     }
 | |
| 
 | |
|     return fragments;
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|     matchFragments: matchFragments
 | |
| };
 |