Skip to content

Commit fe48d98

Browse files
committed
Avoid creating _base declarations
1 parent 739d729 commit fe48d98

20 files changed

+55
-97
lines changed

src/compiler/transformers/declarations.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,38 +1657,34 @@ export function transformDeclarations(context: TransformationContext): Transform
16571657

16581658
const extendsClause = getEffectiveBaseTypeNode(input);
16591659
if (extendsClause && !isEntityNameExpression(extendsClause.expression) && extendsClause.expression.kind !== SyntaxKind.NullKeyword) {
1660-
// We must add a temporary declaration for the extends clause expression
1660+
// For classes which get their base type from an expression other than a name or Null, replace the expression they extend with one of the form:
1661+
// declare class A extends ({} as DEFINITION_OF_BASE_HERE) {}
16611662

1662-
const oldId = input.name ? unescapeLeadingUnderscores(input.name.escapedText) : "default";
1663-
const newId = factory.createUniqueName(`${oldId}_base`, GeneratedIdentifierFlags.Optimistic);
16641663
getSymbolAccessibilityDiagnostic = () => ({
16651664
diagnosticMessage: Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1,
16661665
errorNode: extendsClause,
16671666
typeName: input.name,
16681667
});
1669-
const varDecl = factory.createVariableDeclaration(newId, /*exclamationToken*/ undefined, resolver.createTypeOfExpression(extendsClause.expression, input, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker), /*initializer*/ undefined);
1670-
const statement = factory.createVariableStatement(needsDeclare ? [factory.createModifier(SyntaxKind.DeclareKeyword)] : [], factory.createVariableDeclarationList([varDecl], NodeFlags.Const));
1668+
const baseType = resolver.createTypeOfExpression(extendsClause.expression, input, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker);
1669+
const extendsExpression = factory.createAsExpression(factory.createObjectLiteralExpression(), baseType!); // TODO: GH#18217
16711670
const heritageClauses = factory.createNodeArray(map(input.heritageClauses, clause => {
16721671
if (clause.token === SyntaxKind.ExtendsKeyword) {
16731672
const oldDiag = getSymbolAccessibilityDiagnostic;
16741673
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(clause.types[0]);
1675-
const newClause = factory.updateHeritageClause(clause, map(clause.types, t => factory.updateExpressionWithTypeArguments(t, newId, visitNodes(t.typeArguments, visitDeclarationSubtree, isTypeNode))));
1674+
const newClause = factory.updateHeritageClause(clause, map(clause.types, t => factory.updateExpressionWithTypeArguments(t, extendsExpression, visitNodes(t.typeArguments, visitDeclarationSubtree, isTypeNode))));
16761675
getSymbolAccessibilityDiagnostic = oldDiag;
16771676
return newClause;
16781677
}
16791678
return factory.updateHeritageClause(clause, visitNodes(factory.createNodeArray(filter(clause.types, t => isEntityNameExpression(t.expression) || t.expression.kind === SyntaxKind.NullKeyword)), visitDeclarationSubtree, isExpressionWithTypeArguments));
16801679
}));
1681-
return [
1682-
statement,
1683-
cleanup(factory.updateClassDeclaration(
1680+
return cleanup(factory.updateClassDeclaration(
16841681
input,
16851682
modifiers,
16861683
input.name,
16871684
typeParameters,
16881685
heritageClauses,
16891686
members,
1690-
))!,
1691-
]; // TODO: GH#18217
1687+
));
16921688
}
16931689
else {
16941690
const heritageClauses = transformHeritageClauses(input.heritageClauses);

tests/baselines/reference/amdDeclarationEmitNoExtraDeclare.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ declare module "Configurable" {
8686
declare module "Class" {
8787
export class HiddenClass {
8888
}
89-
const ActualClass_base: typeof HiddenClass;
90-
export class ActualClass extends ActualClass_base {
89+
export class ActualClass extends ({} as typeof HiddenClass) {
9190
}
9291
}

tests/baselines/reference/anonClassDeclarationEmitIsAnon.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,10 @@ export default _default;
137137
export declare class User {
138138
name: string;
139139
}
140-
declare const TimestampedUser_base: {
140+
export declare class TimestampedUser extends ({} as {
141141
new (...args: any[]): {
142142
timestamp: number;
143143
};
144-
} & typeof User;
145-
export declare class TimestampedUser extends TimestampedUser_base {
144+
} & typeof User) {
146145
constructor();
147146
}

tests/baselines/reference/classReferencedInContextualParameterWithinItsOwnBaseExpression.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,8 @@ type OutputFrom<TFields> = {
6060
[K in keyof TFields]: "_TOutput" extends keyof TFields[K] ? TFields[K]["_TOutput"] : never;
6161
};
6262
declare function string(): Type<string>;
63-
declare const A_base: Class<OutputFrom<{
63+
export declare class A extends ({} as Class<OutputFrom<{
6464
a: typeof string;
65-
}>>;
66-
export declare class A extends A_base {
65+
}>>) {
6766
}
6867
export {};

tests/baselines/reference/declarationEmitClassMixinLocalClassDeclaration.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,10 @@ type MixinHelperFunc = <A extends AnyConstructor, T>(required: [A], arg: T) => T
8080
export declare const Mixin: MixinHelperFunc;
8181
export declare class Base {
8282
}
83-
declare const XmlElement2_base: {
83+
export declare class XmlElement2 extends ({} as {
8484
new (): {
8585
num: number;
8686
};
87-
};
88-
export declare class XmlElement2 extends XmlElement2_base {
87+
}) {
8988
}
9089
export {};

tests/baselines/reference/declarationEmitExpressionInExtends2.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,5 @@ declare class C<T, U> {
5252
y: U;
5353
}
5454
declare function getClass<T>(c: T): typeof C;
55-
declare const MyClass_base: typeof C;
56-
declare class MyClass extends MyClass_base<string, number> {
55+
declare class MyClass extends ({} as typeof C)<string, number> {
5756
}

tests/baselines/reference/declarationEmitExpressionInExtends3.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,12 @@ export interface ExportedInterface {
128128
interface LocalInterface {
129129
x: number;
130130
}
131-
declare const MyClass_base: typeof LocalClass;
132-
export declare class MyClass extends MyClass_base<string, number> {
131+
export declare class MyClass extends ({} as typeof LocalClass)<string, number> {
133132
}
134-
declare const MyClass2_base: typeof ExportedClass;
135-
export declare class MyClass2 extends MyClass2_base<string> {
133+
export declare class MyClass2 extends ({} as typeof ExportedClass)<string> {
136134
}
137-
declare const MyClass3_base: typeof ExportedClass;
138-
export declare class MyClass3 extends MyClass3_base<LocalInterface> {
135+
export declare class MyClass3 extends ({} as typeof ExportedClass)<LocalInterface> {
139136
}
140-
declare const MyClass4_base: typeof ExportedClass;
141-
export declare class MyClass4 extends MyClass4_base<ExportedInterface> {
137+
export declare class MyClass4 extends ({} as typeof ExportedClass)<ExportedInterface> {
142138
}
143139
export {};

tests/baselines/reference/declarationEmitExpressionInExtends4.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,11 @@ var C3 = /** @class */ (function (_super) {
6868
declare function getSomething(): {
6969
new (): {};
7070
};
71-
declare const C_base: {
71+
declare class C extends ({} as {
7272
new (): {};
73-
};
74-
declare class C extends C_base<number, string> {
73+
})<number, string> {
7574
}
76-
declare const C2_base: any;
77-
declare class C2 extends C2_base<number, string> {
75+
declare class C2 extends ({} as any)<number, string> {
7876
}
7977
declare class C3 extends SomeUndefinedFunction {
8078
}

tests/baselines/reference/declarationEmitExpressionInExtends5.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,11 @@ var Test;
6363

6464
//// [declarationEmitExpressionInExtends5.d.ts]
6565
declare namespace Test {
66-
export interface IFace {
66+
interface IFace {
6767
}
68-
export class SomeClass implements IFace {
68+
class SomeClass implements IFace {
6969
}
70-
const Derived_base: new () => IFace;
71-
export class Derived extends Derived_base {
70+
class Derived extends ({} as new () => IFace) {
7271
}
73-
export function getClass<T>(): new () => T;
74-
export {};
72+
function getClass<T>(): new () => T;
7573
}

tests/baselines/reference/declarationEmitForDefaultExportClassExtendingExpression01.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ interface Greeter {
6666
interface GreeterConstructor {
6767
new (): Greeter;
6868
}
69-
declare const default_base: GreeterConstructor;
70-
export default class extends default_base {
69+
export default class extends ({} as GreeterConstructor) {
7170
}
7271
export {};

0 commit comments

Comments
 (0)