/** * Low-level C-like compiler API. * @module index *//***/ import { Target, Feature } from "./common"; import { Compiler, Options } from "./compiler"; import { Decompiler } from "./decompiler"; import { IDLBuilder, TSDBuilder } from "./definitions"; import { DiagnosticMessage, DiagnosticCategory, formatDiagnosticMessage } from "./diagnostics"; import { Module } from "./module"; import { Program } from "./program"; // Options /** Creates a new set of compiler options. */ export function newOptions(): Options { return new Options(); } /** Sets the `target` option. */ export function setTarget(options: Options, target: Target): void { options.target = target; } /** Sets the `noAssert` option. */ export function setNoAssert(options: Options, noAssert: bool): void { options.noAssert = noAssert; } /** Sets the `importMemory` option. */ export function setImportMemory(options: Options, importMemory: bool): void { options.importMemory = importMemory; } /** Sets the `sharedMemory` option. */ export function setSharedMemory(options: Options, sharedMemory: i32): void { options.sharedMemory = sharedMemory; } /** Sets the `importTable` option. */ export function setImportTable(options: Options, importTable: bool): void { options.importTable = importTable; } /** Sets the `sourceMap` option. */ export function setSourceMap(options: Options, sourceMap: bool): void { options.sourceMap = sourceMap; } /** Sets the `memoryBase` option. */ export function setMemoryBase(options: Options, memoryBase: u32): void { options.memoryBase = memoryBase; } /** Sets a 'globalAliases' value. */ export function setGlobalAlias(options: Options, alias: string, name: string): void { var globalAliases = options.globalAliases; if (!globalAliases) options.globalAliases = globalAliases = new Map(); globalAliases.set(alias, name); } /** Sets the `explicitStart` option. */ export function setExplicitStart(options: Options, explicitStart: bool): void { options.explicitStart = explicitStart; } /** Sets the `noUnsafe` option. */ export function setNoUnsafe(options: Options, noUnsafe: bool): void { options.noUnsafe = noUnsafe; } /** Sign extension operations. */ export const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION; /** Mutable global imports and exports. */ export const FEATURE_MUTABLE_GLOBALS = Feature.MUTABLE_GLOBALS; /** Non-trapping float to int conversion operations. */ export const FEATURE_NONTRAPPING_F2I = Feature.NONTRAPPING_F2I; /** Bulk memory operations. */ export const FEATURE_BULK_MEMORY = Feature.BULK_MEMORY; /** SIMD types and operations. */ export const FEATURE_SIMD = Feature.SIMD; /** Threading and atomic operations. */ export const FEATURE_THREADS = Feature.THREADS; /** Exception handling operations. */ export const FEATURE_EXCEPTION_HANDLING = Feature.EXCEPTION_HANDLING; /** Tail call operations. */ export const FEATURE_TAIL_CALLS = Feature.TAIL_CALLS; /** Reference types. */ export const FEATURE_REFERENCE_TYPES = Feature.REFERENCE_TYPES; /** Enables a specific feature. */ export function enableFeature(options: Options, feature: Feature): void { options.features |= feature; } /** Disables a specific feature. */ export function disableFeature(options: Options, feature: Feature): void { options.features &= ~feature; } /** Gives the compiler a hint at the optimize levels that will be used later on. */ export function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void { options.optimizeLevelHint = optimizeLevel; options.shrinkLevelHint = shrinkLevel; } // Program /** Creates a new Program. */ export function newProgram(options: Options): Program { return new Program(options); } /** Obtains the next diagnostic message. Returns `null` once complete. */ export function nextDiagnostic(program: Program): DiagnosticMessage | null { return program.diagnosticsOffset < program.diagnostics.length ? program.diagnostics[program.diagnosticsOffset++] : null; } /** Obtains the source of the given file. */ export function getSource(program: Program, internalPath: string): string | null { return program.getSource(internalPath); } /** Formats a diagnostic message to a string. */ export { formatDiagnosticMessage as formatDiagnostic }; /** Tests whether a diagnostic is informatory. */ export function isInfo(message: DiagnosticMessage): bool { return message.category == DiagnosticCategory.INFO; } /** Tests whether a diagnostic is a warning. */ export function isWarning(message: DiagnosticMessage): bool { return message.category == DiagnosticCategory.WARNING; } /** Tests whether a diagnostic is an error. */ export function isError(message: DiagnosticMessage): bool { return message.category == DiagnosticCategory.ERROR; } // Parser /** Parses a source file. If `parser` has been omitted a new one is created. */ export function parse( /** Program reference. */ program: Program, /** Source text of the file. */ text: string, /** Normalized path of the file. */ path: string, /** Whether this is an entry file. */ isEntry: bool = false ): void { program.parser.parseFile(text, path, isEntry); } /** Obtains the next required file's path. Returns `null` once complete. */ export function nextFile(program: Program): string | null { return program.parser.nextFile(); } /** Obtains the path of the dependee of a given imported file. */ export function getDependee(program: Program, file: string): string | null { return program.parser.getDependee(file); } // Compiler /** Compiles the parsed sources to a module. */ export function compile(program: Program): Module { program.parser.finish(); return new Compiler(program).compile(); } /** Decompiles a module to its (low level) source. */ export function decompile(module: Module): string { var decompiler = new Decompiler(); decompiler.decompile(module); return decompiler.finish(); } /** Builds WebIDL definitions for the specified program. */ export function buildIDL(program: Program): string { return IDLBuilder.build(program); } /** Builds TypeScript definitions for the specified program. */ export function buildTSD(program: Program): string { return TSDBuilder.build(program); } /** Builds a JSON file of a program's runtime type information. */ export function buildRTTI(program: Program): string { var sb = new Array(); sb.push("{\n \"names\": [\n"); for (let cls of program.managedClasses.values()) { sb.push(" \""); sb.push(cls.internalName); sb.push("\",\n"); } sb.push(" ],\n \"base\": [\n"); for (let cls of program.managedClasses.values()) { let base = cls.base; sb.push(" "); sb.push(base ? base.id.toString() : "0"); sb.push(",\n"); } sb.push(" ],\n \"flags\": [\n"); for (let cls of program.managedClasses.values()) { sb.push(" "); sb.push(cls.rttiFlags.toString()); sb.push(",\n"); } sb.push(" ]\n}\n"); return sb.join(""); } /** Prefix indicating a library file. */ export { LIBRARY_PREFIX } from "./common"; // Full API export * from "./ast"; // export * from "./binary"; export * from "./common"; export * from "./compiler"; export * from "./decompiler"; export * from "./definitions"; export * from "./diagnosticMessages.generated"; export * from "./diagnostics"; export * from "./flow"; export * from "./module"; export * from "./parser"; export * from "./program"; export * from "./resolver"; export * from "./tokenizer"; export * from "./types"; export * from "./util/index";