Flutter doctor error message lookup (#23889)

diff --git a/packages/flutter_tools/lib/src/base/user_messages.dart b/packages/flutter_tools/lib/src/base/user_messages.dart
new file mode 100644
index 0000000..4e0e4a8
--- /dev/null
+++ b/packages/flutter_tools/lib/src/base/user_messages.dart
@@ -0,0 +1,183 @@
+import 'context.dart';
+
+UserMessages get userMessages => context[UserMessages];
+
+/// Class containing message strings that can be produced by Flutter tools.
+class UserMessages {
+  // Messages used in FlutterValidator
+  String flutterStatusInfo(String channel, String version, String os, String locale) =>
+      'Channel $channel, v$version, on $os, locale $locale';
+  String flutterVersion(String version, String flutterRoot) =>
+      'Flutter version $version at $flutterRoot';
+  String flutterRevision(String revision, String age, String date) =>
+      'Framework revision $revision ($age), $date';
+  String engineRevision(String revision) => 'Engine revision $revision';
+  String dartRevision(String revision) => 'Dart version $revision';
+  String get flutterBinariesDoNotRun =>
+      'Downloaded executables cannot execute on host.\n'
+      'See https://github.com/flutter/flutter/issues/6207 for more information';
+  String get flutterBinariesLinuxRepairCommands =>
+      'On Debian/Ubuntu/Mint: sudo apt-get install lib32stdc++6\n'
+      'On Fedora: dnf install libstdc++.i686\n'
+      'On Arch: pacman -S lib32-libstdc++5';
+
+  // Messages used in NoIdeValidator
+  String get noIdeStatusInfo => 'No supported IDEs installed';
+  String get noIdeInstallationInfo => 'IntelliJ - https://www.jetbrains.com/idea/';
+
+  // Messages used in IntellijValidator
+  String intellijStatusInfo(String version) => 'version $version';
+  String get intellijPluginInfo =>
+      'For information about installing plugins, see\n'
+      'https://flutter.io/intellij-setup/#installing-the-plugins';
+  String intellijMinimumVersion(String minVersion) =>
+      'This install is older than the minimum recommended version of $minVersion.';
+  String intellijLocation(String installPath) => 'IntelliJ at $installPath';
+
+  // Message used in IntellijValidatorOnMac
+  String get intellijMacUnknownResult => 'Cannot determine if IntelliJ is installed';
+
+  // Messages used in DeviceValidator
+  String get devicesMissing => 'No devices available';
+  String devicesAvailable(int devices) => '$devices available';
+
+  // Messages used in AndroidValidator
+  String androidCantRunJavaBinary(String javaBinary) => 'Cannot execute $javaBinary to determine the version';
+  String get androidUnknownJavaVersion => 'Could not determine java version';
+  String androidJavaVersion(String javaVersion) => 'Java version $javaVersion';
+  String androidBadSdkDir(String envKey, String homeDir) =>
+      '$envKey = $homeDir\n'
+      'but Android SDK not found at this location.';
+  String androidMissingSdkInstructions(String envKey) =>
+      'Unable to locate Android SDK.\n'
+      'Install Android Studio from: https://developer.android.com/studio/index.html\n'
+      'On first launch it will assist you in installing the Android SDK components.\n'
+      '(or visit https://flutter.io/setup/#android-setup for detailed instructions).\n'
+      'If Android SDK has been installed to a custom location, set $envKey to that location.\n'
+      'You may also want to add it to your PATH environment variable.\n';
+  String androidSdkLocation(String directory) => 'Android SDK at $directory';
+  String androidSdkPlatformToolsVersion(String platform, String tools) =>
+      'Platform $platform, build-tools $tools';
+  String get androidSdkInstallHelp =>
+      'Try re-installing or updating your Android SDK,\n'
+      'visit https://flutter.io/setup/#android-setup for detailed instructions.';
+  String get androidMissingNdk => 'Android NDK location not configured (optional; useful for native profiling support)';
+  String androidNdkLocation(String directory) => 'Android NDK at $directory';
+  // Also occurs in AndroidLicenseValidator
+  String androidStatusInfo(String version) => 'Android SDK version $version';
+
+  // Messages used in AndroidLicenseValidator
+  String get androidMissingJdk =>
+      'No Java Development Kit (JDK) found; You must have the environment '
+      'variable JAVA_HOME set and the java binary in your PATH. '
+      'You can download the JDK from https://www.oracle.com/technetwork/java/javase/downloads/.';
+  String androidJdkLocation(String location) => 'Java binary at: $location';
+  String get androidLicensesAll => 'All Android licenses accepted.';
+  String get androidLicensesSome => 'Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses';
+  String get androidLicensesNone => 'Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses';
+  String get androidLicensesUnknown => 'Android license status unknown.';
+  String androidSdkOutdated(String managerPath) =>
+      'A newer version of the Android SDK is required. To update, run:\n'
+      '$managerPath --update\n';
+  String androidLicensesTimeout(String managerPath) => 'Intentionally killing $managerPath';
+  String get androidSdkShort => 'Unable to locate Android SDK.';
+  String androidMissingSdkManager(String sdkManagerPath) =>
+      'Android sdkmanager tool not found ($sdkManagerPath).\n'
+      'Try re-installing or updating your Android SDK,\n'
+      'visit https://flutter.io/setup/#android-setup for detailed instructions.';
+
+  // Messages used in AndroidStudioValidator
+  String androidStudioVersion(String version) => 'version $version';
+  String androidStudioLocation(String location) => 'Android Studio at $location';
+  String get androidStudioNeedsUpdate => 'Try updating or re-installing Android Studio.';
+  String get androidStudioResetDir =>
+      'Consider removing your android-studio-dir setting by running:\n'
+      'flutter config --android-studio-dir=';
+
+  // Messages used in NoAndroidStudioValidator
+  String androidStudioMissing(String location) =>
+      'android-studio-dir = $location\n'
+      'but Android Studio not found at this location.';
+  String get androidStudioInstallation =>
+      'Android Studio not found; download from https://developer.android.com/studio/index.html\n'
+      '(or visit https://flutter.io/setup/#android-setup for detailed instructions).';
+
+  // Messages used in IOSValidator
+  String iOSXcodeLocation(String location) => 'Xcode at $location';
+  String iOSXcodeOutdated(int versionMajor, int versionMinor) =>
+      'Flutter requires a minimum Xcode version of $versionMajor.$versionMinor.0.\n'
+      'Download the latest version or update via the Mac App Store.';
+  String get iOSXcodeEula => 'Xcode end user license agreement not signed; open Xcode or run the command \'sudo xcodebuild -license\'.';
+  String get iOSXcodeMissingSimct =>
+      'Xcode requires additional components to be installed in order to run.\n'
+      'Launch Xcode and install additional required components when prompted.';
+  String get iOSXcodeMissing =>
+      'Xcode not installed; this is necessary for iOS development.\n'
+      'Download at https://developer.apple.com/xcode/download/.';
+  String get iOSXcodeIncomplete =>
+      'Xcode installation is incomplete; a full installation is necessary for iOS development.\n'
+      'Download at: https://developer.apple.com/xcode/download/\n'
+      'Or install Xcode via the App Store.\n'
+      'Once installed, run:\n'
+      '  sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer';
+  String get iOSIMobileDeviceMissing =>
+      'libimobiledevice and ideviceinstaller are not installed. To install with Brew, run:\n'
+      '  brew update\n'
+      '  brew install --HEAD usbmuxd\n'
+      '  brew link usbmuxd\n'
+      '  brew install --HEAD libimobiledevice\n'
+      '  brew install ideviceinstaller';
+  String get iOSIMobileDeviceBroken =>
+      'Verify that all connected devices have been paired with this computer in Xcode.\n'
+      'If all devices have been paired, libimobiledevice and ideviceinstaller may require updating.\n'
+      'To update with Brew, run:\n'
+      '  brew update\n'
+      '  brew uninstall --ignore-dependencies libimobiledevice\n'
+      '  brew uninstall --ignore-dependencies usbmuxd\n'
+      '  brew install --HEAD usbmuxd\n'
+      '  brew unlink usbmuxd\n'
+      '  brew link usbmuxd\n'
+      '  brew install --HEAD libimobiledevice\n'
+      '  brew install ideviceinstaller';
+  String get iOSDeviceInstallerMissing =>
+      'ideviceinstaller is not installed; this is used to discover connected iOS devices.\n'
+      'To install with Brew, run:\n'
+      '  brew install --HEAD usbmuxd\n'
+      '  brew link usbmuxd\n'
+      '  brew install --HEAD libimobiledevice\n'
+      '  brew install ideviceinstaller';
+  String iOSDeployVersion(String version) => 'ios-deploy $version';
+  String iOSDeployOutdated(String minVersion) =>
+      'ios-deploy out of date ($minVersion is required). To upgrade with Brew:\n'
+      '  brew upgrade ios-deploy';
+  String get iOSDeployMissing =>
+      'ios-deploy not installed. To install:\n'
+      '  brew install ios-deploy';
+  String get iOSBrewMissing =>
+      'Brew can be used to install tools for iOS device development.\n'
+      'Download brew at https://brew.sh/.';
+
+  // Messages used in CocoaPodsValidator
+  String cocoaPodsVersion(String version) => 'CocoaPods version $version';
+  String cocoaPodsUninitialized(String consequence) =>
+      'CocoaPods installed but not initialized.\n'
+      '$consequence\n'
+      'To initialize CocoaPods, run:\n'
+      '  pod setup\n'
+      'once to finalize CocoaPods\' installation.';
+  String cocoaPodsMissing(String consequence, String installInstructions) =>
+      'CocoaPods not installed.\n'
+      '$consequence\n'
+      'To install:\n'
+      '$installInstructions';
+  String cocoaPodsOutdated(String recVersion, String consequence, String upgradeInstructions) =>
+      'CocoaPods out of date ($recVersion is recommended).\n'
+      '$consequence\n'
+      'To upgrade:\n'
+      '$upgradeInstructions';
+
+  // Messages used in VsCodeValidator
+  String vsCodeVersion(String version) => 'version $version';
+  String vsCodeLocation(String location) => 'VS Code at $location';
+  String vsCodeFlutterExtensionMissing(String url) => 'Flutter extension not installed; install from\n$url';
+}