@@ -23,6 +23,10 @@ namespace ts {
23
23
// More efficient to create a collator once and use its `compare` than to call `a.localeCompare(b)` many times.
24
24
export const collator : { compare ( a : string , b : string ) : number } = typeof Intl === "object" && typeof Intl . Collator === "function" ? new Intl . Collator ( ) : undefined ;
25
25
26
+ // This means "compare in a case insensitive manner but consider accentsor other diacritic marks"
27
+ // (e.g. a ≠ b, a ≠ á, a = A)
28
+ const accentSensitivity : Intl . CollatorOptions = { usage : "sort" , sensitivity : "accent" } ;
29
+
26
30
/**
27
31
* Use this function instead of calling "String.prototype.localeCompre". This function will preform appropriate check to make sure that
28
32
* "typeof Intl" is correct as there are reported issues #11110 nad #11339.
@@ -1029,13 +1033,13 @@ namespace ts {
1029
1033
return a < b ? Comparison . LessThan : Comparison . GreaterThan ;
1030
1034
}
1031
1035
1032
- export function compareStrings ( a : string , b : string , ignoreCase ?: boolean ) : Comparison {
1036
+ export function compareStrings ( a : string , b : string , locales ?: string | string [ ] , options ?: Intl . CollatorOptions ) : Comparison {
1033
1037
if ( a === b ) return Comparison . EqualTo ;
1034
1038
if ( a === undefined ) return Comparison . LessThan ;
1035
1039
if ( b === undefined ) return Comparison . GreaterThan ;
1036
- if ( ignoreCase ) {
1037
- const result = localeCompare ( a , b , /*locales*/ undefined , /*options*/ { usage : "sort" , sensitivity : "accent" } ) ;
1038
- if ( result ) {
1040
+ if ( options ) {
1041
+ if ( collator && String . prototype . localeCompare ) {
1042
+ const result = a . localeCompare ( b , locales , options ) ;
1039
1043
return result < 0 ? Comparison . LessThan : result > 0 ? Comparison . GreaterThan : Comparison . EqualTo ;
1040
1044
}
1041
1045
@@ -1048,7 +1052,7 @@ namespace ts {
1048
1052
}
1049
1053
1050
1054
export function compareStringsCaseInsensitive ( a : string , b : string ) {
1051
- return compareStrings ( a , b , /*ignoreCase */ true ) ;
1055
+ return compareStrings ( a , b , /*locales */ undefined , accentSensitivity ) ;
1052
1056
}
1053
1057
1054
1058
function getDiagnosticFileName ( diagnostic : Diagnostic ) : string {
@@ -1418,7 +1422,8 @@ namespace ts {
1418
1422
const bComponents = getNormalizedPathComponents ( b , currentDirectory ) ;
1419
1423
const sharedLength = Math . min ( aComponents . length , bComponents . length ) ;
1420
1424
for ( let i = 0 ; i < sharedLength ; i ++ ) {
1421
- const result = compareStrings ( aComponents [ i ] , bComponents [ i ] , ignoreCase ) ;
1425
+ const result = compareStrings ( aComponents [ i ] , bComponents [ i ] ,
1426
+ /*locales*/ undefined , /*options*/ ignoreCase ? accentSensitivity : undefined ) ;
1422
1427
if ( result !== Comparison . EqualTo ) {
1423
1428
return result ;
1424
1429
}
@@ -1440,7 +1445,8 @@ namespace ts {
1440
1445
}
1441
1446
1442
1447
for ( let i = 0 ; i < parentComponents . length ; i ++ ) {
1443
- const result = compareStrings ( parentComponents [ i ] , childComponents [ i ] , ignoreCase ) ;
1448
+ const result = compareStrings ( parentComponents [ i ] , childComponents [ i ] ,
1449
+ /*locales*/ undefined , /*options*/ ignoreCase ? accentSensitivity : undefined ) ;
1444
1450
if ( result !== Comparison . EqualTo ) {
1445
1451
return false ;
1446
1452
}
0 commit comments