anchor.diff:          '$packageName plugin not installed; this adds $description specific functionality to Atom.\n'
           'Install the plugin from Atom or run \'apm install $packageName\'.'
         ));
  -      return true;
  -    } else {
  -      try {
  -        String flutterPluginPath = path.join(_getAtomHomePath(), 'packages', packageName);
  -        File packageFile = new File(path.join(flutterPluginPath, 'package.json'));
  -        Map<String, dynamic> packageInfo = JSON.decode(packageFile.readAsStringSync());
  -        String version = packageInfo['version'];
  -        messages.add(new ValidationMessage('$packageName plugin version $version'));
  -      } catch (error) {
  -        printTrace('Unable to read $packageName plugin version: $error');
  -      }
         return false;
       }
  +    try {
  +      String flutterPluginPath = path.join(_getAtomHomePath(), 'packages', packageName);
  +      File packageFile = new File(path.join(flutterPluginPath, 'package.json'));
  +      Map<String, dynamic> packageInfo = JSON.decode(packageFile.readAsStringSync());
  +      String version = packageInfo['version'];
  +      messages.add(new ValidationMessage('$packageName plugin version $version'));
  +    } catch (error) {
  +      printTrace('Unable to read $packageName plugin version: $error');
  +    }
  +    return true;
     }
   
     bool hasPackage(String packageName) {
       String packagePath = path.join(_getAtomHomePath(), 'packages', packageName);
  +    return FileSystemEntity.isDirectorySync(packagePath);
  +  }
  +}
  +
  +class IntellijValidator extends DoctorValidator {
  +  IntellijValidator(String title, {this.version, this.pluginsPath}) : super(title);
  +
  +  final String version;
  +  final String pluginsPath;
  +
  +  static Iterable<DoctorValidator> get installed {
  +    List<DoctorValidator> validators = <DoctorValidator>[];
  +    Map<String, String> products = <String, String>{
  +      'IntelliJIdea' : 'IntelliJ IDEA Ultimate Edition',
  +      'IdeaIC' : 'IntelliJ IDEA Community Edition',
  +      'WebStorm' : 'IntelliJ WebStorm',
  +    };
  +    String homeDir = Platform.environment['HOME'];
  +
  +    if (Platform.isLinux && homeDir != null) {
  +      for (FileSystemEntity dir in new Directory(homeDir).listSync()) {
  +        if (dir is Directory) {
  +          String name = path.basename(dir.path);
  +          products.forEach((String id, String title) {
  +            if (name.startsWith('.$id')) {
  +              String version = name.substring(id.length + 1);
  +              String installPath;
  +              try {
  +                installPath = new File(path.join(dir.path, 'system', '.home')).readAsStringSync();
  +              } catch (e) {
  +                // ignored
  +              }
  +              if (installPath != null && FileSystemEntity.isDirectorySync(installPath)) {
  +                validators.add(new IntellijValidator(
  +                  title,
  +                  version: version,
  +                  pluginsPath: path.join(dir.path, 'config', 'plugins'),
  +                ));
  +              }
  +            }
  +          });
  +        }
  +      }
  +    } else if (Platform.isMacOS) {
  +      // TODO(danrubel): add support for Mac
  +
  +    } else {
  +      // TODO(danrubel): add support for Windows
  +    }
  +    return validators;
  +  }
  +
  +  @override
  +  Future<ValidationResult> validate() async {
  +    List<ValidationMessage> messages = <ValidationMessage>[];
  +
  +    int installCount = 0;
  +
  +    if (_validateHasPackage(messages, 'Dart', 'Dart'))
  +      installCount++;
  +
  +    if (_validateHasPackage(messages, 'Flutter', 'Flutter'))
  +      installCount++;
  +
  +    if (installCount < 2) {
  +      messages.add(new ValidationMessage(
  +          'For information about managing plugins, see\n'
  +          'https://www.jetbrains.com/help/idea/2016.2/managing-plugins.html'
  +      ));
  +    }
  +
  +    return new ValidationResult(
  +        installCount == 2 ? ValidationType.installed : ValidationType.partial,
  +        messages,
  +        statusInfo: 'version $version'
  +    );
  +  }
  +
  +  bool _validateHasPackage(List<ValidationMessage> messages, String packageName, String description) {
  +    if (!hasPackage(packageName)) {
  +      messages.add(new ValidationMessage(
  +        '$packageName plugin not installed; this adds $description specific functionality.'
  +      ));
  +      return false;
  +    }
  +    messages.add(new ValidationMessage('$packageName plugin installed'));
  +    return true;
  +  }
  +
  +  bool hasPackage(String packageName) {
  +    String packagePath = path.join(pluginsPath, packageName);
       return FileSystemEntity.isDirectorySync(packagePath);
     }
   }
  
positive.code:   }
  }
  
  class AtomValidator extends DoctorValidator {
    AtomValidator() : super('Atom - a lightweight development environment for Flutter');
  
    static File getConfigFile() {
      // ~/.atom/config.cson
  
negative.code:   // A short message about the status.
    final String statusInfo;
    final List<ValidationMessage> messages;
  
    String get leadingBox {
      if (type == ValidationType.missing)
  