Now the visitor will find the last jsdoc style comment (e.g. `/** jsdoc comment */`) before the current code item, ignoring any inline style comments (e.g. `// inline comment`) in between. Closes #1072
		
			
				
	
	
		
			54 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			2.0 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 + ' : ' +
 | |
|           this.currentComment.range.toString());
 | |
| 
 | |
|       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 &&
 | |
|         this.currentComment.range.end.offset < tree.location.start.offset) {
 | |
|         log.silly('tree: ' + tree.constructor.name + ' - ' + tree.location.start.line);
 | |
|         while (this.currentComment &&
 | |
|                   this.currentComment.range.end.offset < tree.location.start.offset) {
 | |
|           var commentText = this.currentComment.range.toString();
 | |
| 
 | |
|           // Only store the comment if it is JSDOC style (e.g. /** some comment */)
 | |
|           if (/^\/\*\*([\w\W]*)\*\/$/.test(commentText)) {
 | |
|             log.info('comment: ' + this.currentComment.range.start.line + ' - ' +
 | |
|                                    this.currentComment.range.end.line + ' : ' +
 | |
|                                    commentText);
 | |
| 
 | |
|             tree.commentBefore = this.currentComment;
 | |
|             this.currentComment.treeAfter = tree;
 | |
|           }
 | |
| 
 | |
|           this.index++;
 | |
|           this.currentComment = this.comments[this.index];
 | |
|         }
 | |
|       }
 | |
|       return ParseTreeVisitor.prototype.visitAny.call(this, tree);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   return AttachCommentTreeVisitorImpl;
 | |
| }; |