[flutter_tool] Remove direct usage of package:linter in the flutter_tools (#47174)
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index d91a2f5..071d4a7 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -4,8 +4,7 @@ import 'dart:async'; -import 'package:linter/src/rules/pub/package_names.dart' as package_names; // ignore: implementation_imports -import 'package:linter/src/utils.dart' as linter_utils; // ignore: implementation_imports +import 'package:meta/meta.dart'; import 'package:yaml/yaml.dart' as yaml; import '../android/android.dart' as android; @@ -749,12 +748,97 @@ 'yaml', }; +// A valid Dart identifier. +// https://dart.dev/guides/language/language-tour#important-concepts +final RegExp _identifierRegExp = RegExp('[a-zA-Z_][a-zA-Z0-9_]*'); + +// non-contextual dart keywords. +//' https://dart.dev/guides/language/language-tour#keywords +const Set<String> _keywords = <String>{ + 'abstract', + 'as', + 'assert', + 'async', + 'await', + 'break', + 'case', + 'catch', + 'class', + 'const', + 'continue', + 'covariant', + 'default', + 'deferred', + 'do', + 'dynamic', + 'else', + 'enum', + 'export', + 'extends', + 'extension', + 'external', + 'factory', + 'false', + 'final', + 'finally', + 'for', + 'function', + 'get', + 'hide', + 'if', + 'implements', + 'import', + 'in', + 'inout', + 'interface', + 'is', + 'late', + 'library', + 'mixin', + 'native', + 'new', + 'null', + 'of', + 'on', + 'operator', + 'out', + 'part', + 'patch', + 'required', + 'rethrow', + 'return', + 'set', + 'show', + 'source', + 'static', + 'super', + 'switch', + 'sync', + 'this', + 'throw', + 'true', + 'try', + 'typedef', + 'var', + 'void', + 'while', + 'with', + 'yield', +}; + +/// Whether [name] is a valid Pub package. +@visibleForTesting +bool isValidPackageName(String name) { + final Match match = _identifierRegExp.matchAsPrefix(name); + return match != null && match.end == name.length && !_keywords.contains(name); +} + /// Return null if the project name is legal. Return a validation message if /// we should disallow the project name. String _validateProjectName(String projectName) { - if (!linter_utils.isValidPackageName(projectName)) { - final String packageNameDetails = package_names.PubPackageNames().details; - return '"$projectName" is not a valid Dart package name.\n\n$packageNameDetails'; + if (!isValidPackageName(projectName)) { + return '"$projectName" is not a valid Dart package name.\n\n' + 'See https://dart.dev/tools/pub/pubspec#name for more information.'; } if (_packageDependencies.contains(projectName)) { return "Invalid project name: '$projectName' - this will conflict with Flutter "