96 lines
2.7 KiB
JavaScript
96 lines
2.7 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
|
|
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
|
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
|
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
|
* Code distributed by Google as part of the polymer project is also
|
|
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
|
*/
|
|
/**
|
|
* Finds and annotates the Polymer() and modulate() calls in javascript.
|
|
*/
|
|
// jshint node: true
|
|
'use strict';
|
|
var espree = require('espree');
|
|
var estraverse = require('estraverse');
|
|
|
|
var behaviorFinder = require('./behavior-finder');
|
|
var elementFinder = require('./element-finder');
|
|
var featureFinder = require('./feature-finder');
|
|
|
|
function traverse(visitorRegistries) {
|
|
var visitor;
|
|
function applyVisitors(name, node, parent) {
|
|
var returnVal;
|
|
for (var i = 0; i < visitorRegistries.length; i++) {
|
|
if (name in visitorRegistries[i]) {
|
|
returnVal = visitorRegistries[i][name](node, parent);
|
|
if (returnVal) {
|
|
return returnVal;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
enter: function(node, parent) {
|
|
visitor = 'enter' + node.type;
|
|
return applyVisitors(visitor, node, parent);
|
|
},
|
|
leave: function(node, parent) {
|
|
visitor = 'leave' + node.type;
|
|
return applyVisitors(visitor, node, parent);
|
|
},
|
|
fallback: 'iteration',
|
|
};
|
|
}
|
|
|
|
var jsParse = function jsParse(jsString) {
|
|
var script = espree.parse(jsString, {
|
|
attachComment: true,
|
|
comment: true,
|
|
loc: true,
|
|
ecmaFeatures: {
|
|
arrowFunctions: true,
|
|
blockBindings: true,
|
|
destructuring: true,
|
|
regexYFlag: true,
|
|
regexUFlag: true,
|
|
templateStrings: true,
|
|
binaryLiterals: true,
|
|
unicodeCodePointEscapes: true,
|
|
defaultParams: true,
|
|
restParams: true,
|
|
forOf: true,
|
|
objectLiteralComputedProperties: true,
|
|
objectLiteralShorthandMethods: true,
|
|
objectLiteralShorthandProperties: true,
|
|
objectLiteralDuplicateProperties: true,
|
|
generators: true,
|
|
spread: true,
|
|
classes: true,
|
|
modules: true,
|
|
jsx: true,
|
|
globalReturn: true,
|
|
}
|
|
});
|
|
|
|
var featureInfo = featureFinder();
|
|
var behaviorInfo = behaviorFinder();
|
|
var elementInfo = elementFinder();
|
|
|
|
var visitors = [featureInfo, behaviorInfo, elementInfo].map(function(info) {
|
|
return info.visitors;
|
|
});
|
|
estraverse.traverse(script, traverse(visitors));
|
|
|
|
return {
|
|
behaviors: behaviorInfo.behaviors,
|
|
elements: elementInfo.elements,
|
|
features: featureInfo.features,
|
|
parsedScript: script
|
|
};
|
|
};
|
|
|
|
module.exports = jsParse;
|