From b33a35b1224a8a377007f4081d0408771d2081f7 Mon Sep 17 00:00:00 2001 From: Dick van den Brink Date: Mon, 13 Jul 2015 23:38:10 +0200 Subject: [PATCH 1/4] Highlight abstract keywords on classes and members --- src/services/services.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index 10e38f98613..64f9a6bc14d 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -4694,6 +4694,10 @@ namespace ts { if (!(container.kind === SyntaxKind.ModuleBlock || container.kind === SyntaxKind.SourceFile)) { return undefined; } + } else if (modifier === SyntaxKind.AbstractKeyword) { + if (!(container.kind === SyntaxKind.ClassDeclaration || declaration.kind === SyntaxKind.ClassDeclaration)) { + return undefined; + } } else { // unsupported modifier @@ -4707,7 +4711,13 @@ namespace ts { switch (container.kind) { case SyntaxKind.ModuleBlock: case SyntaxKind.SourceFile: - nodes = (container).statements; + // Container is either a class declaration or the declaration is a classDeclaration + if (modifierFlag & NodeFlags.Abstract) { + nodes = ((declaration).members).concat(declaration); + } + else { + nodes = (container).statements; + } break; case SyntaxKind.Constructor: nodes = ((container).parameters).concat( @@ -4727,6 +4737,9 @@ namespace ts { nodes = nodes.concat(constructor.parameters); } } + else if (modifierFlag & NodeFlags.Abstract) { + nodes = nodes.concat(container); + } break; default: Debug.fail("Invalid container kind.") @@ -4754,6 +4767,8 @@ namespace ts { return NodeFlags.Export; case SyntaxKind.DeclareKeyword: return NodeFlags.Ambient; + case SyntaxKind.AbstractKeyword: + return NodeFlags.Abstract; default: Debug.fail(); } From 758abffd19c67d6f47e1b652415d9ed15403e556 Mon Sep 17 00:00:00 2001 From: Dick van den Brink Date: Tue, 14 Jul 2015 00:02:20 +0200 Subject: [PATCH 2/4] Added test for occurrences on abstract keyword --- .../cases/fourslash/getOccurrencesAbstract.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/cases/fourslash/getOccurrencesAbstract.ts diff --git a/tests/cases/fourslash/getOccurrencesAbstract.ts b/tests/cases/fourslash/getOccurrencesAbstract.ts new file mode 100644 index 00000000000..47252dd6f3b --- /dev/null +++ b/tests/cases/fourslash/getOccurrencesAbstract.ts @@ -0,0 +1,20 @@ +/// + +////[|abstract|] class Animal { +//// [|abstract|] walk(): void; +//// [|abstract|] makeSound(): void; +////} +////// Abstract class below should not get highlighted +////abstract class Foo { +//// abstract foo(): void; +//// abstract bar(): void; +////} + +test.ranges().forEach(r => { + goTo.position(r.start); + verify.occurrencesAtPositionCount(test.ranges().length); + + test.ranges().forEach(range => { + verify.occurrencesAtPositionContains(range, false); + }); +}); From fc47329ed2f12c55ee62345639fc1985d420697b Mon Sep 17 00:00:00 2001 From: Dick van den Brink Date: Tue, 14 Jul 2015 00:43:16 +0200 Subject: [PATCH 3/4] PR feedback for abstract keyword occurrences --- src/services/services.ts | 3 ++- tests/cases/fourslash/getOccurrencesAbstract.ts | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 64f9a6bc14d..0d4099b9b47 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -4694,7 +4694,8 @@ namespace ts { if (!(container.kind === SyntaxKind.ModuleBlock || container.kind === SyntaxKind.SourceFile)) { return undefined; } - } else if (modifier === SyntaxKind.AbstractKeyword) { + } + else if (modifier === SyntaxKind.AbstractKeyword) { if (!(container.kind === SyntaxKind.ClassDeclaration || declaration.kind === SyntaxKind.ClassDeclaration)) { return undefined; } diff --git a/tests/cases/fourslash/getOccurrencesAbstract.ts b/tests/cases/fourslash/getOccurrencesAbstract.ts index 47252dd6f3b..8746cf1b489 100644 --- a/tests/cases/fourslash/getOccurrencesAbstract.ts +++ b/tests/cases/fourslash/getOccurrencesAbstract.ts @@ -10,11 +10,13 @@ //// abstract bar(): void; ////} -test.ranges().forEach(r => { - goTo.position(r.start); - verify.occurrencesAtPositionCount(test.ranges().length); +const ranges = test.ranges(); - test.ranges().forEach(range => { +for(let r of ranges) { + goTo.position(r.start); + verify.occurrencesAtPositionCount(ranges.length); + + for(let range of ranges) { verify.occurrencesAtPositionContains(range, false); - }); -}); + } +} From 2718539588b425fe743bd40adaa7c22527c2eda2 Mon Sep 17 00:00:00 2001 From: Dick van den Brink Date: Tue, 14 Jul 2015 01:39:39 +0200 Subject: [PATCH 4/4] Added more test cases for highlighting abstract keyword --- ...bstract.ts => getOccurrencesAbstract01.ts} | 6 ++-- .../fourslash/getOccurrencesAbstract02.ts | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) rename tests/cases/fourslash/{getOccurrencesAbstract.ts => getOccurrencesAbstract01.ts} (74%) create mode 100644 tests/cases/fourslash/getOccurrencesAbstract02.ts diff --git a/tests/cases/fourslash/getOccurrencesAbstract.ts b/tests/cases/fourslash/getOccurrencesAbstract01.ts similarity index 74% rename from tests/cases/fourslash/getOccurrencesAbstract.ts rename to tests/cases/fourslash/getOccurrencesAbstract01.ts index 8746cf1b489..3e48ba4841a 100644 --- a/tests/cases/fourslash/getOccurrencesAbstract.ts +++ b/tests/cases/fourslash/getOccurrencesAbstract01.ts @@ -1,6 +1,8 @@ /// ////[|abstract|] class Animal { +//// [|abstract|] prop1; // Does not compile +//// [|abstract|] abstract(); //// [|abstract|] walk(): void; //// [|abstract|] makeSound(): void; ////} @@ -12,11 +14,11 @@ const ranges = test.ranges(); -for(let r of ranges) { +for (let r of ranges) { goTo.position(r.start); verify.occurrencesAtPositionCount(ranges.length); - for(let range of ranges) { + for (let range of ranges) { verify.occurrencesAtPositionContains(range, false); } } diff --git a/tests/cases/fourslash/getOccurrencesAbstract02.ts b/tests/cases/fourslash/getOccurrencesAbstract02.ts new file mode 100644 index 00000000000..8daafdbdc8e --- /dev/null +++ b/tests/cases/fourslash/getOccurrencesAbstract02.ts @@ -0,0 +1,29 @@ +/// + +////// Not valid TS (abstract methods can only appear in abstract classes) +////class Animal { +//// [|abstract|] walk(): void; +//// [|abstract|] makeSound(): void; +////} +////// abstract cannot appear here, won't get highlighted +////let c = /*1*/abstract class Foo { +//// /*2*/abstract foo(): void; +//// abstract bar(): void; +////} + +const ranges = test.ranges(); + +for (let r of ranges) { + goTo.position(r.start); + verify.occurrencesAtPositionCount(ranges.length); + + for (let range of ranges) { + verify.occurrencesAtPositionContains(range, false); + } +} + +goTo.marker("1"); +verify.occurrencesAtPositionCount(0); + +goTo.marker("2"); +verify.occurrencesAtPositionCount(2);