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;
							 | 
						||
| 
								 | 
							
								};
							 |