Skip to content

Commit

Permalink
fix(es/resolver): Resolve interfaces correctly (#6387)
Browse files Browse the repository at this point in the history
**Related issue:**

 - dudykr/stc#245.
  • Loading branch information
kdy1 committed Nov 9, 2022
1 parent 0e03e4e commit 6b876c4
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 4 deletions.
13 changes: 13 additions & 0 deletions crates/swc_ecma_codegen/src/lib.rs
Expand Up @@ -1231,6 +1231,19 @@ where
emit!(node.super_type_params);
}

if !node.implements.is_empty() {
space!();
keyword!("implements");

space!();

self.emit_list(
node.span,
Some(&node.implements),
ListFormat::ClassHeritageClauses,
)?;
}

formatting_space!();

punct!("{");
Expand Down
11 changes: 9 additions & 2 deletions crates/swc_ecma_transforms_base/src/resolver/mod.rs
Expand Up @@ -519,13 +519,20 @@ impl<'a> VisitMut for Resolver<'a> {

typed_ref!(visit_mut_ts_this_type_or_ident, TsThisTypeOrIdent);

typed_ref!(visit_mut_ts_expr_with_type_args, TsExprWithTypeArgs);

visit_mut_obj_and_computed!();

// TODO: How should I handle this?
typed!(visit_mut_ts_namespace_export_decl, TsNamespaceExportDecl);

fn visit_mut_ts_expr_with_type_args(&mut self, n: &mut TsExprWithTypeArgs) {
if self.config.handle_types {
let old = self.in_type;
self.in_type = true;
n.visit_mut_children_with(self);
self.in_type = old;
}
}

fn visit_mut_export_specifier(&mut self, s: &mut ExportSpecifier) {
let old = self.ident_type;
self.ident_type = IdentType::Ref;
Expand Down
24 changes: 24 additions & 0 deletions crates/swc_ecma_transforms_base/tests/ts-resolver/stc/1/input.ts
@@ -0,0 +1,24 @@
// @target: esnext
// @declaration: true

interface Mixin1 {
mixinMethod(): void;
}

abstract class AbstractBase {
abstract abstractBaseMethod(): void;
}

function Mixin2<TBase extends abstract new (...args: any[]) => any>(baseClass: TBase) {
// must be `abstract` because we cannot know *all* of the possible abstract members that need to be
// implemented for this to be concrete.
abstract class MixinClass extends baseClass implements Mixin1 {
mixinMethod(): void {}
static staticMixinMethod(): void {}
}
return MixinClass;
}

class DerivedFromAbstract2 extends Mixin2(AbstractBase) {
abstractBaseMethod() {}
}
16 changes: 16 additions & 0 deletions crates/swc_ecma_transforms_base/tests/ts-resolver/stc/1/output.ts
@@ -0,0 +1,16 @@
interface Mixin1__1 {
mixinMethod__0(): void;
}
class AbstractBase__1 {
abstractBaseMethod(): void;
}
function Mixin2__1<TBase__2 extends abstract new (...args: any[]) => any>(baseClass__2: TBase__2) {
class MixinClass__2 extends baseClass__2 implements Mixin1__1 {
mixinMethod(): void {}
static staticMixinMethod(): void {}
}
return MixinClass__2;
}
class DerivedFromAbstract2__1 extends Mixin2__1(AbstractBase__1) {
abstractBaseMethod() {}
}
@@ -1,5 +1,5 @@
import { Nullable__1 } from "nullable";
import { Component__1 } from "react";
class Foo__1 {
class Foo__1 implements Component__1<Nullable__1> {
}
new Foo__1();
@@ -1,4 +1,4 @@
class PartWriter__1 {
class PartWriter__1 implements Deno.Writer {
constructor(private writer__3: Deno.Writer, readonly boundary__3: string, public headers__3: Headers, isFirstBoundary__3: boolean){
let buf__3 = "";
if (isFirstBoundary__3) {
Expand Down

1 comment on commit 6b876c4

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 6b876c4 Previous: 156f370 Ratio
es/full/bugs-1 411671 ns/iter (± 31736) 349665 ns/iter (± 19952) 1.18
es/full/minify/libraries/antd 1988966189 ns/iter (± 60874290) 1913935347 ns/iter (± 717884934) 1.04
es/full/minify/libraries/d3 416682177 ns/iter (± 8596625) 431164593 ns/iter (± 10389337) 0.97
es/full/minify/libraries/echarts 1604898915 ns/iter (± 29701208) 1609843463 ns/iter (± 62060950) 1.00
es/full/minify/libraries/jquery 103165109 ns/iter (± 2771043) 102964506 ns/iter (± 4605892) 1.00
es/full/minify/libraries/lodash 121539529 ns/iter (± 5330926) 133234758 ns/iter (± 4146128) 0.91
es/full/minify/libraries/moment 60732244 ns/iter (± 631535) 68781109 ns/iter (± 2592595) 0.88
es/full/minify/libraries/react 20573003 ns/iter (± 278138) 22912492 ns/iter (± 1831906) 0.90
es/full/minify/libraries/terser 316443892 ns/iter (± 8229576) 325763725 ns/iter (± 27244793) 0.97
es/full/minify/libraries/three 570641046 ns/iter (± 17719278) 572042920 ns/iter (± 39100126) 1.00
es/full/minify/libraries/typescript 3404777680 ns/iter (± 51876224) 3487447997 ns/iter (± 182143318) 0.98
es/full/minify/libraries/victory 842431484 ns/iter (± 13971965) 872739815 ns/iter (± 27250947) 0.97
es/full/minify/libraries/vue 157026033 ns/iter (± 2277267) 180261896 ns/iter (± 16971402) 0.87
es/full/codegen/es3 33669 ns/iter (± 925) 35123 ns/iter (± 2202) 0.96
es/full/codegen/es5 33453 ns/iter (± 844) 33876 ns/iter (± 3808) 0.99
es/full/codegen/es2015 33143 ns/iter (± 944) 33522 ns/iter (± 1000) 0.99
es/full/codegen/es2016 33397 ns/iter (± 1814) 33607 ns/iter (± 887) 0.99
es/full/codegen/es2017 33387 ns/iter (± 1293) 33478 ns/iter (± 798) 1.00
es/full/codegen/es2018 33354 ns/iter (± 1851) 33381 ns/iter (± 2341) 1.00
es/full/codegen/es2019 33533 ns/iter (± 1102) 33585 ns/iter (± 919) 1.00
es/full/codegen/es2020 33275 ns/iter (± 1182) 33808 ns/iter (± 1233) 0.98
es/full/all/es3 190597174 ns/iter (± 4935335) 195598291 ns/iter (± 13921585) 0.97
es/full/all/es5 180455865 ns/iter (± 5251140) 187611336 ns/iter (± 11870303) 0.96
es/full/all/es2015 145241348 ns/iter (± 5794260) 148426616 ns/iter (± 8298313) 0.98
es/full/all/es2016 143889090 ns/iter (± 5014777) 147943092 ns/iter (± 9117504) 0.97
es/full/all/es2017 143390877 ns/iter (± 3555416) 147361104 ns/iter (± 9845160) 0.97
es/full/all/es2018 141034296 ns/iter (± 4647559) 144116961 ns/iter (± 9062409) 0.98
es/full/all/es2019 140720493 ns/iter (± 4116233) 145513182 ns/iter (± 6655203) 0.97
es/full/all/es2020 135365053 ns/iter (± 6352553) 139098700 ns/iter (± 13686634) 0.97
es/full/parser 720963 ns/iter (± 28027) 731982 ns/iter (± 95556) 0.98
es/full/base/fixer 26116 ns/iter (± 558) 26807 ns/iter (± 2036) 0.97
es/full/base/resolver_and_hygiene 90690 ns/iter (± 3944) 94041 ns/iter (± 7649) 0.96
serialization of ast node 216 ns/iter (± 6) 216 ns/iter (± 8) 1
serialization of serde 233 ns/iter (± 12) 215 ns/iter (± 16) 1.08

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.