`pub add` create top-level attribute in block-style if possible. (#3423)

diff --git a/lib/src/command/add.dart b/lib/src/command/add.dart
index 0556434..196a7d6 100644
--- a/lib/src/command/add.dart
+++ b/lib/src/command/add.dart
@@ -405,17 +405,23 @@
             'version': versionConstraintString
         };
       }
-      final packagePath = [dependencyKey, name];
 
       if (yamlEditor.parseAt(
             [dependencyKey],
             orElse: () => YamlScalar.wrap(null),
           ).value ==
           null) {
-        // Insert dependencyKey: {} if it did not exist.
-        yamlEditor.update([dependencyKey], {});
+        // Handle the case where [dependencyKey] does not already exist.
+        // We ensure it is in Block-style by default.
+        yamlEditor.update(
+            [dependencyKey],
+            wrapAsYamlNode({name: pubspecInformation},
+                collectionStyle: CollectionStyle.BLOCK));
+      } else {
+        final packagePath = [dependencyKey, name];
+
+        yamlEditor.update(packagePath, pubspecInformation);
       }
-      yamlEditor.update(packagePath, pubspecInformation);
 
       /// Remove the package from dev_dependencies if we are adding it to
       /// dependencies. Refer to [_addPackageToPubspec] for additional discussion.
diff --git a/test/add/common/add_test.dart b/test/add/common/add_test.dart
index 82e098b..02459cc 100644
--- a/test/add/common/add_test.dart
+++ b/test/add/common/add_test.dart
@@ -7,6 +7,7 @@
 import 'package:path/path.dart' as p;
 import 'package:pub/src/exit_codes.dart' as exit_codes;
 import 'package:test/test.dart';
+import 'package:yaml/yaml.dart';
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
@@ -137,10 +138,47 @@
       server.serve('foo', '1.2.3');
 
       await d.dir(appPath, [
-        d.pubspec({'name': 'myapp'})
+        d.file('pubspec.yaml', '''
+name: myapp
+environment:
+  "sdk": ">=0.1.2 <1.0.0"
+''')
       ]).create();
 
       await pubAdd(args: ['foo:1.2.3']);
+      print(
+          File(p.join(d.sandbox, appPath, 'pubspec.yaml')).readAsStringSync());
+      final yaml = loadYaml(
+          File(p.join(d.sandbox, appPath, 'pubspec.yaml')).readAsStringSync());
+
+      expect(((yaml as YamlMap).nodes['dependencies'] as YamlMap).style,
+          CollectionStyle.BLOCK,
+          reason: 'Should create the mapping with block-style by default');
+      await d.cacheDir({'foo': '1.2.3'}).validate();
+      await d.appPackageConfigFile([
+        d.packageConfigEntry(name: 'foo', version: '1.2.3'),
+      ]).validate();
+      await d.appDir({'foo': '1.2.3'}).validate();
+    });
+
+    test('Inserts correctly when the pubspec is flow-style at top-level',
+        () async {
+      final server = await servePackages();
+      server.serve('foo', '1.2.3');
+
+      await d.dir(appPath, [
+        d.file('pubspec.yaml',
+            '{"name":"myapp", "environment": {"sdk": ">=0.1.2 <1.0.0"}}')
+      ]).create();
+
+      await pubAdd(args: ['foo:1.2.3']);
+
+      final yaml = loadYaml(
+          File(p.join(d.sandbox, appPath, 'pubspec.yaml')).readAsStringSync());
+
+      expect(((yaml as YamlMap).nodes['dependencies'] as YamlMap).style,
+          CollectionStyle.FLOW,
+          reason: 'Should not break a pubspec in flow-style');
 
       await d.cacheDir({'foo': '1.2.3'}).validate();
       await d.appPackageConfigFile([