File: //var/www/zaklada/html/node_modules/node-haste/lib/parse/extractJavelinSymbols.js
/**
* Copyright 2013 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var esprima = require('esprima-fb');
var Syntax = esprima.Syntax;
function traverse(node, visitor) {
var key, child;
if (visitor(node) === false) {
return;
}
for (key in node) {
child = node[key];
if (typeof child === 'object' && child !== null) {
traverse(child, visitor);
}
}
}
var javelinInstallsRe = /@javelin-installs\s+(.*)/g;
function extractJavelinSymbols(code) {
var ast = esprima.parse(code);
var defines = {};
var requires = {};
var id = null;
var visitor = function (node) {
if (node.type === Syntax.MemberExpression && !node.computed &&
node.object.name === 'JX') {
var symbolName = 'JX.' + node.property.name;
if (!defines[symbolName]) {
requires[symbolName] = true;
}
}
};
ast.body.forEach(function(node) {
var symbolName;
// Look for calls to JX.install() and JX.behavior()
if (node.type === Syntax.ExpressionStatement &&
node.expression.type === Syntax.CallExpression &&
node.expression.callee.type === Syntax.MemberExpression &&
!node.expression.callee.object.computed &&
node.expression.callee.object.name === 'JX') {
var expressionArgs = node.expression['arguments'];
if (node.expression.callee.property.name === 'install') {
symbolName = 'JX.' + expressionArgs[0].value;
defines[symbolName] = true;
if (!id) {
id = symbolName;
}
} else if (node.expression.callee.property.name === 'behavior') {
symbolName = 'javelin-behavior-' + expressionArgs[0].value;
defines[symbolName] = true;
if (!id) {
id = symbolName;
}
}
}
});
ast.body.forEach(function(node) {
traverse(node, visitor);
});
var match;
// Next we need to look at the docblock for javelin-installs.
while (match = javelinInstallsRe.exec(code)) {
var name = 'JX.' + match[1].split('.')[1];
delete requires[name];
defines[name] = true;
}
return {
id: id,
defines: Object.keys(defines),
requires: Object.keys(requires)
};
}
module.exports = extractJavelinSymbols;