/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
import { SyncDescriptor0 } from "./descriptors.mjs";
import { Graph } from "./graph.mjs";
import { GetLeadingNonServiceArgs, IInstantiationService, ServiceIdentifier, ServicesAccessor } from "./instantiation.mjs";
import { ServiceCollection } from "./serviceCollection.mjs";
export declare class InstantiationService implements IInstantiationService {
    private readonly _services;
    private readonly _strict;
    private readonly _parent?;
    private readonly _enableTracing;
    readonly _serviceBrand: undefined;
    readonly _globalGraph?: Graph<string>;
    private _globalGraphImplicitDependency?;
    constructor(_services?: ServiceCollection, _strict?: boolean, _parent?: InstantiationService | undefined, _enableTracing?: boolean);
    createChild(services: ServiceCollection): IInstantiationService;
    invokeFunction<R, TS extends any[] = []>(fn: (accessor: ServicesAccessor, ...args: TS) => R, ...args: TS): R;
    createInstance<T>(descriptor: SyncDescriptor0<T>): T;
    createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(ctor: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;
    private _createInstance;
    private _setServiceInstance;
    private _getServiceInstanceOrDescriptor;
    protected _getOrCreateServiceInstance<T>(id: ServiceIdentifier<T>, _trace: Trace): T;
    private readonly _activeInstantiations;
    private _safeCreateAndCacheServiceInstance;
    private _createAndCacheServiceInstance;
    private _createServiceInstanceWithOwner;
    private _createServiceInstance;
    private _throwIfStrict;
}
declare const enum TraceType {
    None = 0,
    Creation = 1,
    Invocation = 2,
    Branch = 3
}
export declare class Trace {
    readonly type: TraceType;
    readonly name: string | null;
    static all: Set<string>;
    private static readonly _None;
    static traceInvocation(_enableTracing: boolean, ctor: any): Trace;
    static traceCreation(_enableTracing: boolean, ctor: any): Trace;
    private static _totals;
    private readonly _start;
    private readonly _dep;
    private constructor();
    branch(id: ServiceIdentifier<any>, first: boolean): Trace;
    stop(): void;
}
export {};
