74 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var file2modulename = require('../../../tools/build/file2modulename');
 | |
| /**
 | |
|  * Wrapper around traceur that can parse the contents of a file
 | |
|  */
 | |
| module.exports = function atParser(AttachCommentTreeVisitor, SourceFile, TraceurParser, traceurOptions, log) {
 | |
| 
 | |
|   var service = {
 | |
|     /**
 | |
|      * The options to pass to traceur
 | |
|      */
 | |
|     traceurOptions: {
 | |
|       annotations: true,     // parse annotations
 | |
|       types: true,           // parse types
 | |
|       memberVariables: true, // parse class fields
 | |
|       commentCallback: true  // handle comments
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Parse a module AST from the contents of a file.
 | |
|      * @param {Object} fileInfo information about the file to parse
 | |
|      * @return { { moduleTree: Object, comments: Array } } An object containing the parsed module
 | |
|      *             AST and an array of all the comments found in the file
 | |
|      */
 | |
|     parseModule: parseModule
 | |
|   };
 | |
| 
 | |
|   return service;
 | |
| 
 | |
| 
 | |
|   // Parse the contents of the file using traceur
 | |
|   function parseModule(fileInfo) {
 | |
| 
 | |
|     var moduleName = file2modulename(fileInfo.relativePath);
 | |
|     var sourceFile = new SourceFile(moduleName, fileInfo.content);
 | |
|     var comments = [];
 | |
|     var moduleTree;
 | |
|     var parser = new TraceurParser(sourceFile);
 | |
| 
 | |
|     // Configure the parser
 | |
|     parser.handleComment = function(range) {
 | |
|       comments.push({ range: range });
 | |
|     };
 | |
|     traceurOptions.setFromObject(service.traceurOptions);
 | |
| 
 | |
|     try {
 | |
|       // Parse the file as a module, attaching the comments
 | |
|       moduleTree = parser.parseModule();
 | |
|       attachComments(moduleTree, comments);
 | |
|     } catch(ex) {
 | |
|       // HACK: sometime traceur crashes for various reasons including
 | |
|       // Not Yet Implemented (NYI)!
 | |
|       log.error(ex.stack);
 | |
|       moduleTree = {};
 | |
|     }
 | |
|     log.debug(moduleName);
 | |
|     moduleTree.moduleName = moduleName;
 | |
| 
 | |
|     // We return the module AST but also a collection of all the comments
 | |
|     // since it can be helpful to iterate through them without having to
 | |
|     // traverse the AST again
 | |
|     return {
 | |
|       moduleTree: moduleTree,
 | |
|       comments: comments
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   // attach the comments to their nearest code tree
 | |
|   function attachComments(tree, comments) {
 | |
| 
 | |
|     var visitor = new AttachCommentTreeVisitor();
 | |
|     // Visit every node of the tree using our custom method
 | |
|     visitor.visit(tree, comments);
 | |
|   }
 | |
| }; |