diff --git a/src/services/formatting.ts b/src/services/formatting.ts
index c8d3d1bb52f..9ff26129f8b 100644
--- a/src/services/formatting.ts
+++ b/src/services/formatting.ts
@@ -620,14 +620,21 @@ module ts.formatting {
var tokenStart = sourceFile.getLineAndCharacterFromPosition(currentTokenInfo.token.pos);
if (isTokenInRange) {
+ var rangeHasError = rangeContainsError(currentTokenInfo.token);
// save prevStartLine since processRange will overwrite this value with current ones
var prevStartLine = previousRangeStartLine;
lineAdded = processRange(currentTokenInfo.token, tokenStart, parent, childContextNode, dynamicIndentation);
- if (lineAdded !== undefined) {
- indentToken = lineAdded;
+ if (rangeHasError) {
+ // do not indent comments\token if token range overlaps with some error
+ indentToken = false;
}
else {
- indentToken = lastTriviaWasNewLine && tokenStart.line !== prevStartLine;
+ if (lineAdded !== undefined) {
+ indentToken = lineAdded;
+ }
+ else {
+ indentToken = lastTriviaWasNewLine && tokenStart.line !== prevStartLine;
+ }
}
}
diff --git a/src/services/smartIndenter.ts b/src/services/smartIndenter.ts
index c6b92310c2e..d7f40d8bba7 100644
--- a/src/services/smartIndenter.ts
+++ b/src/services/smartIndenter.ts
@@ -340,6 +340,7 @@ module ts.formatting {
case SyntaxKind.VariableDeclaration:
case SyntaxKind.ExportAssignment:
case SyntaxKind.ReturnStatement:
+ case SyntaxKind.ConditionalExpression:
return true;
}
return false;
diff --git a/tests/cases/fourslash/formattingCommentsBeforeErrors.ts b/tests/cases/fourslash/formattingCommentsBeforeErrors.ts
new file mode 100644
index 00000000000..bb7e616b267
--- /dev/null
+++ b/tests/cases/fourslash/formattingCommentsBeforeErrors.ts
@@ -0,0 +1,20 @@
+///
+
+////module A {
+//// interface B {
+//// // a
+//// // b
+//// baz();
+/////*0*/ // d /*1*/asd a
+//// // e
+//// foo();
+//// // f asd
+//// // g as
+//// bar();
+//// }
+////}
+
+goTo.marker("1");
+edit.insert("\n");
+goTo.marker("0");
+verify.currentLineContentIs(" // d ");
\ No newline at end of file
diff --git a/tests/cases/fourslash/formattingConditionals.ts b/tests/cases/fourslash/formattingConditionals.ts
new file mode 100644
index 00000000000..cb6edfcd56b
--- /dev/null
+++ b/tests/cases/fourslash/formattingConditionals.ts
@@ -0,0 +1,44 @@
+///
+
+
+////var v =
+/////*0*/a === b
+/////*1*/? c
+/////*2*/: d;
+
+////var v = a === b
+/////*3*/? c
+/////*4*/: d;
+
+////var x =
+/////*5*/a
+/////*6*/? function(){
+/////*7*/var z = 1
+/////*8*/}
+/////*9*/: function(){
+/////*10*/var z = 2
+/////*11*/}
+
+
+
+
+function verifyLine(marker: string, content: string) {
+ goTo.marker(marker);
+ verify.currentLineContentIs(content);
+}
+
+format.document();
+verifyLine("0", " a === b");
+verifyLine("1", " ? c");
+verifyLine("2", " : d;");
+
+verifyLine("3", " ? c");
+verifyLine("4", " : d;");
+
+verifyLine("5", " a");
+verifyLine("6", " ? function() {");
+verifyLine("7", " var z = 1");
+verifyLine("8", " }");
+verifyLine("9", " : function() {");
+verifyLine("10", " var z = 2");
+verifyLine("11", " }");