typescript-closure-tools
Version:
Command-line tools to convert closure-style JSDoc annotations to typescript, and to convert typescript sources to closure externs files
88 lines (70 loc) • 2.34 kB
text/typescript
import fs = require('fs');
import parser = require('./parser');
import combine = require('./combine');
import options = require('./options');
var fileByProvide: { [key: string]: string } = {};
interface FileCache {
[fileName: string]: combine.Symbols;
}
var providesByFile: FileCache = {};
function parent_symbol(name: string) {
var dot = name.lastIndexOf('.');
return name.substring(0, dot);
}
/**
* @param symbolName
* @returns file that goog.provide's name
*/
export function file(symbolName: string): string {
if (symbolName)
return fileByProvide[symbolName] || file(parent_symbol(symbolName));
else
return null;
}
/**
* @param fileName
* @returns value of name
*/
export function symbols(fileName: string): combine.Symbols {
if (!providesByFile[fileName])
providesByFile[fileName] = combine.members(parser.jsdoc(fs.readFileSync(fileName, 'utf8')));
if (providesByFile[fileName])
return providesByFile[fileName];
}
export function symbol(symbolName: string): combine.Symbol {
var fileName = file(symbolName);
if (fileName) {
var s = symbols(fileName);
return s.classes[symbolName] || s.modules[symbolName];
} else return null;
}
export function member(symbolName: string): parser.Value {
var fileName = file(symbolName);
if (fileName) {
var s = symbols(fileName);
var dot = symbolName.lastIndexOf('.');
var moduleName = symbolName.substring(0, dot);
var memberName = symbolName.substring(dot + 1);
var moduleValue = s.modules[moduleName] || {};
return moduleValue[memberName] || null;
} else return null;
}
// If user gives a TSV file with provided symbols, use that
if (options.provides) {
fs.readFileSync(options.provides, 'utf8').split('\n').forEach(line => {
var columns = line.split('\t');
var file = columns[0];
var symbol = columns[1];
fileByProvide[symbol] = file;
});
}
// Otherwise parse all inputs
else {
options.todo.forEach(todo => {
var found = symbols(todo.input);
var classNames = Object.keys(found.classes);
var moduleNames = Object.keys(found.modules);
var names = classNames.concat(moduleNames);
names.forEach(name => fileByProvide[name] = todo.input);
});
}