Skip to content

Commit

Permalink
feat: support class implements and extends
Browse files Browse the repository at this point in the history
  • Loading branch information
bradzacher committed May 6, 2020
1 parent 1a733ce commit 1a345e8
Show file tree
Hide file tree
Showing 9 changed files with 451 additions and 0 deletions.
2 changes: 2 additions & 0 deletions packages/scope-manager/src/referencer/Referencer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ class Referencer extends Visitor {
}

this.visit(node.superClass);
this.visitType(node.superTypeParameters);
node.implements?.forEach(imp => this.visitType(imp));
node.decorators?.forEach(d => this.visit(d));

this.scopeManager.nestClassScope(node);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class A<U> {}
type T = string;
class B extends A<T> {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`class declaration extends-generic 1`] = `
ScopeManager {
variables: Array [
Variable$1 {
defs: Array [
ClassNameDefinition$1 {
name: Identifier<"A">,
node: ClassDeclaration$1,
},
],
name: "A",
references: Array [
Reference$1 {
identifier: Identifier<"A">,
isTypeReference: false,
resolved: Variable$1,
},
],
isValueVariable: true,
isTypeVariable: true,
},
Variable$2 {
defs: Array [
ClassNameDefinition$2 {
name: Identifier<"A">,
node: ClassDeclaration$1,
},
],
name: "A",
references: Array [],
isValueVariable: true,
isTypeVariable: true,
},
Variable$3 {
defs: Array [
TypeDefinition$3 {
name: Identifier<"T">,
node: TSTypeAliasDeclaration$2,
},
],
name: "T",
references: Array [
Reference$2 {
identifier: Identifier<"T">,
isTypeReference: true,
resolved: Variable$3,
},
],
isValueVariable: false,
isTypeVariable: true,
},
Variable$4 {
defs: Array [
ClassNameDefinition$4 {
name: Identifier<"B">,
node: ClassDeclaration$3,
},
],
name: "B",
references: Array [],
isValueVariable: true,
isTypeVariable: true,
},
Variable$5 {
defs: Array [
ClassNameDefinition$5 {
name: Identifier<"B">,
node: ClassDeclaration$3,
},
],
name: "B",
references: Array [],
isValueVariable: true,
isTypeVariable: true,
},
],
scopes: Array [
GlobalScope$1 {
block: Program$4,
isStrict: false,
references: Array [
Reference$1,
Reference$2,
],
set: Map {
"A" => Variable$1,
"T" => Variable$3,
"B" => Variable$4,
},
type: "global",
upper: null,
variables: Array [
Variable$1,
Variable$3,
Variable$4,
],
},
ClassScope$2 {
block: ClassDeclaration$1,
isStrict: true,
references: Array [],
set: Map {
"A" => Variable$2,
},
type: "class",
upper: GlobalScope$1,
variables: Array [
Variable$2,
],
},
ClassScope$3 {
block: ClassDeclaration$3,
isStrict: true,
references: Array [],
set: Map {
"B" => Variable$5,
},
type: "class",
upper: GlobalScope$1,
variables: Array [
Variable$5,
],
},
],
}
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
interface A<U> {}
type T = string;
class B implements A<T> {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`class declaration implements-generic 1`] = `
ScopeManager {
variables: Array [
Variable$1 {
defs: Array [
TypeDefinition$1 {
name: Identifier<"A">,
node: TSInterfaceDeclaration$1,
},
],
name: "A",
references: Array [
Reference$1 {
identifier: Identifier<"A">,
isTypeReference: true,
resolved: Variable$1,
},
],
isValueVariable: false,
isTypeVariable: true,
},
Variable$2 {
defs: Array [
TypeDefinition$2 {
name: Identifier<"U">,
node: TSTypeParameter$2,
},
],
name: "U",
references: Array [],
isValueVariable: false,
isTypeVariable: true,
},
Variable$3 {
defs: Array [
TypeDefinition$3 {
name: Identifier<"T">,
node: TSTypeAliasDeclaration$3,
},
],
name: "T",
references: Array [
Reference$2 {
identifier: Identifier<"T">,
isTypeReference: true,
resolved: Variable$3,
},
],
isValueVariable: false,
isTypeVariable: true,
},
Variable$4 {
defs: Array [
ClassNameDefinition$4 {
name: Identifier<"B">,
node: ClassDeclaration$4,
},
],
name: "B",
references: Array [],
isValueVariable: true,
isTypeVariable: true,
},
Variable$5 {
defs: Array [
ClassNameDefinition$5 {
name: Identifier<"B">,
node: ClassDeclaration$4,
},
],
name: "B",
references: Array [],
isValueVariable: true,
isTypeVariable: true,
},
],
scopes: Array [
GlobalScope$1 {
block: Program$5,
isStrict: false,
references: Array [
Reference$1,
Reference$2,
],
set: Map {
"A" => Variable$1,
"T" => Variable$3,
"B" => Variable$4,
},
type: "global",
upper: null,
variables: Array [
Variable$1,
Variable$3,
Variable$4,
],
},
TypeScope$2 {
block: TSInterfaceDeclaration$1,
isStrict: true,
references: Array [],
set: Map {
"U" => Variable$2,
},
type: "type",
upper: GlobalScope$1,
variables: Array [
Variable$2,
],
},
ClassScope$3 {
block: ClassDeclaration$4,
isStrict: true,
references: Array [],
set: Map {
"B" => Variable$5,
},
type: "class",
upper: GlobalScope$1,
variables: Array [
Variable$5,
],
},
],
}
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
interface A {}
class B implements A {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`class declaration implements 1`] = `
ScopeManager {
variables: Array [
Variable$1 {
defs: Array [
TypeDefinition$1 {
name: Identifier<"A">,
node: TSInterfaceDeclaration$1,
},
],
name: "A",
references: Array [
Reference$1 {
identifier: Identifier<"A">,
isTypeReference: true,
resolved: Variable$1,
},
],
isValueVariable: false,
isTypeVariable: true,
},
Variable$2 {
defs: Array [
ClassNameDefinition$2 {
name: Identifier<"B">,
node: ClassDeclaration$2,
},
],
name: "B",
references: Array [],
isValueVariable: true,
isTypeVariable: true,
},
Variable$3 {
defs: Array [
ClassNameDefinition$3 {
name: Identifier<"B">,
node: ClassDeclaration$2,
},
],
name: "B",
references: Array [],
isValueVariable: true,
isTypeVariable: true,
},
],
scopes: Array [
GlobalScope$1 {
block: Program$3,
isStrict: false,
references: Array [
Reference$1,
],
set: Map {
"A" => Variable$1,
"B" => Variable$2,
},
type: "global",
upper: null,
variables: Array [
Variable$1,
Variable$2,
],
},
ClassScope$2 {
block: ClassDeclaration$2,
isStrict: true,
references: Array [],
set: Map {
"B" => Variable$3,
},
type: "class",
upper: GlobalScope$1,
variables: Array [
Variable$3,
],
},
],
}
`;
3 changes: 3 additions & 0 deletions packages/scope-manager/tests/fixtures/decorators/class.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function decorator() {}
@decorator
class Foo {}

0 comments on commit 1a345e8

Please sign in to comment.