Skip to content

Instantly share code, notes, and snippets.

@kaosat-dev
Last active April 18, 2017 10:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kaosat-dev/e71005c4745cfb5c4db7a1c528316fdb to your computer and use it in GitHub Desktop.
Save kaosat-dev/e71005c4745cfb5c4db7a1c528316fdb to your computer and use it in GitHub Desktop.
esnextbin sketch
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ESNextbin Sketch</title>
<!-- put additional styles and scripts here -->
</head>
<body>
<div id='output'></div>
</body>
</html>
// Welcome! require() some modules from npm (like you were using browserify)
// and then hit Run Code to run your code on the right side.
// Modules get downloaded from browserify-cdn and bundled in your browser.
const esprima = require('esprima')
const escope = require('escope')
const estraverse = require('estraverse')
const nodeIdPerLang = {
'js': {}
}//ASTNodeIdentificator
function astFromSource (source, options) {
const defaults = {
loc: true, range: true, tolerant: true
}
options = Object.assign({}, defaults, options)
let ast
var startTime = new Date()
try {
ast = esprima.parse(source, options)
// console.log("ast",ast,"scope", scope);
} catch (error) {
console.log('failed to generate ast:', error.name + ': ' + error.message)
}
var endTime = new Date()
var elapsed = endTime - startTime
console.log('AST generation took:' + elapsed)
return ast
}
function scopeFromAst(ast){
const scope = escope.analyze(ast)
return scope
}
const code = `
include('jscad-utils.jscad')
include("utils.jscad")
include('foo/bar/baz/foo.jscad')
function main() {
return union(
difference(
cube({size: 3, center: true}),
sphere({r:2, center: true})
),
intersection(
sphere({r: 1.3, center: true}),
cube({size: 2.1, center: true})
)
).translate([0,0,1.5]).scale(10);
}`
function includes(ast){
let includes = []
const result = estraverse.replace(ast, {
enter: function (node, parent) {
if (node.type == 'CallExpression' && node.callee && node.callee.name && node.callee.name ==='include')
{
if(node.arguments && arguments.length >0){
const includePath = node.arguments[0].value
console.log('call', node)
includes.push(includePath)
return null
}
return estraverse.VisitorOption.Skip;
}
},
leave: function (node, parent) {
if (node.type == 'VariableDeclarator')
console.log(node.id.name);
}
})
console.log('result',result)
console.log('includes', includes)
}
const ast = astFromSource(code)
//const scope = scopeFromAst(ast)
includes(ast)
//console.log('ast',ast, 'scope', scope)
{
"name": "esnextbin-sketch",
"version": "0.0.0",
"dependencies": {
"esprima": "3.1.3",
"escope": "3.6.0",
"estraverse": "4.2.0",
"babel-runtime": "6.22.0"
}
}
'use strict';
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Welcome! require() some modules from npm (like you were using browserify)
// and then hit Run Code to run your code on the right side.
// Modules get downloaded from browserify-cdn and bundled in your browser.
var esprima = require('esprima');
var escope = require('escope');
var estraverse = require('estraverse');
var nodeIdPerLang = {
'js': {}
}; //ASTNodeIdentificator
function astFromSource(source, options) {
var defaults = {
loc: true, range: true, tolerant: true
};
options = (0, _extends3.default)({}, defaults, options);
var ast = void 0;
var startTime = new Date();
try {
ast = esprima.parse(source, options);
// console.log("ast",ast,"scope", scope);
} catch (error) {
console.log('failed to generate ast:', error.name + ': ' + error.message);
}
var endTime = new Date();
var elapsed = endTime - startTime;
console.log('AST generation took:' + elapsed);
return ast;
}
function scopeFromAst(ast) {
var scope = escope.analyze(ast);
return scope;
}
var code = '\ninclude(\'jscad-utils.jscad\')\ninclude("utils.jscad")\ninclude(\'foo/bar/baz/foo.jscad\')\nfunction main() {\n return union(\n difference(\n cube({size: 3, center: true}),\n sphere({r:2, center: true})\n ),\n intersection(\n sphere({r: 1.3, center: true}),\n cube({size: 2.1, center: true})\n )\n ).translate([0,0,1.5]).scale(10);\n}';
function includes(ast) {
var includes = [];
var result = estraverse.replace(ast, {
enter: function enter(node, parent) {
if (node.type == 'CallExpression' && node.callee && node.callee.name && node.callee.name === 'include') {
if (node.arguments && arguments.length > 0) {
var includePath = node.arguments[0].value;
console.log('call', node);
includes.push(includePath);
return null;
}
return estraverse.VisitorOption.Skip;
}
},
leave: function leave(node, parent) {
if (node.type == 'VariableDeclarator') console.log(node.id.name);
}
});
console.log('result', result);
console.log('includes', includes);
}
var ast = astFromSource(code);
//const scope = scopeFromAst(ast)
includes(ast);
//console.log('ast',ast, 'scope', scope)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment