Skip to content

Commit b4782ea

Browse files
committed
Fixed handling of heritage clauses in extension names
1 parent 769e483 commit b4782ea

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

lib/declaration.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -842,14 +842,8 @@ export default class DeclarationTranspiler extends base.TranspilerBase {
842842
keyword: string, decl: base.ClassLike|ts.TypeLiteralNode, name: ts.Identifier,
843843
typeParameters: ts.NodeArray<ts.TypeParameterDeclaration>,
844844
heritageClauses: ts.NodeArray<ts.HeritageClause>) {
845-
const visitName = () => {
846-
this.visitClassLikeName(name, typeParameters, heritageClauses, false);
847-
};
848-
const visitNameOfExtensions = () => {
849-
this.visitClassLikeName(name, typeParameters, heritageClauses, true);
850-
};
851845
this.emit(keyword);
852-
visitName();
846+
this.visitClassLikeName(name, typeParameters, heritageClauses, false);
853847
this.emit('{');
854848

855849
this.maybeEmitFakeConstructors(decl);
@@ -872,6 +866,12 @@ export default class DeclarationTranspiler extends base.TranspilerBase {
872866
this.visitClassBody(decl, name);
873867
this.emit('}\n');
874868
if (this.promiseMethods.size) {
869+
const visitName = () => {
870+
this.visitClassLikeName(name, typeParameters, ts.createNodeArray(), false);
871+
};
872+
const visitNameOfExtensions = () => {
873+
this.visitClassLikeName(name, typeParameters, ts.createNodeArray(), true);
874+
};
875875
this.emitMethodsAsExtensions(name, visitName, visitNameOfExtensions, this.promiseMethods);
876876
this.promiseMethods.clear();
877877
}

test/declaration_test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,41 @@ extension XExtensions<T> on X<T> {
302302
}
303303
}
304304
305+
@JS()
306+
abstract class Promise<T> {}`);
307+
expectTranslate(`declare interface Y {
308+
a: number;
309+
}
310+
311+
declare interface Z extends Y {
312+
f(): Promise<string>;
313+
}`).to.equal(`import "package:js/js_util.dart" show promiseToFuture;
314+
315+
@anonymous
316+
@JS()
317+
abstract class Y {
318+
external num get a;
319+
external set a(num v);
320+
external factory Y({num a});
321+
}
322+
323+
@anonymous
324+
@JS()
325+
abstract class Z implements Y {}
326+
327+
@JS('Z')
328+
abstract class _Z {
329+
Promise<String> f();
330+
}
331+
332+
extension ZExtensions on Z {
333+
Future<String> f() {
334+
final Object t = this;
335+
final _Z tt = t;
336+
return promiseToFuture(tt.f());
337+
}
338+
}
339+
305340
@JS()
306341
abstract class Promise<T> {}`);
307342
});

0 commit comments

Comments
 (0)