扣丁书屋

VSCode源码分析 - 实例化服务

SyncDescriptor负责注册这些服务,当用到该服务时进程实例化使用。

目录

实例化服务

SyncDescriptor负责注册这些服务,当用到该服务时进程实例化使用

src/vs/platform/instantiation/common/descriptors.ts

export class SyncDescriptor<T> {
    readonly ctor: any;
    readonly staticArguments: any[];
    readonly supportsDelayedInstantiation: boolean;
    constructor(ctor: new (...args: any[]) => T, staticArguments: any[] = [], supportsDelayedInstantiation: boolean = false) {
        this.ctor = ctor;
        this.staticArguments = staticArguments;
        this.supportsDelayedInstantiation = supportsDelayedInstantiation;
    }
}

main.ts中startup方法调用invokeFunction.get实例化服务

await instantiationService.invokeFunction(async accessor => {
    const environmentService = accessor.get(IEnvironmentService);
    const configurationService = accessor.get(IConfigurationService);
    const stateService = accessor.get(IStateService);
    try {
        await this.initServices(environmentService, configurationService as ConfigurationService, stateService as StateService);
    } catch (error) {

        // Show a dialog for errors that can be resolved by the user
        this.handleStartupDataDirError(environmentService, error);

        throw error;
    }
});

get方法调用_getOrCreateServiceInstance,这里第一次创建会存入缓存中 下次实例化对象时会优先从缓存中获取对象。

src/vs/platform/instantiation/common/instantiationService.ts

invokeFunction<R, TS extends any[] = []>(fn: (accessor: ServicesAccessor, ...args: TS) => R, ...args: TS): R {
    let _trace = Trace.traceInvocation(fn);
    let _done = false;
    try {
        const accessor: ServicesAccessor = {
            get: <T>(id: ServiceIdentifier<T>, isOptional?: typeof optional) => {

                if (_done) {
                    throw illegalState('service accessor is only valid during the invocation of its target method');
                }

                const result = this._getOrCreateServiceInstance(id, _trace);
                if (!result && isOptional !== optional) {
                    throw new Error(`[invokeFunction] unknown service '${id}'`);
                }
                return result;
            }
        };
        return fn.apply(undefined, [accessor, ...args]);
    } finally {
        _done = true;
        _trace.stop();
    }
}
private _getOrCreateServiceInstance<T>(id: ServiceIdentifier<T>, _trace: Trace): T {
    let thing = this._getServiceInstanceOrDescriptor(id);
    if (thing instanceof SyncDescriptor) {
        return this._createAndCacheServiceInstance(id, thing, _trace.branch(id, true));
    } else {
        _trace.branch(id, false);
        return thing;
    }
}

Git 奇技淫巧

Git 是一个 「分散式版控工具」,简单的理解版控工具:大家在写东西的时候都用过 「复原」 这个功能,但是复原只能复原几步,假如想要找回我三天之前的修改,光用 「复原」 是找不回来的。而 「版控工具」 能记录每次的修改,只要提交到版本库,你就可以找到之前任何时刻的状态。

发布于:3天以前  |  37次阅读  |  详细内容 »

SHELL快速入门

shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。

发布于:5月以前  |  319次阅读  |  详细内容 »

移动设备怎样定位

解释说明移动设备的定位原理

发布于:5月以前  |  322次阅读  |  详细内容 »

node-sass在Mac下安装失败(下载失败)的解决方案

使用命令`npm install node-sass --save-dev` 在 mac下无法安装的解决方案

发布于:10月以前  |  496次阅读  |  详细内容 »

px、em、rem区别

本文通过说明px,em,rem的关系,指导如何使用字体单位。

发布于:10月以前  |  395次阅读  |  详细内容 »

rm -rf * 删除操作报 “Argument list too long”的处理方法

当目录下有很多文件时,`rm *`删除文件会失败。

发布于:10月以前  |  379次阅读  |  详细内容 »

使用olivere对ElasticSearch进行简单搜索

使用github.com/olivere/elastic进行简单搜索。

发布于:11月以前  |  855次阅读  |  详细内容 »

使用"github.com/olivere/elastic"操作Elasticsearch的简单示例

github.com/olivere/elastic的简单示例,包括增,删,改,查。

发布于:11月以前  |  1643次阅读  |  详细内容 »

罗振宇2017-2018跨年演讲::中国式机会的六个“脑洞”

“时间的朋友”2017年罗振宇跨年演讲如约而至。罗振宇从一个问题开启,对你来说,2017年哪一天你认为很重要?

发布于:11月以前  |  678次阅读  |  详细内容 »

罗振宇2018-2019跨年演讲:黑天鹅、小趋势、5G、人工智能、创新......

2018年12月31日20:30,深圳“春茧”体育馆,罗振宇2018“时间的朋友”跨年演讲如约而至。

发布于:11月以前  |  650次阅读  |  详细内容 »

最多阅读

VSCode源码分析 1年以前  |  1780次阅读
VSCode源码分析 - 开发调试 1年以前  |  1083次阅读
VSCode源码分析 - 主要窗口 1年以前  |  899次阅读
VSCode源码分析 - 实例化服务 1年以前  |  853次阅读
VSCode源码分析 - 事件分发 1年以前  |  847次阅读
VSCode源码分析 - 主启动流程 1年以前  |  836次阅读
VSCode源码分析 - 进程通信 1年以前  |  797次阅读

手机扫码阅读