@@ -3033,8 +3033,10 @@ module ts {
3033
3033
return false ;
3034
3034
}
3035
3035
3036
- function indentIfOnDifferentLines ( parent : Node , node1 : Node , node2 : Node ) {
3037
- // Use a newline for existing code if the original had one, and we're preserving formatting.
3036
+ // Returns 'true' if the code was actually indented, false otherwise.
3037
+ // If the code is not indented, an optional valueToWriteWhenNotIndenting will be
3038
+ // emitted instead.
3039
+ function indentIfOnDifferentLines ( parent : Node , node1 : Node , node2 : Node , valueToWriteWhenNotIndenting ?: string ) {
3038
3040
var realNodesAreOnDifferentLines = preserveNewLines && ! nodeIsSynthesized ( parent ) && ! nodeEndIsOnSameLineAsNodeStart ( node1 , node2 ) ;
3039
3041
3040
3042
// Always use a newline for synthesized code if the synthesizer desires it.
@@ -3045,8 +3047,12 @@ module ts {
3045
3047
writeLine ( ) ;
3046
3048
return true ;
3047
3049
}
3048
-
3049
- return false ;
3050
+ else {
3051
+ if ( valueToWriteWhenNotIndenting ) {
3052
+ write ( valueToWriteWhenNotIndenting ) ;
3053
+ }
3054
+ return false ;
3055
+ }
3050
3056
}
3051
3057
3052
3058
function emitPropertyAccess ( node : PropertyAccessExpression ) {
@@ -3055,18 +3061,11 @@ module ts {
3055
3061
}
3056
3062
3057
3063
emit ( node . expression ) ;
3058
-
3059
- var indented = indentIfOnDifferentLines ( node , node . expression , node . dotToken ) ;
3060
-
3064
+ var indentedBeforeDot = indentIfOnDifferentLines ( node , node . expression , node . dotToken ) ;
3061
3065
write ( "." ) ;
3062
-
3063
- indented = indented || indentIfOnDifferentLines ( node , node . dotToken , node . name ) ;
3064
-
3066
+ var indentedAfterDot = indentIfOnDifferentLines ( node , node . dotToken , node . name ) ;
3065
3067
emit ( node . name ) ;
3066
-
3067
- if ( indented ) {
3068
- decreaseIndent ( ) ;
3069
- }
3068
+ decreaseIndentIf ( indentedBeforeDot , indentedAfterDot ) ;
3070
3069
}
3071
3070
3072
3071
function emitQualifiedName ( node : QualifiedName ) {
@@ -3299,33 +3298,11 @@ module ts {
3299
3298
}
3300
3299
else {
3301
3300
emit ( node . left ) ;
3302
-
3303
- // If there was a newline between the left side of the binary expression and the
3304
- // operator, then try to preserve that.
3305
- var indented1 = indentIfOnDifferentLines ( node , node . left , node . operatorToken ) ;
3306
-
3307
- // Otherwise just emit the operator right afterwards. For everything but
3308
- // comma, emit a space before the operator.
3309
- if ( ! indented1 && node . operatorToken . kind !== SyntaxKind . CommaToken ) {
3310
- write ( " " ) ;
3311
- }
3312
-
3301
+ var indentedBeforeOperator = indentIfOnDifferentLines ( node , node . left , node . operatorToken , node . operatorToken . kind !== SyntaxKind . CommaToken ? " " : undefined ) ;
3313
3302
write ( tokenToString ( node . operatorToken . kind ) ) ;
3314
-
3315
- if ( ! indented1 ) {
3316
- var indented2 = indentIfOnDifferentLines ( node , node . operatorToken , node . right ) ;
3317
- }
3318
-
3319
- if ( ! indented2 ) {
3320
- write ( " " ) ;
3321
- }
3322
-
3303
+ var indentedAfterOperator = indentIfOnDifferentLines ( node , node . operatorToken , node . right , " " ) ;
3323
3304
emit ( node . right ) ;
3324
-
3325
- // If we indented the left or the right side, then dedent now.
3326
- if ( indented1 || indented2 ) {
3327
- decreaseIndent ( ) ;
3328
- }
3305
+ decreaseIndentIf ( indentedBeforeOperator , indentedAfterOperator ) ;
3329
3306
}
3330
3307
}
3331
3308
@@ -3335,43 +3312,27 @@ module ts {
3335
3312
3336
3313
function emitConditionalExpression ( node : ConditionalExpression ) {
3337
3314
emit ( node . condition ) ;
3338
- var indent1 = indentIfOnDifferentLines ( node , node . condition , node . questionToken ) ;
3339
- if ( ! indent1 ) {
3340
- write ( " " ) ;
3341
- }
3342
-
3315
+ var indentedBeforeQuestion = indentIfOnDifferentLines ( node , node . condition , node . questionToken , " " ) ;
3343
3316
write ( "?" ) ;
3344
-
3345
- if ( ! indent1 ) {
3346
- var indent2 = indentIfOnDifferentLines ( node , node . questionToken , node . whenTrue ) ;
3347
- }
3348
-
3349
- if ( ! indent2 ) {
3350
- write ( " " ) ;
3351
- }
3352
-
3317
+ var indentedAfterQuestion = indentIfOnDifferentLines ( node , node . questionToken , node . whenTrue , " " ) ;
3353
3318
emit ( node . whenTrue ) ;
3319
+ decreaseIndentIf ( indentedBeforeQuestion , indentedAfterQuestion ) ;
3320
+ var indentedBeforeColon = indentIfOnDifferentLines ( node , node . whenTrue , node . colonToken , " " ) ;
3321
+ write ( ":" ) ;
3322
+ var indentedAfterColon = indentIfOnDifferentLines ( node , node . colonToken , node . whenFalse , " " ) ;
3323
+ emit ( node . whenFalse ) ;
3324
+ decreaseIndentIf ( indentedBeforeColon , indentedAfterColon ) ;
3325
+ }
3354
3326
3355
- if ( indent1 || indent2 ) {
3327
+ // Helper function to decrease the indent if we previously indented. Allows multiple
3328
+ // previous indent values to be considered at a time. This also allows caller to just
3329
+ // call this once, passing in all their appropriate indent values, instead of needing
3330
+ // to call this helper function multiple times.
3331
+ function decreaseIndentIf ( value1 : boolean , value2 ?: boolean ) {
3332
+ if ( value1 ) {
3356
3333
decreaseIndent ( ) ;
3357
3334
}
3358
-
3359
- var indent3 = indentIfOnDifferentLines ( node , node . whenTrue , node . colonToken ) ;
3360
- if ( ! indent3 ) {
3361
- write ( " " ) ;
3362
- }
3363
-
3364
- write ( ":" ) ;
3365
- if ( ! indent3 ) {
3366
- var indent4 = indentIfOnDifferentLines ( node , node . colonToken , node . whenFalse ) ;
3367
- }
3368
-
3369
- if ( ! indent4 ) {
3370
- write ( " " ) ;
3371
- }
3372
-
3373
- emit ( node . whenFalse ) ;
3374
- if ( indent3 || indent4 ) {
3335
+ if ( value2 ) {
3375
3336
decreaseIndent ( ) ;
3376
3337
}
3377
3338
}
0 commit comments