Typescript 源码核心流程

1. 命令行参数解析

文件: src/tsc/tsc.ts

功能: tsc.ts 是 TypeScript 编译器的入口文件,它负责解析命令行参数并启动编译过程。

// src/tsc/tsc.ts
import * as ts from "../compiler/_namespaces/ts";
import { executeCommandLine } from "../compiler/tsc";

const commandLine = ts.parseCommandLine(ts.sys.args);
executeCommandLine(commandLine);

2. 配置文件解析

文件: src/compiler/commandLineParser.ts

功能: 该文件处理 tsconfig.json 配置文件的解析,并将解析结果转换为编译器选项。

// src/compiler/commandLineParser.ts
import { readJsonConfigFile, parseJsonSourceFileConfigFileContent } from "./tsconfig";

export function parseCommandLine(args: string[]): ParsedCommandLine {
    // 解析 tsconfig.json 文件
    const configFile = readJsonConfigFile("tsconfig.json", sys.readFile);
    return parseJsonSourceFileConfigFileContent(configFile, sys, "./");
}

3. 文件解析

文件: src/compiler/program.ts

功能: program.ts 负责创建编译器的程序实例,解析所有输入文件并创建源文件对象。

// src/compiler/program.ts
export function createProgram(rootNames: string[], options: CompilerOptions, host?: CompilerHost): Program {
    // 创建并解析程序
    const program = new Program(rootNames, options, host);
    program.parse();
    return program;
}

4. 词法分析

文件:src/compiler/scanner.ts

功能:scanner.ts 负责将输入的 TypeScript 源代码转换为一系列的词法单元。

// src/compiler/scanner.ts
export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean): Scanner {
    return new Scanner(languageVersion, skipTrivia);
}

class Scanner {
    // 实现扫描器的核心逻辑
}

5. 语法分析

文件:src/compiler/parser.ts

功能:该文件包含将 TypeScript 代码转换为抽象语法树的逻辑,是 TypeScript 语法解析的核心。

// src/compiler/parser.ts
export function parseSourceFile(fileName: string, sourceText: string): SourceFile {
    // 将源码文本转换为 AST
    return createSourceFile(fileName, sourceText, ScriptTarget.Latest);
}

6. 类型检查

文件:src/compiler/checker.ts

功能:checker.ts 包含类型检查器的主要逻辑,负责遍历 AST 并执行类型检查。

// src/compiler/checker.ts
export function getTypeChecker(program: Program): TypeChecker {
    // 返回类型检查器
    return new TypeChecker(program);
}

export class TypeChecker {
    constructor(private program: Program) {}
    public checkSourceFile(sourceFile: SourceFile): void {
        // 对 AST 进行类型检查
        this.checkNode(sourceFile);
    }
}

7. 代码生成

文件:src/compiler/emitter.ts

功能:emitter.ts 负责将类型检査后的 AST 转换为 JavaScript 代码。

// src/compiler/emitter.ts
export function emitFiles(program: Program): EmitResult {
    const emitter = new Emitter(program);
    return emitter.emit();
}

export class Emitter {
    constructor(private program: Program) {}
    public emit(): EmitResult {
        // 将 AST 转换为 JavaScript 代码
        return this.emitSourceFiles();
    }
}

8. 输出结果

文件:src/tsc/tsc.ts和src/compiler/sys.ts

功能:tsc.ts 负责输出编译结果, sys.ts 负责文件系统的交互,用于写入生成的 JavaScript 文件。

// src/tsc/tsc.ts
import * as ts from "../compiler/_namespaces/ts";
import { createProgram } from "../compiler/program";
import { sys } from "../compiler/sys";

export function executeCommandLine(commandLine: ParsedCommandLine): void {
    const program = createProgram(commandLine.fileNames, commandLine.options);
    const emitResult = program.emit();
    sys.writeFile("output.js", emitResult.outputText);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aiguangyuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值