Skip to content

Commit 874feb2

Browse files
authored
Add locale-sensitive casing (#880)
* Add locale-sensitive casing * Add changelog * Add default_components to built libs * Use casemap key instead * Trigger on labeling
1 parent 5b33925 commit 874feb2

File tree

14 files changed

+245
-22
lines changed

14 files changed

+245
-22
lines changed

.github/workflows/intl4x.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ permissions:
66
on:
77
pull_request:
88
branches: [main]
9+
types: [opened, synchronize, reopened, labeled, unlabeled]
910
paths:
1011
- ".github/workflows/intl4x.yml"
1112
- "pkgs/intl4x/**"
@@ -293,21 +294,21 @@ jobs:
293294
run: |
294295
rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
295296
296-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_x64 --os linux --architecture x64 --compile_type dynamic --cargo_features collator,datetime,list,decimal,plurals,experimental,compiled_data
297+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_x64 --os linux --architecture x64 --compile_type dynamic --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental,compiled_data
297298
298299
- name: Build Mac
299300
if: matrix.os == 'macos-latest'
300301
run: |
301302
rustup component add rust-src --toolchain nightly-aarch64-apple-darwin
302303
303-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_arm64 --os macos --architecture arm64 --compile_type dynamic --cargo_features collator,datetime,list,decimal,plurals,experimental,compiled_data
304+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_arm64 --os macos --architecture arm64 --compile_type dynamic --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental,compiled_data
304305
305306
- name: Build Windows
306307
if: matrix.os == 'windows-latest'
307308
run: |
308309
rustup component add rust-src --toolchain nightly-x86_64-pc-windows-msvc
309310
310-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64 --os windows --architecture x64 --compile_type dynamic --cargo_features collator,datetime,list,decimal,plurals,experimental,compiled_data
311+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64 --os windows --architecture x64 --compile_type dynamic --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental,compiled_data
311312
312313
- name: Run `dart pub get`
313314
run: |

.github/workflows/intl4x_artifacts.yml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@ jobs:
7373
7474
mkdir submodules/icu4x/bin
7575
76-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os android --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
77-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os android --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
78-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_ia32_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os android --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
79-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os android --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
80-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_arm_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os linux --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
81-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os linux --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
82-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_riscv64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os linux --architecture riscv64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
83-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os linux --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
76+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os android --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
77+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os android --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
78+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_ia32_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os android --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
79+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/android_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os android --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
80+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_arm_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os linux --architecture arm --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
81+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os linux --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
82+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_riscv64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os linux --architecture riscv64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
83+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/linux_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os linux --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
8484
8585
- name: Build Linux data
8686
if: matrix.os == 'ubuntu-latest' && matrix.compiletype == 'static' && matrix.include_data == false
@@ -111,10 +111,10 @@ jobs:
111111
112112
mkdir submodules/icu4x/bin
113113
114-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os ios --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
115-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os ios --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
116-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os macos --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
117-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os macos --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
114+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os ios --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
115+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/ios_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os ios --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
116+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os macos --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
117+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/macos_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os macos --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
118118
119119
- name: Build Mac data
120120
if: matrix.os == 'macos-latest' && matrix.compiletype == 'static' && matrix.include_data == false
@@ -140,9 +140,9 @@ jobs:
140140
141141
mkdir submodules/icu4x/bin
142142
143-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
144-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
145-
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,experimental${{ env.DATA }}
143+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_arm64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os windows --architecture arm64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
144+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_ia32_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os windows --architecture ia32 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
145+
dart pkgs/intl4x/lib/src/hook_helpers/build_libs.g.dart --working_directory submodules/icu4x --file submodules/icu4x/bin/windows_x64_${{ matrix.compiletype }}${{ env.FILENAME_SUFFIX }} --os windows --architecture x64 --compile_type ${{ matrix.compiletype }} --cargo_features collator,datetime,list,decimal,plurals,casemap,experimental${{ env.DATA }}
146146
147147
- name: Build Windows data
148148
if: matrix.os == 'windows-latest' && matrix.compiletype == 'static' && matrix.include_data == false

pkgs/intl4x/CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
## 0.12.2-wip
2+
3+
- Add lower- and uppercasing.
4+
15
## 0.12.1
26

37
- Use new artifacts from `intl4x-icu-v.0.12.0-artifacts`.
4-
8+
59
## 0.12.0
610

711
- Update to ICU4X 2.0.

pkgs/intl4x/hook/build.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ final class CheckoutMode extends BuildMode {
215215
'plurals',
216216
'buffer_provider',
217217
'experimental',
218-
'default_components',
218+
'casemap',
219219
'compiled_data',
220220
],
221221
);

pkgs/intl4x/lib/case_mapping.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'intl4x.dart';
6+
7+
export 'src/case_mapping/case_mapping.dart';
8+
export 'src/locale/locale.dart';
9+
10+
extension CaseMappingWithIntl4X on String {
11+
String toLocaleLowerCase(Locale locale) =>
12+
Intl(locale: locale).caseMapping.toLowerCase(this);
13+
String toLocaleUpperCase(Locale locale) =>
14+
Intl(locale: locale).caseMapping.toUpperCase(this);
15+
}

pkgs/intl4x/lib/intl4x.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'case_mapping.dart';
56
import 'collation.dart';
67
import 'display_names.dart';
78
import 'number_format.dart';
9+
import 'src/case_mapping/case_mapping_impl.dart';
810
import 'src/collation/collation.dart';
911
import 'src/collation/collation_impl.dart';
1012
import 'src/datetime_format/datetime_format.dart';
@@ -18,7 +20,6 @@ import 'src/find_locale.dart';
1820
import 'src/list_format/list_format.dart';
1921
import 'src/list_format/list_format_impl.dart';
2022
import 'src/list_format/list_format_options.dart';
21-
import 'src/locale/locale.dart';
2223
import 'src/number_format/number_format.dart';
2324
import 'src/number_format/number_format_impl.dart';
2425
import 'src/plural_rules/plural_rules.dart';
@@ -88,6 +89,9 @@ class Intl {
8889
),
8990
);
9091

92+
CaseMapping get caseMapping =>
93+
CaseMapping(CaseMappingImpl.build(locale, localeMatcher, ecmaPolicy));
94+
9195
/// Construct an [Intl] instance providing the current [locale] and the
9296
/// [ecmaPolicy] defining which locales should fall back to the browser
9397
/// provided functions.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import '../test_checker.dart';
6+
import 'case_mapping_impl.dart';
7+
8+
/// A locale-sensitive case mapper for transforming strings.
9+
///
10+
/// This class provides methods to convert strings to lowercase or uppercase
11+
/// based on the current locale. During testing, the input is returned
12+
/// unchanged.
13+
class CaseMapping {
14+
final CaseMappingImpl _caseMappingImpl;
15+
16+
const CaseMapping(this._caseMappingImpl);
17+
18+
String toLowerCase(String input) {
19+
if (isInTest) {
20+
return input;
21+
} else {
22+
return _caseMappingImpl.toLowerCase(input);
23+
}
24+
}
25+
26+
String toUpperCase(String input) {
27+
if (isInTest) {
28+
return input;
29+
} else {
30+
return _caseMappingImpl.toUpperCase(input);
31+
}
32+
}
33+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import '../bindings/lib.g.dart' as icu;
6+
import '../locale/locale.dart';
7+
import '../locale/locale_4x.dart';
8+
import 'case_mapping_impl.dart';
9+
10+
CaseMappingImpl getCaseMapping4X(Locale locale, Null _) =>
11+
CaseMapping4X(locale as Locale4x);
12+
13+
class CaseMapping4X extends CaseMappingImpl {
14+
final icu.CaseMapper _caseMapper;
15+
final Locale4x _locale;
16+
17+
CaseMapping4X(this._locale) : _caseMapper = icu.CaseMapper(), super(_locale);
18+
19+
@override
20+
String toLowerCase(String input) =>
21+
_caseMapper.lowercase(input, _locale.get4X);
22+
23+
@override
24+
String toUpperCase(String input) =>
25+
_caseMapper.uppercase(input, _locale.get4X);
26+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'dart:js_interop';
6+
7+
import '../locale/locale.dart';
8+
import '../options.dart';
9+
import 'case_mapping_impl.dart';
10+
11+
CaseMappingImpl? getCaseMappingECMA(Locale locale, Null _, LocaleMatcher _) =>
12+
_CaseMappingECMA.tryToBuild(locale);
13+
14+
extension on JSString {
15+
@JS('String.toLocaleUpperCase')
16+
external String toLocaleUpperCase(String locale);
17+
@JS('String.toLocaleLowerCase')
18+
external String toLocaleLowerCase(String locale);
19+
}
20+
21+
class _CaseMappingECMA extends CaseMappingImpl {
22+
_CaseMappingECMA(super.locale);
23+
24+
static CaseMappingImpl? tryToBuild(Locale locale) => _CaseMappingECMA(locale);
25+
@override
26+
String toUpperCase(String input) =>
27+
input.toJS.toLocaleUpperCase(locale.toLanguageTag());
28+
29+
@override
30+
String toLowerCase(String input) =>
31+
input.toJS.toLocaleLowerCase(locale.toLanguageTag());
32+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import '../../ecma_policy.dart';
6+
import '../ecma/ecma_policy.dart';
7+
import '../locale/locale.dart';
8+
import '../options.dart';
9+
import '../utils.dart';
10+
import 'case_mapping_stub.dart' if (dart.library.js) 'case_mapping_ecma.dart';
11+
import 'case_mapping_stub_4x.dart' if (dart.library.io) 'case_mapping_4x.dart';
12+
13+
abstract class CaseMappingImpl {
14+
final Locale locale;
15+
16+
CaseMappingImpl(this.locale);
17+
18+
String toLowerCase(String input);
19+
String toUpperCase(String input);
20+
21+
static CaseMappingImpl build(
22+
Locale locales,
23+
LocaleMatcher localeMatcher,
24+
EcmaPolicy ecmaPolicy,
25+
) => buildFormatter(
26+
locales,
27+
null,
28+
localeMatcher,
29+
ecmaPolicy,
30+
getCaseMappingECMA,
31+
getCaseMapping4X,
32+
);
33+
}

0 commit comments

Comments
 (0)