mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Fourslash support and test cases
This commit is contained in:
@@ -99,6 +99,8 @@ module FourSlash {
|
||||
end: number;
|
||||
}
|
||||
|
||||
export import IndentStyle = ts.IndentStyle;
|
||||
|
||||
let entityMap: ts.Map<string> = {
|
||||
"&": "&",
|
||||
"\"": """,
|
||||
@@ -307,6 +309,7 @@ module FourSlash {
|
||||
TabSize: 4,
|
||||
NewLineCharacter: Harness.IO.newLine(),
|
||||
ConvertTabsToSpaces: true,
|
||||
IndentStyle: ts.IndentStyle.Smart,
|
||||
InsertSpaceAfterCommaDelimiter: true,
|
||||
InsertSpaceAfterSemicolonInForStatements: true,
|
||||
InsertSpaceBeforeAndAfterBinaryOperators: true,
|
||||
@@ -1678,24 +1681,28 @@ module FourSlash {
|
||||
}
|
||||
}
|
||||
|
||||
private getIndentation(fileName: string, position: number): number {
|
||||
return this.languageService.getIndentationAtPosition(fileName, position, this.formatCodeOptions);
|
||||
private getIndentation(fileName: string, position: number, indentStyle: ts.IndentStyle): number {
|
||||
|
||||
let formatOptions = ts.clone(this.formatCodeOptions);
|
||||
formatOptions.IndentStyle = indentStyle;
|
||||
|
||||
return this.languageService.getIndentationAtPosition(fileName, position, formatOptions);
|
||||
}
|
||||
|
||||
public verifyIndentationAtCurrentPosition(numberOfSpaces: number) {
|
||||
public verifyIndentationAtCurrentPosition(numberOfSpaces: number, indentStyle: ts.IndentStyle = ts.IndentStyle.Smart) {
|
||||
this.taoInvalidReason = "verifyIndentationAtCurrentPosition NYI";
|
||||
|
||||
let actual = this.getIndentation(this.activeFile.fileName, this.currentCaretPosition);
|
||||
let actual = this.getIndentation(this.activeFile.fileName, this.currentCaretPosition, indentStyle);
|
||||
let lineCol = this.getLineColStringAtPosition(this.currentCaretPosition);
|
||||
if (actual !== numberOfSpaces) {
|
||||
this.raiseError(`verifyIndentationAtCurrentPosition failed at ${lineCol} - expected: ${numberOfSpaces}, actual: ${actual}`);
|
||||
}
|
||||
}
|
||||
|
||||
public verifyIndentationAtPosition(fileName: string, position: number, numberOfSpaces: number) {
|
||||
public verifyIndentationAtPosition(fileName: string, position: number, numberOfSpaces: number, indentStyle: ts.IndentStyle = ts.IndentStyle.Smart) {
|
||||
this.taoInvalidReason = "verifyIndentationAtPosition NYI";
|
||||
|
||||
let actual = this.getIndentation(fileName, position);
|
||||
let actual = this.getIndentation(fileName, position, indentStyle);
|
||||
let lineCol = this.getLineColStringAtPosition(position);
|
||||
if (actual !== numberOfSpaces) {
|
||||
this.raiseError(`verifyIndentationAtPosition failed at ${lineCol} - expected: ${numberOfSpaces}, actual: ${actual}`);
|
||||
|
||||
@@ -68,6 +68,13 @@ enum EmitReturnStatus {
|
||||
EmitErrorsEncountered = 4 // Emitter errors occurred during emitting process
|
||||
}
|
||||
|
||||
// This is a duplicate of the indentstyle in services.ts to expose it to testcases in fourslash
|
||||
enum IndentStyle {
|
||||
None,
|
||||
Block,
|
||||
Smart,
|
||||
}
|
||||
|
||||
module FourSlashInterface {
|
||||
|
||||
export interface Marker {
|
||||
@@ -278,8 +285,8 @@ module FourSlashInterface {
|
||||
FourSlash.currentTestState.verifyIndentationAtCurrentPosition(numberOfSpaces);
|
||||
}
|
||||
|
||||
public indentationAtPositionIs(fileName: string, position: number, numberOfSpaces: number) {
|
||||
FourSlash.currentTestState.verifyIndentationAtPosition(fileName, position, numberOfSpaces);
|
||||
public indentationAtPositionIs(fileName: string, position: number, numberOfSpaces: number, indentStyle = IndentStyle.Smart) {
|
||||
FourSlash.currentTestState.verifyIndentationAtPosition(fileName, position, numberOfSpaces, indentStyle);
|
||||
}
|
||||
|
||||
public textAtCaretIs(text: string) {
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
/// <reference path="fourslash.ts"/>
|
||||
|
||||
////
|
||||
////module classes {
|
||||
////{| "indent": 0 |}
|
||||
//// class Bar {
|
||||
////{| "indent": 4 |}
|
||||
////
|
||||
//// constructor() {
|
||||
////{| "indent": 8 |}
|
||||
//// }
|
||||
////
|
||||
//// private foo: string = "";
|
||||
////{| "indent": 8 |}
|
||||
////
|
||||
//// private f() {
|
||||
//// var a: any[] = [[1, 2], [3, 4], 5];
|
||||
////{| "indent": 12 |}
|
||||
//// return ((1 + 1));
|
||||
//// }
|
||||
////
|
||||
////{| "indent": 8 |}
|
||||
//// private f2() {
|
||||
//// if (true) { } { };
|
||||
//// }
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////module interfaces {
|
||||
////{| "indent": 0 |}
|
||||
//// interface Foo {
|
||||
////{| "indent": 4 |}
|
||||
////
|
||||
//// x: number;
|
||||
////{| "indent": 8 |}
|
||||
////
|
||||
//// foo(): number;
|
||||
////{| "indent": 8 |}
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////module nestedModules {
|
||||
//// module Foo2 {
|
||||
////{| "indent": 4 |}
|
||||
//// function f() {
|
||||
//// }
|
||||
////{| "indent": 8 |}
|
||||
//// var x: number;
|
||||
////{| "indent": 8 |}
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////module Enums {
|
||||
//// enum Foo3 {
|
||||
////{| "indent": 4 |}
|
||||
//// val1,
|
||||
////{| "indent": 8 |}
|
||||
//// val2,
|
||||
////{| "indent": 8 |}
|
||||
//// }
|
||||
////{| "indent": 4 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function controlStatements() {
|
||||
//// for (var i = 0; i < 10; i++) {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////
|
||||
//// for (var e in foo.bar) {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////
|
||||
//// with (foo.bar) {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////
|
||||
//// while (false) {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////
|
||||
//// do {
|
||||
////{| "indent": 4 |}
|
||||
//// } while (false);
|
||||
////
|
||||
//// switch (foo.bar) {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////
|
||||
//// switch (foo.bar) {
|
||||
////{| "indent": 4 |}
|
||||
//// case 1:
|
||||
////{| "indent": 8 |}
|
||||
//// break;
|
||||
//// default:
|
||||
////{| "indent": 8 |}
|
||||
//// break;
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function tryCatch() {
|
||||
////{| "indent": 0 |}
|
||||
//// try {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////{| "indent": 4 |}
|
||||
//// catch (err) {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////{| "indent": 4 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function tryFinally() {
|
||||
////{| "indent": 0 |}
|
||||
//// try {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////{| "indent": 4 |}
|
||||
//// finally {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////{| "indent": 4 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function tryCatchFinally() {
|
||||
////{| "indent": 0 |}
|
||||
//// try {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////{| "indent": 4 |}
|
||||
//// catch (err) {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////{| "indent": 4 |}
|
||||
//// finally {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////{| "indent": 4 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////class indentBeforeCurly
|
||||
////{| "indent": 0 |}
|
||||
////{| "indent": 0 |}{
|
||||
////{| "indent": 0 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function argumentsListIndentation(bar,
|
||||
//// blah,
|
||||
//// {| "indent": 13 |}
|
||||
////);
|
||||
////
|
||||
////
|
||||
////function blockIndentAfterIndentedParameter1(bar,
|
||||
//// blah) {
|
||||
////{| "indent": 13 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function blockIndentAfterIndentedParameter2(bar,
|
||||
//// blah) {
|
||||
//// if (foo) {
|
||||
////{| "indent": 4 |}
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////// Note: Do not add more tests at the end of this file, as
|
||||
////// the purpose of this test is to verity smart indent
|
||||
////// works for unterminated function arguments at the end of a file.
|
||||
////function unterminatedListIndentation(a,
|
||||
////{| "indent": 0 |}
|
||||
|
||||
test.markers().forEach(marker => {
|
||||
verify.indentationAtPositionIs(marker.fileName, marker.position, marker.data.indent, IndentStyle.Block);
|
||||
});
|
||||
@@ -0,0 +1,183 @@
|
||||
/// <reference path="fourslash.ts"/>
|
||||
|
||||
////
|
||||
////module classes {
|
||||
////{| "indent": 0 |}
|
||||
//// class Bar {
|
||||
////{| "indent": 0 |}
|
||||
////
|
||||
//// constructor() {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////
|
||||
//// private foo: string = "";
|
||||
////{| "indent": 0 |}
|
||||
////
|
||||
//// private f() {
|
||||
//// var a: any[] = [[1, 2], [3, 4], 5];
|
||||
////{| "indent": 0 |}
|
||||
//// return ((1 + 1));
|
||||
//// }
|
||||
////
|
||||
////{| "indent": 0 |}
|
||||
//// private f2() {
|
||||
//// if (true) { } { };
|
||||
//// }
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////module interfaces {
|
||||
////{| "indent": 0 |}
|
||||
//// interface Foo {
|
||||
////{| "indent": 0 |}
|
||||
////
|
||||
//// x: number;
|
||||
////{| "indent": 0 |}
|
||||
////
|
||||
//// foo(): number;
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////module nestedModules {
|
||||
//// module Foo2 {
|
||||
////{| "indent": 0 |}
|
||||
//// function f() {
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
//// var x: number;
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////module Enums {
|
||||
//// enum Foo3 {
|
||||
////{| "indent": 0 |}
|
||||
//// val1,
|
||||
////{| "indent": 0 |}
|
||||
//// val2,
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function controlStatements() {
|
||||
//// for (var i = 0; i < 10; i++) {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////
|
||||
//// for (var e in foo.bar) {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////
|
||||
//// with (foo.bar) {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////
|
||||
//// while (false) {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////
|
||||
//// do {
|
||||
////{| "indent": 0 |}
|
||||
//// } while (false);
|
||||
////
|
||||
//// switch (foo.bar) {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////
|
||||
//// switch (foo.bar) {
|
||||
////{| "indent": 0 |}
|
||||
//// case 1:
|
||||
////{| "indent": 0 |}
|
||||
//// break;
|
||||
//// default:
|
||||
////{| "indent": 0 |}
|
||||
//// break;
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function tryCatch() {
|
||||
////{| "indent": 0 |}
|
||||
//// try {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
//// catch (err) {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function tryFinally() {
|
||||
////{| "indent": 0 |}
|
||||
//// try {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
//// finally {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function tryCatchFinally() {
|
||||
////{| "indent": 0 |}
|
||||
//// try {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
//// catch (err) {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
//// finally {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////{| "indent": 0 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////class indentBeforeCurly
|
||||
////{| "indent": 0 |}
|
||||
////{| "indent": 0 |}{
|
||||
////{| "indent": 0 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function argumentsListIndentation(bar,
|
||||
//// blah,
|
||||
//// {| "indent": 0 |}
|
||||
////);
|
||||
////
|
||||
////
|
||||
////function blockIndentAfterIndentedParameter1(bar,
|
||||
//// blah) {
|
||||
////{| "indent": 0 |}
|
||||
////}
|
||||
////
|
||||
////
|
||||
////function blockIndentAfterIndentedParameter2(bar,
|
||||
//// blah) {
|
||||
//// if (foo) {
|
||||
////{| "indent": 0 |}
|
||||
//// }
|
||||
////}
|
||||
////
|
||||
////
|
||||
////// Note: Do not add more tests at the end of this file, as
|
||||
////// the purpose of this test is to verity smart indent
|
||||
////// works for unterminated function arguments at the end of a file.
|
||||
////function unterminatedListIndentation(a,
|
||||
////{| "indent": 0 |}
|
||||
|
||||
test.markers().forEach(marker => {
|
||||
verify.indentationAtPositionIs(marker.fileName, marker.position, marker.data.indent, IndentStyle.None);
|
||||
});
|
||||
Reference in New Issue
Block a user