42 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| module.exports = function AttachCommentTreeVisitor(ParseTreeVisitor, log) {
 | |
| 
 | |
|   function AttachCommentTreeVisitorImpl() {
 | |
|     ParseTreeVisitor.call(this);
 | |
|   }
 | |
| 
 | |
|   AttachCommentTreeVisitorImpl.prototype = {
 | |
| 
 | |
|     __proto__: ParseTreeVisitor.prototype,
 | |
| 
 | |
| 
 | |
|     visit: function(tree, comments) {
 | |
|       this.comments = comments;
 | |
|       this.index = 0;
 | |
|       this.currentComment = this.comments[this.index];
 | |
| 
 | |
|       if (this.currentComment) log.silly('comment: ' +
 | |
|           this.currentComment.range.start.line + ' - ' +
 | |
|           this.currentComment.range.end.line);
 | |
| 
 | |
|       ParseTreeVisitor.prototype.visit.call(this, tree);
 | |
|     },
 | |
| 
 | |
|     // Really we ought to subclass ParseTreeVisitor but this is fiddly in ES5 so
 | |
|     // it is easier to simply override the prototype's method on the instance
 | |
|     visitAny: function(tree) {
 | |
|       if (tree && tree.location && tree.location.start && this.currentComment) {
 | |
|         if (this.currentComment.range.end.offset < tree.location.start.offset) {
 | |
|           log.silly('tree: ' + tree.constructor.name + ' - ' + tree.location.start.line);
 | |
|           tree.commentBefore = this.currentComment;
 | |
|           this.currentComment.treeAfter = tree;
 | |
|           this.index++;
 | |
|           this.currentComment = this.comments[this.index];
 | |
|           if (this.currentComment) log.silly('comment: ' + this.currentComment.range.start.line + ' - ' + this.currentComment.range.end.line);
 | |
|         }
 | |
|       }
 | |
|       return ParseTreeVisitor.prototype.visitAny.call(this, tree);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   return AttachCommentTreeVisitorImpl;
 | |
| }; |