Skip to content

Improve declaration emit type safety. #124

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Addressed code review.
Signed-off-by: Titian Cernicova-Dragomir <tcernicovad1@bloomberg.net>
  • Loading branch information
dragomirtitian committed Jan 2, 2024
commit c45ffaff0261844c13b0c08483d627f5c8dc1e8c
69 changes: 18 additions & 51 deletions src/compiler/transformer.ts
Original file line number Diff line number Diff line change
@@ -4,13 +4,11 @@ import {
Bundle,
chainBundle,
CompilerOptions,
CoreEmitResolver,
createEmitHelperFactory,
CustomTransformer,
CustomTransformerFactory,
CustomTransformers,
Debug,
Diagnostic,
DiagnosticWithLocation,
disposeEmitNodes,
EmitFlags,
@@ -32,7 +30,6 @@ import {
getUseDefineForClassFields,
Identifier,
isBundle,
IsolatedTransformationContext,
isSourceFile,
LexicalEnvironmentFlags,
map,
@@ -42,7 +39,6 @@ import {
NodeFactory,
NodeFlags,
noop,
notImplemented,
NullTransformationContext,
returnUndefined,
ScriptTarget,
@@ -668,51 +664,22 @@ export function transformNodes<T extends Node>(resolver: EmitResolver | undefine
}
}
}

/** @internal */
export function createTransformationContext(kind: TransformationContextKind.NullContext): NullTransformationContext;
/** @internal */
export function createTransformationContext(
kind: TransformationContextKind.IsolatedContext,
options: CompilerOptions,
diagnostics: Diagnostic[],
resolver: CoreEmitResolver,
): IsolatedTransformationContext;
export function createTransformationContext(
kind: TransformationContextKind.IsolatedContext | TransformationContextKind.NullContext,
options: CompilerOptions = {},
diagnostics?: Diagnostic[],
resolver?: EmitResolver | CoreEmitResolver,
host?: EmitHost,
): NullTransformationContext | IsolatedTransformationContext | TransformationContext {
return {
kind,
factory: factory, // eslint-disable-line object-shorthand
getCompilerOptions: () => options,
getEmitResolver: !resolver ? notImplemented : () => resolver,
getEmitHost: !host ? notImplemented : () => host,
getEmitHelperFactory: notImplemented,
startLexicalEnvironment: noop,
resumeLexicalEnvironment: noop,
suspendLexicalEnvironment: noop,
endLexicalEnvironment: returnUndefined,
setLexicalEnvironmentFlags: noop,
getLexicalEnvironmentFlags: () => 0,
hoistVariableDeclaration: noop,
hoistFunctionDeclaration: noop,
addInitializationStatement: noop,
startBlockScope: noop,
endBlockScope: returnUndefined,
addBlockScopedVariable: noop,
requestEmitHelper: noop,
readEmitHelpers: notImplemented,
enableSubstitution: noop,
enableEmitNotification: noop,
isSubstitutionEnabled: notImplemented,
isEmitNotificationEnabled: notImplemented,
onSubstituteNode: noEmitSubstitution,
onEmitNode: noEmitNotification,
addDiagnostic: !diagnostics ? noop : (diag: Diagnostic) => diagnostics.push(diag),
};
}
/** @internal */
export const nullTransformationContext: NullTransformationContext = createTransformationContext(TransformationContextKind.NullContext);
export const nullTransformationContext: NullTransformationContext = {
kind: TransformationContextKind.NullContext,
factory: factory, // eslint-disable-line object-shorthand
getCompilerOptions: () => ({}),
startLexicalEnvironment: noop,
resumeLexicalEnvironment: noop,
suspendLexicalEnvironment: noop,
endLexicalEnvironment: returnUndefined,
setLexicalEnvironmentFlags: noop,
getLexicalEnvironmentFlags: () => 0,
hoistVariableDeclaration: noop,
hoistFunctionDeclaration: noop,
addInitializationStatement: noop,
startBlockScope: noop,
endBlockScope: returnUndefined,
addBlockScopedVariable: noop,
};
11 changes: 9 additions & 2 deletions src/compiler/transformers/declarations/transpileDeclaration.ts
Original file line number Diff line number Diff line change
@@ -7,7 +7,6 @@ import {
createPrinter,
createSourceMapGenerator,
createTextWriter,
createTransformationContext,
Debug,
Diagnostic,
EmitHost,
@@ -20,8 +19,10 @@ import {
getRelativePathToDirectoryOrUrl,
getRootLength,
getSourceFilePathInNewDir,
IsolatedTransformationContext,
normalizePath,
normalizeSlashes,
nullTransformationContext,
PrinterOptions,
SourceFile,
SourceMapGenerator,
@@ -47,7 +48,13 @@ export function transpileDeclaration(sourceFile: SourceFile, transpileOptions: T
};
const emitResolver = createEmitDeclarationResolver(sourceFile);
const diagnostics: Diagnostic[] = [];
const transformationContext = createTransformationContext(TransformationContextKind.IsolatedContext, compilerOptions, diagnostics, emitResolver);
const transformationContext: IsolatedTransformationContext = {
...nullTransformationContext,
kind: TransformationContextKind.IsolatedContext,
getCompilerOptions: () => compilerOptions,
addDiagnostic: diag => diagnostics.push(diag),
getEmitResolver: () => emitResolver,
};
const transformer = transformDeclarations(transformationContext);
const result = transformer(sourceFile);

5 changes: 3 additions & 2 deletions src/compiler/types.ts
Original file line number Diff line number Diff line change
@@ -5696,7 +5696,7 @@ export interface CoreEmitResolver {
getConstantValue(node: EnumMember | PropertyAccessExpression | ElementAccessExpression): string | number | undefined;
getAllAccessorDeclarations(declaration: AccessorDeclaration): AllAccessorDeclarations;
tryFindAmbientModule(moduleReferenceExpression: Expression): Symbol | undefined;
getPropertiesOfContainerFunction(node: FunctionDeclaration | VariableDeclaration): Symbol[]
getPropertiesOfContainerFunction(node: FunctionDeclaration | VariableDeclaration): Symbol[];
}
/** @internal */
export interface EmitResolver extends CoreEmitResolver {
@@ -9167,6 +9167,7 @@ export const enum LexicalEnvironmentFlags {
VariablesHoistedInParameters = 1 << 1, // a temp variable was hoisted while visiting a parameter list
}

/** @internal */
export const enum TransformationContextKind {
FullContext = 0,
IsolatedContext = 1,
@@ -9216,7 +9217,7 @@ export interface CoreTransformationContext {
}

export interface TransformationContext extends CoreTransformationContext {
kind: TransformationContextKind.FullContext;
/** @internal */ kind: TransformationContextKind.FullContext;
/** @internal */ getEmitResolver(): EmitResolver;
/** @internal */ getEmitHost(): EmitHost;
/** @internal */ getEmitHelperFactory(): EmitHelperFactory;