diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart index 189a1642370..312f506edfc 100644 --- a/pkg/analyzer/test/generated/test_support.dart +++ b/pkg/analyzer/test/generated/test_support.dart @@ -12,7 +12,7 @@ import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/source/source.dart'; import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer_testing/src/analysis_rule/pub_package_resolution.dart'; -import 'package:analyzer_utilities/extensions/string.dart'; +import 'package:analyzer_testing/utilities/extensions/string.dart'; import 'package:test/test.dart'; /// A diagnostic listener that collects all of the diagnostics passed to it for diff --git a/pkg/analyzer_testing/api.txt b/pkg/analyzer_testing/api.txt index f821cf6097f..6dfcf78cee8 100644 --- a/pkg/analyzer_testing/api.txt +++ b/pkg/analyzer_testing/api.txt @@ -65,6 +65,13 @@ package:analyzer_testing/src/analysis_rule/pub_package_resolution.dart: package:analyzer_testing/utilities/extensions/resource_provider.dart: ResourceProviderExtension (extension on ResourceProvider): convertPath (method: String Function(String)) +package:analyzer_testing/utilities/extensions/string.dart: + StringExtension (extension on String): + isCamelCase (getter: bool) + isPascalCase (getter: bool) + toCamelCase (method: String Function()) + toPascalCase (method: String Function()) + toSnakeCase (method: String Function()) package:analyzer_testing/utilities/utilities.dart: analysisOptionsContent (function: String Function({Map errors, List experiments, List includes, List legacyPlugins, bool propagateLinterExceptions, List rules, bool strictCasts, bool strictInference, bool strictRawTypes, List unignorableNames})) pubspecYamlContent (function: String Function({List dependencies, String? name, String? sdkVersion})) diff --git a/pkg/analyzer_testing/lib/utilities/extensions/string.dart b/pkg/analyzer_testing/lib/utilities/extensions/string.dart new file mode 100644 index 00000000000..1be252313f1 --- /dev/null +++ b/pkg/analyzer_testing/lib/utilities/extensions/string.dart @@ -0,0 +1,94 @@ +// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +extension StringExtension on String { + static final _toSnakeCaseRegExp = RegExp('_?[A-Z]'); + static final _startsWithLowerCaseRegExp = RegExp('^[a-z]'); + static final _startsWithUpperCaseRegExp = RegExp('^[A-Z]'); + + /// Returns `true` if the string is a `camelCase` string. + bool get isCamelCase { + if (contains('_')) return false; + if (_startsWithLowerCaseRegExp.matchAsPrefix(this) == null) return false; + return true; + } + + /// Returns `true` if the string is a `PascalCase` string. + bool get isPascalCase { + if (contains('_')) return false; + if (_startsWithUpperCaseRegExp.matchAsPrefix(this) == null) return false; + return true; + } + + /// Converts `SCREAMING_SNAKE_CASE` or `snake_case` to `camelCase`. + String toCamelCase() { + var parts = toLowerCase().split('_'); + var buffer = StringBuffer(); + var i = 0; + // Preserve initial '_'s + while (i < parts.length - 1 && parts[i].isEmpty) { + buffer.write('_'); + ++i; + } + if (i < parts.length) { + // Convert first word to lower case + buffer.write(parts[i].toLowerCase()); + ++i; + // Convert remaining words to initial upper case + while (i < parts.length) { + var part = parts[i]; + if (part.isNotEmpty) { + buffer.write(part[0].toUpperCase()); + buffer.write(part.substring(1)); + } + ++i; + } + } + return buffer.toString(); + } + + /// Converts `SCREAMING_SNAKE_CASE` or `snake_case` to `PascalCase`. + String toPascalCase() { + var parts = toLowerCase().split('_'); + var buffer = StringBuffer(); + var i = 0; + // Preserve initial '_'s + while (i < parts.length - 1 && parts[i].isEmpty) { + buffer.write('_'); + ++i; + } + // Convert words to initial upper case + while (i < parts.length) { + var part = parts[i]; + if (part.isNotEmpty) { + buffer.write(part[0].toUpperCase()); + buffer.write(part.substring(1)); + } + ++i; + } + return buffer.toString(); + } + + /// Converts `camelCase` or `PascalCase` to `snake_case` + String toSnakeCase() { + var parts = []; + var i = 0; + var wordStarts = _toSnakeCaseRegExp.allMatches(this); + for (var RegExpMatch(:start) in wordStarts) { + if (i < start) { + parts.add(substring(i, start).toLowerCase()); + i = start; + } + if (this[i] == '_' && parts.isNotEmpty) { + // Avoid doubling up the `_`. This handles strings that are already in + // snake case like `foo_Bar` (which translates to `foo_bar`). + i++; + } + } + if (i < length) { + parts.add(substring(i).toLowerCase()); + } + return parts.join('_'); + } +} diff --git a/pkg/analyzer_testing/pubspec.yaml b/pkg/analyzer_testing/pubspec.yaml index e8bd20bfe2d..e14ef04af04 100644 --- a/pkg/analyzer_testing/pubspec.yaml +++ b/pkg/analyzer_testing/pubspec.yaml @@ -24,3 +24,4 @@ dev_dependencies: analyzer_utilities: any args: any lints: any + test_reflective_loader: any diff --git a/pkg/analyzer_utilities/test/extensions/string_test.dart b/pkg/analyzer_testing/test/utilities/extensions/string_test.dart similarity index 97% rename from pkg/analyzer_utilities/test/extensions/string_test.dart rename to pkg/analyzer_testing/test/utilities/extensions/string_test.dart index e027799df1d..85366555397 100644 --- a/pkg/analyzer_utilities/test/extensions/string_test.dart +++ b/pkg/analyzer_testing/test/utilities/extensions/string_test.dart @@ -6,7 +6,7 @@ // compatible with the `non_constant_identifier_names` lint. // ignore_for_file: non_constant_identifier_names -import 'package:analyzer_utilities/extensions/string.dart'; +import 'package:analyzer_testing/utilities/extensions/string.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; diff --git a/pkg/analyzer_utilities/lib/analyzer_messages.dart b/pkg/analyzer_utilities/lib/analyzer_messages.dart index f589abb6df2..1814d72f32f 100644 --- a/pkg/analyzer_utilities/lib/analyzer_messages.dart +++ b/pkg/analyzer_utilities/lib/analyzer_messages.dart @@ -9,8 +9,8 @@ import 'dart:convert'; import 'dart:io'; import 'package:analyzer_testing/package_root.dart' as pkg_root; +import 'package:analyzer_testing/utilities/extensions/string.dart'; import 'package:analyzer_utilities/analyzer_message_constant_style.dart'; -import 'package:analyzer_utilities/extensions/string.dart'; import 'package:analyzer_utilities/located_error.dart'; import 'package:analyzer_utilities/messages.dart'; import 'package:analyzer_utilities/tools.dart'; diff --git a/pkg/analyzer_utilities/lib/extensions/string.dart b/pkg/analyzer_utilities/lib/extensions/string.dart index 1be252313f1..c325d823539 100644 --- a/pkg/analyzer_utilities/lib/extensions/string.dart +++ b/pkg/analyzer_utilities/lib/extensions/string.dart @@ -1,94 +1,3 @@ // Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. - -extension StringExtension on String { - static final _toSnakeCaseRegExp = RegExp('_?[A-Z]'); - static final _startsWithLowerCaseRegExp = RegExp('^[a-z]'); - static final _startsWithUpperCaseRegExp = RegExp('^[A-Z]'); - - /// Returns `true` if the string is a `camelCase` string. - bool get isCamelCase { - if (contains('_')) return false; - if (_startsWithLowerCaseRegExp.matchAsPrefix(this) == null) return false; - return true; - } - - /// Returns `true` if the string is a `PascalCase` string. - bool get isPascalCase { - if (contains('_')) return false; - if (_startsWithUpperCaseRegExp.matchAsPrefix(this) == null) return false; - return true; - } - - /// Converts `SCREAMING_SNAKE_CASE` or `snake_case` to `camelCase`. - String toCamelCase() { - var parts = toLowerCase().split('_'); - var buffer = StringBuffer(); - var i = 0; - // Preserve initial '_'s - while (i < parts.length - 1 && parts[i].isEmpty) { - buffer.write('_'); - ++i; - } - if (i < parts.length) { - // Convert first word to lower case - buffer.write(parts[i].toLowerCase()); - ++i; - // Convert remaining words to initial upper case - while (i < parts.length) { - var part = parts[i]; - if (part.isNotEmpty) { - buffer.write(part[0].toUpperCase()); - buffer.write(part.substring(1)); - } - ++i; - } - } - return buffer.toString(); - } - - /// Converts `SCREAMING_SNAKE_CASE` or `snake_case` to `PascalCase`. - String toPascalCase() { - var parts = toLowerCase().split('_'); - var buffer = StringBuffer(); - var i = 0; - // Preserve initial '_'s - while (i < parts.length - 1 && parts[i].isEmpty) { - buffer.write('_'); - ++i; - } - // Convert words to initial upper case - while (i < parts.length) { - var part = parts[i]; - if (part.isNotEmpty) { - buffer.write(part[0].toUpperCase()); - buffer.write(part.substring(1)); - } - ++i; - } - return buffer.toString(); - } - - /// Converts `camelCase` or `PascalCase` to `snake_case` - String toSnakeCase() { - var parts = []; - var i = 0; - var wordStarts = _toSnakeCaseRegExp.allMatches(this); - for (var RegExpMatch(:start) in wordStarts) { - if (i < start) { - parts.add(substring(i, start).toLowerCase()); - i = start; - } - if (this[i] == '_' && parts.isNotEmpty) { - // Avoid doubling up the `_`. This handles strings that are already in - // snake case like `foo_Bar` (which translates to `foo_bar`). - i++; - } - } - if (i < length) { - parts.add(substring(i).toLowerCase()); - } - return parts.join('_'); - } -} diff --git a/pkg/analyzer_utilities/lib/messages.dart b/pkg/analyzer_utilities/lib/messages.dart index 7bde00ea9c5..ce27d116d1c 100644 --- a/pkg/analyzer_utilities/lib/messages.dart +++ b/pkg/analyzer_utilities/lib/messages.dart @@ -9,8 +9,8 @@ import 'dart:convert'; import 'dart:io'; import 'package:analyzer_testing/package_root.dart' as pkg_root; +import 'package:analyzer_testing/utilities/extensions/string.dart'; import 'package:analyzer_utilities/analyzer_messages.dart'; -import 'package:analyzer_utilities/extensions/string.dart'; import 'package:analyzer_utilities/lint_messages.dart'; import 'package:analyzer_utilities/located_error.dart'; import 'package:collection/collection.dart'; diff --git a/pkg/analyzer_utilities/pubspec.yaml b/pkg/analyzer_utilities/pubspec.yaml index 336134a7a3b..413a38feb8d 100644 --- a/pkg/analyzer_utilities/pubspec.yaml +++ b/pkg/analyzer_utilities/pubspec.yaml @@ -23,4 +23,3 @@ dependencies: dev_dependencies: analyzer_plugin: any lints: any - test_reflective_loader: any diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml index b2f9cb471b2..6a39baeddee 100644 --- a/pkg/front_end/pubspec.yaml +++ b/pkg/front_end/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: # Use 'any' constraints here; we get our versions from the DEPS file. dev_dependencies: analyzer: any + analyzer_testing: any analyzer_utilities: any args: any build_integration: any diff --git a/pkg/front_end/test/messages_suite.dart b/pkg/front_end/test/messages_suite.dart index 4807ef69e69..f71d0e3f3fe 100644 --- a/pkg/front_end/test/messages_suite.dart +++ b/pkg/front_end/test/messages_suite.dart @@ -13,8 +13,8 @@ import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart' getMessageRelatedInformation; import 'package:_fe_analyzer_shared/src/messages/severity.dart' show CfeSeverity, severityEnumValues; -import 'package:analyzer_utilities/extensions/string.dart'; import 'package:analyzer_utilities/messages.dart'; +import 'package:analyzer_testing/utilities/extensions/string.dart'; import 'package:front_end/src/api_prototype/compiler_options.dart' show CompilerOptions, parseExperimentalArguments, parseExperimentalFlags; import 'package:front_end/src/api_prototype/experimental_flags.dart' diff --git a/pkg/front_end/tool/generate_messages_lib.dart b/pkg/front_end/tool/generate_messages_lib.dart index 2fdf05ebc80..f67c832b414 100644 --- a/pkg/front_end/tool/generate_messages_lib.dart +++ b/pkg/front_end/tool/generate_messages_lib.dart @@ -5,7 +5,7 @@ /// @docImport 'package:front_end/src/codes/type_labeler.dart'; library; -import 'package:analyzer_utilities/extensions/string.dart'; +import 'package:analyzer_testing/utilities/extensions/string.dart'; import 'package:analyzer_utilities/located_error.dart'; import 'package:analyzer_utilities/messages.dart';