Skip to content

Commit

Permalink
have createSdkContext create sdkPackage, createTcgcContext not (#1192)
Browse files Browse the repository at this point in the history
Co-authored-by: iscai-msft <[email protected]>
  • Loading branch information
2 people authored and tadelesh committed Jul 25, 2024
1 parent 74b3302 commit a9a538a
Show file tree
Hide file tree
Showing 12 changed files with 138 additions and 175 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
changeKind: feature
packages:
- "@azure-tools/typespec-autorest-canonical"
- "@azure-tools/typespec-autorest"
- "@azure-tools/typespec-client-generator-core"
---

expose createTcgcContext, which is the minimal context object that handles scope
16 changes: 8 additions & 8 deletions packages/typespec-autorest-canonical/src/emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@ import {
sortOpenAPIDocument,
} from "@azure-tools/typespec-autorest";
import { isArmCommonType } from "@azure-tools/typespec-azure-resource-manager";
import { SdkContext, createSdkContext } from "@azure-tools/typespec-client-generator-core";
import { createTCGCContext, type TCGCContext } from "@azure-tools/typespec-client-generator-core";
import {
EmitContext,
Namespace,
Program,
Service,
Type,
emitFile,
getDirectoryPath,
getNamespaceFullName,
interpolatePath,
listServices,
Namespace,
navigateType,
Program,
resolvePath,
Service,
Type,
} from "@typespec/compiler";
import {
getRenamedFrom,
Expand Down Expand Up @@ -50,8 +50,8 @@ interface ResolvedAutorestCanonicalEmitterOptions extends AutorestDocumentEmitte

export async function $onEmit(context: EmitContext<AutorestCanonicalEmitterOptions>) {
const resolvedOptions = { ...defaultOptions, ...context.options };
const tcgcSdkContext = await createSdkContext(
context,
const tcgcSdkContext = createTCGCContext(
context.program,
"@azure-tools/typespec-autorest-canonical"
);
const armTypesDir = interpolatePath(
Expand All @@ -77,7 +77,7 @@ export async function $onEmit(context: EmitContext<AutorestCanonicalEmitterOptio

async function emitAllServices(
program: Program,
tcgcSdkContext: SdkContext<any, any>,
tcgcSdkContext: TCGCContext,
options: ResolvedAutorestCanonicalEmitterOptions
) {
const services = listServices(program);
Expand Down
12 changes: 2 additions & 10 deletions packages/typespec-autorest/src/emit.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createSdkContext } from "@azure-tools/typespec-client-generator-core";
import { createTCGCContext } from "@azure-tools/typespec-client-generator-core";
import {
EmitContext,
Namespace,
Expand Down Expand Up @@ -100,15 +100,7 @@ export async function getAllServicesAtAllVersions(
program: Program,
options: ResolvedAutorestEmitterOptions
): Promise<AutorestServiceRecord[]> {
const tcgcSdkContext = await createSdkContext(
{ program, options: {} } as any,
"@azure-tools/typespec-autorest",
{
versioning: {
strategy: "ignore",
},
}
);
const tcgcSdkContext = createTCGCContext(program, "@azure-tools/typespec-autorest");

const services = listServices(program);
if (services.length === 0) {
Expand Down
17 changes: 10 additions & 7 deletions packages/typespec-autorest/src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
import { SdkContext, getClientNameOverride } from "@azure-tools/typespec-client-generator-core";
import {
ModelProperty,
Operation,
Program,
Service,
Type,
getClientNameOverride,
type TCGCContext,
} from "@azure-tools/typespec-client-generator-core";
import {
getFriendlyName,
getProjectedName,
getVisibility,
isGlobalNamespace,
isService,
isTemplateInstance,
ModelProperty,
Operation,
Program,
Service,
Type,
} from "@typespec/compiler";
import { getOperationId } from "@typespec/openapi";
import { pascalCase } from "change-case";
Expand All @@ -19,7 +22,7 @@ export interface AutorestEmitterContext {
readonly program: Program;
readonly service: Service;
readonly outputFile: string;
readonly tcgcSdkContext: SdkContext;
readonly tcgcSdkContext: TCGCContext;
readonly version?: string;
}

Expand Down
32 changes: 21 additions & 11 deletions packages/typespec-client-generator-core/src/decorators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ import {
SdkHttpOperation,
SdkOperationGroup,
SdkServiceOperation,
TCGCContext,
UsageFlags,
} from "./interfaces.js";
import {
AllScopes,
TCGCContext,
clientNameKey,
getValidApiVersion,
parseEmitterName,
Expand Down Expand Up @@ -590,6 +590,20 @@ export function listOperationsInOperationGroup(
return operations;
}

export function createTCGCContext(program: Program, emitterName: string): TCGCContext {
const diagnostics = createDiagnosticCollector();
return {
program,
emitterName: diagnostics.pipe(parseEmitterName(program, emitterName)),
diagnostics: diagnostics.diagnostics,
originalProgram: program,
__namespaceToApiVersionParameter: new Map(),
__tspTypeToApiVersions: new Map(),
__namespaceToApiVersionClientDefaultValue: new Map(),
previewStringRegex: /-preview$/,
};
}

interface VersioningStrategy {
readonly strategy?: "ignore";
readonly previewStringRegex?: RegExp; // regex to match preview versions
Expand All @@ -614,27 +628,23 @@ export async function createSdkContext<
const generateProtocolMethods = context.options["generate-protocol-methods"] ?? protocolOptions;
const generateConvenienceMethods =
context.options["generate-convenience-methods"] ?? convenienceOptions;
const tcgcContext = createTCGCContext(
context.program,
(emitterName ?? context.program.emitters[0]?.metadata?.name)!
);
const sdkContext: SdkContext<TOptions, TServiceOperation> = {
program: context.program,
...tcgcContext,
emitContext: context,
sdkPackage: undefined!,
emitterName: diagnostics.pipe(
parseEmitterName(context.program, emitterName ?? context.program.emitters[0]?.metadata?.name)
), // eslint-disable-line deprecation/deprecation
generateProtocolMethods: generateProtocolMethods,
generateConvenienceMethods: generateConvenienceMethods,
filterOutCoreModels: context.options["filter-out-core-models"] ?? true,
packageName: context.options["package-name"],
flattenUnionAsEnum: context.options["flatten-union-as-enum"] ?? true,
diagnostics: diagnostics.diagnostics,
apiVersion: options?.versioning?.strategy === "ignore" ? "all" : context.options["api-version"],
originalProgram: context.program,
__namespaceToApiVersionParameter: new Map(),
__tspTypeToApiVersions: new Map(),
__namespaceToApiVersionClientDefaultValue: new Map(),
examplesDirectory: context.options["examples-directory"],
decoratorsAllowList: [...defaultDecoratorsAllowList, ...(options?.additionalDecorators ?? [])],
previewStringRegex: options?.versioning?.previewStringRegex || /-preview$/,
previewStringRegex: options?.versioning?.previewStringRegex || tcgcContext.previewStringRegex,
};
sdkContext.sdkPackage = getSdkPackage(sdkContext);
for (const client of sdkContext.sdkPackage.clients) {
Expand Down
2 changes: 1 addition & 1 deletion packages/typespec-client-generator-core/src/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ import {
SdkQueryParameter,
SdkServiceResponseHeader,
SdkType,
TCGCContext,
} from "./interfaces.js";
import {
TCGCContext,
getAvailableApiVersions,
getDocHelper,
getHttpOperationResponseHeaders,
Expand Down
37 changes: 36 additions & 1 deletion packages/typespec-client-generator-core/src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ import {
EmitContext,
Interface,
IntrinsicScalarName,
Model,
ModelProperty,
Namespace,
Operation,
Program,
ProjectedProgram,
Type,
Union,
} from "@typespec/compiler";
import {
HttpAuth,
Expand All @@ -19,7 +23,38 @@ import {
HttpVerb,
Visibility,
} from "@typespec/http";
import { TCGCContext } from "./internal-utils.js";
import { TspLiteralType } from "./internal-utils.js";

export interface TCGCContext {
program: Program;
emitterName: string;
generateProtocolMethods?: boolean;
generateConvenienceMethods?: boolean;
filterOutCoreModels?: boolean;
packageName?: string;
flattenUnionAsEnum?: boolean;
arm?: boolean;
modelsMap?: Map<Type, SdkModelType | SdkEnumType>;
operationModelsMap?: Map<Operation, Map<Type, SdkModelType | SdkEnumType>>;
generatedNames?: Map<Union | Model | TspLiteralType, string>;
spreadModels?: Map<Model, SdkModelType>;
httpOperationCache?: Map<Operation, HttpOperation>;
unionsMap?: Map<Union, SdkUnionType>;
__namespaceToApiVersionParameter: Map<Interface | Namespace, SdkParameter>;
__tspTypeToApiVersions: Map<Type, string[]>;
__namespaceToApiVersionClientDefaultValue: Map<Interface | Namespace, string | undefined>;
knownScalars?: Record<string, SdkBuiltInKinds>;
diagnostics: readonly Diagnostic[];
__subscriptionIdParameter?: SdkParameter;
__rawClients?: SdkClient[];
apiVersion?: string;
__service_projection?: Map<Namespace, [Namespace, ProjectedProgram | undefined]>;
__httpOperationExamples?: Map<HttpOperation, SdkHttpOperationExample[]>;
originalProgram: Program;
examplesDirectory?: string;
decoratorsAllowList?: string[];
previewStringRegex: RegExp;
}

export interface SdkContext<
TOptions extends object = Record<string, any>,
Expand Down
52 changes: 1 addition & 51 deletions packages/typespec-client-generator-core/src/internal-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,12 @@ import {
isNeverType,
isNullType,
isVoidType,
Model,
ModelProperty,
Namespace,
Numeric,
NumericLiteral,
Operation,
Program,
ProjectedProgram,
StringLiteral,
Type,
Union,
Expand All @@ -27,17 +25,13 @@ import { HttpOperation, HttpOperationResponseContent, HttpStatusCodeRange } from
import { getAddedOnVersions, getRemovedOnVersions, getVersions } from "@typespec/versioning";
import {
DecoratorInfo,
SdkBuiltInKinds,
SdkBuiltInType,
SdkClient,
SdkEnumType,
SdkHttpOperationExample,
SdkHttpResponse,
SdkModelPropertyType,
SdkModelType,
SdkParameter,
SdkType,
SdkUnionType,
TCGCContext,
} from "./interfaces.js";
import { createDiagnostic, createStateSymbol } from "./lib.js";
import {
Expand Down Expand Up @@ -389,50 +383,6 @@ export function isHttpOperation(context: TCGCContext, obj: any): obj is HttpOper

export type TspLiteralType = StringLiteral | NumericLiteral | BooleanLiteral;

export interface TCGCContext {
program: Program;
emitterName: string;
generateProtocolMethods?: boolean;
generateConvenienceMethods?: boolean;
filterOutCoreModels?: boolean;
packageName?: string;
flattenUnionAsEnum?: boolean;
arm?: boolean;
modelsMap?: Map<Type, SdkModelType | SdkEnumType>;
operationModelsMap?: Map<Operation, Map<Type, SdkModelType | SdkEnumType>>;
generatedNames?: Map<Union | Model | TspLiteralType, string>;
spreadModels?: Map<Model, SdkModelType>;
httpOperationCache?: Map<Operation, HttpOperation>;
unionsMap?: Map<Union, SdkUnionType>;
__namespaceToApiVersionParameter: Map<Interface | Namespace, SdkParameter>;
__tspTypeToApiVersions: Map<Type, string[]>;
__namespaceToApiVersionClientDefaultValue: Map<Interface | Namespace, string | undefined>;
knownScalars?: Record<string, SdkBuiltInKinds>;
diagnostics: readonly Diagnostic[];
__subscriptionIdParameter?: SdkParameter;
__rawClients?: SdkClient[];
apiVersion?: string;
__service_projection?: Map<Namespace, [Namespace, ProjectedProgram | undefined]>;
__httpOperationExamples?: Map<HttpOperation, SdkHttpOperationExample[]>;
originalProgram: Program;
examplesDirectory?: string;
decoratorsAllowList?: string[];
previewStringRegex: RegExp;
}

export function createTCGCContext(program: Program): TCGCContext {
return {
program,
emitterName: "__TCGC_INTERNAL__",
diagnostics: [],
originalProgram: program,
__namespaceToApiVersionParameter: new Map(),
__tspTypeToApiVersions: new Map(),
__namespaceToApiVersionClientDefaultValue: new Map(),
previewStringRegex: /-preview$/,
};
}

export function getNonNullOptions(type: Union): Type[] {
return [...type.variants.values()].map((x) => x.type).filter((t) => !isNullType(t));
}
Expand Down
Loading

0 comments on commit a9a538a

Please sign in to comment.