@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
76 lines (74 loc) • 14.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const lodash_1 = tslib_1.__importDefault(require("lodash"));
const typescript_1 = tslib_1.__importStar(require("typescript"));
const util_1 = require("util");
const analysis_1 = require("./analysis");
const builtins_1 = require("./compile/builtins");
const CompilerDiagnostic_1 = require("./CompilerDiagnostic");
const DiagnosticCode_1 = require("./DiagnosticCode");
const DiagnosticMessage_1 = require("./DiagnosticMessage");
const getErrorKey = (diagnostic) => `${diagnostic.file}:${diagnostic.start}:${diagnostic.length}:${diagnostic.code}`;
const getFullKey = (diagnostic) => `${diagnostic.file}:${diagnostic.start}:${diagnostic.length}:${diagnostic.category}:${diagnostic.code}:${diagnostic.messageText}`;
class Context {
constructor(sourceFiles, program, typeChecker, languageService, host, mutableDiagnostics = [...typescript_1.default.getPreEmitDiagnostics(program)]) {
this.sourceFiles = sourceFiles;
this.program = program;
this.typeChecker = typeChecker;
this.languageService = languageService;
this.host = host;
this.mutableDiagnostics = mutableDiagnostics;
this.analysis = new analysis_1.AnalysisService(this);
this.builtins = builtins_1.createBuiltins(this);
}
get diagnostics() {
const errorDiagnostics = new Set();
for (const diagnostic of this.mutableDiagnostics) {
if (diagnostic.category === typescript_1.DiagnosticCategory.Error) {
errorDiagnostics.add(getErrorKey(diagnostic));
}
}
const diagnostics = this.mutableDiagnostics.filter((diagnostic) => diagnostic.category === typescript_1.DiagnosticCategory.Error || !errorDiagnostics.has(getErrorKey(diagnostic)));
return lodash_1.default.uniqBy(diagnostics, getFullKey);
}
update(sourceFiles, program, typeChecker, languageService) {
return new Context(sourceFiles, program, typeChecker, languageService, this.host, [...this.mutableDiagnostics]);
}
reportError(node, code, message, ...args) {
if (!this.isDeclarationFile(node)) {
this.mutableDiagnostics.push(new CompilerDiagnostic_1.CompilerDiagnostic(node, this.getDiagnosticMessage(message, ...args), code, typescript_1.default.DiagnosticCategory.Error));
}
}
reportWarning(node, code, message, ...args) {
if (!this.isDeclarationFile(node)) {
this.mutableDiagnostics.push(new CompilerDiagnostic_1.CompilerDiagnostic(node, this.getDiagnosticMessage(message, ...args), code, typescript_1.default.DiagnosticCategory.Warning));
}
}
reportUnsupported(node) {
this.reportError(node, DiagnosticCode_1.DiagnosticCode.UnsupportedSyntax, DiagnosticMessage_1.DiagnosticMessage.UnsupportedSyntax);
}
reportUnsupportedEfficiency(node) {
this.reportError(node, DiagnosticCode_1.DiagnosticCode.UnsupportedSyntax, DiagnosticMessage_1.DiagnosticMessage.EfficiencyUnsupportedSyntax);
}
reportTypeError(node) {
this.reportError(node, DiagnosticCode_1.DiagnosticCode.UnknownType, DiagnosticMessage_1.DiagnosticMessage.CouldNotInferType);
}
reportTypeWarning(node) {
this.reportWarning(node, DiagnosticCode_1.DiagnosticCode.UnknownType, DiagnosticMessage_1.DiagnosticMessage.CouldNotInferTypeDeopt);
}
getDiagnosticMessage(message, ...args) {
const match = message.match(/%[dfijoOs]/g);
const expectedLength = (match === null ? [] : match).length;
if (expectedLength !== args.length) {
throw new Error(`The provided arguments length (${args.length}) does not match the required arguments length (${expectedLength})`);
}
return util_1.format(message, ...args);
}
isDeclarationFile(node) {
return ts_utils_1.tsUtils.file.isDeclarationFile(ts_utils_1.tsUtils.node.getSourceFile(node));
}
}
exports.Context = Context;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFFLEdBQUcsSUFBVztRQUNyRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDNUQsSUFBSSxjQUFjLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNsQyxNQUFNLElBQUksS0FBSyxDQUNiLGtDQUFrQyxJQUFJLENBQUMsTUFBTSxtREFBbUQsY0FBYyxHQUFHLENBQ2xILENBQUM7U0FDSDtRQUVELE9BQU8sYUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFhO1FBQ3JDLE9BQU8sa0JBQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztDQUNGO0FBakdELDBCQWlHQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9Db250ZXh0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGUgYmFuLXR5cGVzXG5pbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB0cywgeyBEaWFnbm9zdGljQ2F0ZWdvcnkgfSBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgQW5hbHlzaXNTZXJ2aWNlIH0gZnJvbSAnLi9hbmFseXNpcyc7XG5pbXBvcnQgeyBCdWlsdGlucywgY3JlYXRlQnVpbHRpbnMgfSBmcm9tICcuL2NvbXBpbGUvYnVpbHRpbnMnO1xuaW1wb3J0IHsgQ29tcGlsZXJEaWFnbm9zdGljIH0gZnJvbSAnLi9Db21waWxlckRpYWdub3N0aWMnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0NvZGUgfSBmcm9tICcuL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi9EaWFnbm9zdGljTWVzc2FnZSc7XG5pbXBvcnQgeyBDb21waWxlckhvc3QgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgZ2V0RXJyb3JLZXkgPSAoZGlhZ25vc3RpYzogdHMuRGlhZ25vc3RpYykgPT5cbiAgYCR7ZGlhZ25vc3RpYy5maWxlfToke2RpYWdub3N0aWMuc3RhcnR9OiR7ZGlhZ25vc3RpYy5sZW5ndGh9OiR7ZGlhZ25vc3RpYy5jb2RlfWA7XG5jb25zdCBnZXRGdWxsS2V5ID0gKGRpYWdub3N0aWM6IHRzLkRpYWdub3N0aWMpID0+XG4gIGAke2RpYWdub3N0aWMuZmlsZX06JHtkaWFnbm9zdGljLnN0YXJ0fToke2RpYWdub3N0aWMubGVuZ3RofToke2RpYWdub3N0aWMuY2F0ZWdvcnl9OiR7ZGlhZ25vc3RpYy5jb2RlfToke2RpYWdub3N0aWMubWVzc2FnZVRleHR9YDtcblxuZXhwb3J0IGNsYXNzIENvbnRleHQge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVpbHRpbnM6IEJ1aWx0aW5zO1xuICBwdWJsaWMgcmVhZG9ubHkgYW5hbHlzaXM6IEFuYWx5c2lzU2VydmljZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHNvdXJjZUZpbGVzOiBTZXQ8dHMuU291cmNlRmlsZT4sXG4gICAgcHVibGljIHJlYWRvbmx5IHByb2dyYW06IHRzLlByb2dyYW0sXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiB0cy5MYW5ndWFnZVNlcnZpY2UsXG4gICAgcHVibGljIHJlYWRvbmx5IGhvc3Q6IENvbXBpbGVySG9zdCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG11dGFibGVEaWFnbm9zdGljczogdHMuRGlhZ25vc3RpY1tdID0gWy4uLnRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKV0sXG4gICkge1xuICAgIHRoaXMuYW5hbHlzaXMgPSBuZXcgQW5hbHlzaXNTZXJ2aWNlKHRoaXMpO1xuICAgIHRoaXMuYnVpbHRpbnMgPSBjcmVhdGVCdWlsdGlucyh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlhZ25vc3RpY3MoKTogUmVhZG9ubHlBcnJheTx0cy5EaWFnbm9zdGljPiB7XG4gICAgY29uc3QgZXJyb3JEaWFnbm9zdGljcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICAgIGZvciAoY29uc3QgZGlhZ25vc3RpYyBvZiB0aGlzLm11dGFibGVEaWFnbm9zdGljcykge1xuICAgICAgaWYgKGRpYWdub3N0aWMuY2F0ZWdvcnkgPT09IERpYWdub3N0aWNDYXRlZ29yeS5FcnJvcikge1xuICAgICAgICBlcnJvckRpYWdub3N0aWNzLmFkZChnZXRFcnJvcktleShkaWFnbm9zdGljKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSB0aGlzLm11dGFibGVEaWFnbm9zdGljcy5maWx0ZXIoXG4gICAgICAoZGlhZ25vc3RpYykgPT5cbiAgICAgICAgZGlhZ25vc3RpYy5jYXRlZ29yeSA9PT0gRGlhZ25vc3RpY0NhdGVnb3J5LkVycm9yIHx8ICFlcnJvckRpYWdub3N0aWNzLmhhcyhnZXRFcnJvcktleShkaWFnbm9zdGljKSksXG4gICAgKTtcblxuICAgIHJldHVybiBfLnVuaXFCeShkaWFnbm9zdGljcywgZ2V0RnVsbEtleSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlKFxuICAgIHNvdXJjZUZpbGVzOiBTZXQ8dHMuU291cmNlRmlsZT4sXG4gICAgcHJvZ3JhbTogdHMuUHJvZ3JhbSxcbiAgICB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlOiB0cy5MYW5ndWFnZVNlcnZpY2UsXG4gICk6IENvbnRleHQge1xuICAgIHJldHVybiBuZXcgQ29udGV4dChzb3VyY2VGaWxlcywgcHJvZ3JhbSwgdHlwZUNoZWNrZXIsIGxhbmd1YWdlU2VydmljZSwgdGhpcy5ob3N0LCBbLi4udGhpcy5tdXRhYmxlRGlhZ25vc3RpY3NdKTtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRFcnJvcihcbiAgICBub2RlOiB0cy5Ob2RlLFxuICAgIGNvZGU6IERpYWdub3N0aWNDb2RlLFxuICAgIG1lc3NhZ2U6IERpYWdub3N0aWNNZXNzYWdlLFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnkgcmVhZG9ubHktYXJyYXlcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNEZWNsYXJhdGlvbkZpbGUobm9kZSkpIHtcbiAgICAgIHRoaXMubXV0YWJsZURpYWdub3N0aWNzLnB1c2goXG4gICAgICAgIG5ldyBDb21waWxlckRpYWdub3N0aWMobm9kZSwgdGhpcy5nZXREaWFnbm9zdGljTWVzc2FnZShtZXNzYWdlLCAuLi5hcmdzKSwgY29kZSwgdHMuRGlhZ25vc3RpY0NhdGVnb3J5LkVycm9yKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueSByZWFkb25seS1hcnJheVxuICBwdWJsaWMgcmVwb3J0V2FybmluZyhub2RlOiB0cy5Ob2RlLCBjb2RlOiBEaWFnbm9zdGljQ29kZSwgbWVzc2FnZTogRGlhZ25vc3RpY01lc3NhZ2UsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRGVjbGFyYXRpb25GaWxlKG5vZGUpKSB7XG4gICAgICB0aGlzLm11dGFibGVEaWFnbm9zdGljcy5wdXNoKFxuICAgICAgICBuZXcgQ29tcGlsZXJEaWFnbm9zdGljKG5vZGUsIHRoaXMuZ2V0RGlhZ25vc3RpY01lc3NhZ2UobWVzc2FnZSwgLi4uYXJncyksIGNvZGUsIHRzLkRpYWdub3N0aWNDYXRlZ29yeS5XYXJuaW5nKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlcG9ydFVuc3VwcG9ydGVkKG5vZGU6IHRzLk5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlcG9ydEVycm9yKG5vZGUsIERpYWdub3N0aWNDb2RlLlVuc3VwcG9ydGVkU3ludGF4LCBEaWFnbm9zdGljTWVzc2FnZS5VbnN1cHBvcnRlZFN5bnRheCk7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0VW5zdXBwb3J0ZWRFZmZpY2llbmN5KG5vZGU6IHRzLk5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlcG9ydEVycm9yKG5vZGUsIERpYWdub3N0aWNDb2RlLlVuc3VwcG9ydGVkU3ludGF4LCBEaWFnbm9zdGljTWVzc2FnZS5FZmZpY2llbmN5VW5zdXBwb3J0ZWRTeW50YXgpO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydFR5cGVFcnJvcihub2RlOiB0cy5Ob2RlKTogdm9pZCB7XG4gICAgdGhpcy5yZXBvcnRFcnJvcihub2RlLCBEaWFnbm9zdGljQ29kZS5Vbmtub3duVHlwZSwgRGlhZ25vc3RpY01lc3NhZ2UuQ291bGROb3RJbmZlclR5cGUpO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydFR5cGVXYXJuaW5nKG5vZGU6IHRzLk5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlcG9ydFdhcm5pbmcobm9kZSwgRGlhZ25vc3RpY0NvZGUuVW5rbm93blR5cGUsIERpYWdub3N0aWNNZXNzYWdlLkNvdWxkTm90SW5mZXJUeXBlRGVvcHQpO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueSByZWFkb25seS1hcnJheVxuICBwcml2YXRlIGdldERpYWdub3N0aWNNZXNzYWdlKG1lc3NhZ2U6IERpYWdub3N0aWNNZXNzYWdlLCAuLi5hcmdzOiBhbnlbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF0Y2ggPSBtZXNzYWdlLm1hdGNoKC8lW2RmaWpvT3NdL2cpO1xuICAgIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gKG1hdGNoID09PSBudWxsID8gW10gOiBtYXRjaCkubGVuZ3RoO1xuICAgIGlmIChleHBlY3RlZExlbmd0aCAhPT0gYXJncy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbGVuZ3RoICgke2FyZ3MubGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIGFyZ3VtZW50cyBsZW5ndGggKCR7ZXhwZWN0ZWRMZW5ndGh9KWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQobWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICBwcml2YXRlIGlzRGVjbGFyYXRpb25GaWxlKG5vZGU6IHRzLk5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHNVdGlscy5maWxlLmlzRGVjbGFyYXRpb25GaWxlKHRzVXRpbHMubm9kZS5nZXRTb3VyY2VGaWxlKG5vZGUpKTtcbiAgfVxufVxuIl19