blob: 57408243f2b3b92150f7a6407d439a92d6bacfe6 [file] [log] [blame]
var fs = require('fs');
function trim(str) {
return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
function replaceStatic(contents, body) {
return contents.replace(/(static\s*\{)[\s\S]+?(\})/m, '$1\n' + body + '\t$2');
}
function replaceHandle(contents, body) {
return contents.replace(/(switch\s*\(\w+\)\s*\{)[\s\S]+?(\})/m, '$1\n' + body + '\t\t$2');
}
function joinLines(lines, indent) {
return indent + lines.join('\n' + indent) + '\n';
}
var visitorFile = __dirname + '/../src/org/eclipse/dltk/javascript/ast/ASTVisitor.java';
var contents = fs.readFileSync(visitorFile, 'UTF-8');
contents = replaceStatic(contents, '');
contents = replaceHandle(contents, '');
var matches = [];
var methodPattern = /public\s+(abstract\s+)?E\s+(visit\w+)\(\s*(\w+)\s+\w+\)/g;
var m;
while (m = methodPattern.exec(contents)) {
if (m[3] == 'ASTNode') {
continue; // skip visitUnknownNode
}
matches.push({method: m[2], type: m[3] });
}
console.log('Number of matched methods: ' + matches.length);
var staticInit = [];
for (var i in matches) {
staticInit.push('HANDLERS.put(' + matches[i].type + '.class, ' + i + ');');
}
var handle = [];
for (var i in matches) {
handle.push('case ' + i + ':');
handle.push('\treturn ' + matches[i].method + '((' + matches[i].type + ') node);');
}
var newContents = contents;
newContents = replaceStatic(newContents, joinLines(staticInit, '\t\t'));
newContents = replaceHandle(newContents, joinLines(handle, '\t\t'));
fs.writeFileSync(visitorFile, newContents, 'UTF-8');