Merge pull request dart-lang/markdown#56 from srawlins/iterable-extension-collections

Prevent duplicate syntaxes from being added to a document
diff --git a/pkgs/markdown/lib/src/document.dart b/pkgs/markdown/lib/src/document.dart
index e8b470b..fc5fa82 100644
--- a/pkgs/markdown/lib/src/document.dart
+++ b/pkgs/markdown/lib/src/document.dart
@@ -8,23 +8,25 @@
 /// Maintains the context needed to parse a Markdown document.
 class Document {
   final Map<String, Link> refLinks = {};
-  List<BlockSyntax> blockSyntaxes;
-  List<InlineSyntax> inlineSyntaxes;
+  Iterable<BlockSyntax> blockSyntaxes;
+  Iterable<InlineSyntax> inlineSyntaxes;
   ExtensionSet extensionSet;
   Resolver linkResolver;
   Resolver imageLinkResolver;
 
   Document(
-      {this.blockSyntaxes,
-      this.inlineSyntaxes,
-      extensionSet,
+      {Iterable<BlockSyntax> blockSyntaxes,
+      Iterable<InlineSyntax> inlineSyntaxes,
+      ExtensionSet extensionSet,
       this.linkResolver,
       this.imageLinkResolver}) {
-    blockSyntaxes ??= [];
-    inlineSyntaxes ??= [];
     extensionSet ??= ExtensionSet.commonMark;
-    blockSyntaxes.addAll(extensionSet.blockSyntaxes);
-    inlineSyntaxes.addAll(extensionSet.inlineSyntaxes);
+    this.blockSyntaxes = new Set()
+      ..addAll(blockSyntaxes ?? [])
+      ..addAll(extensionSet.blockSyntaxes);
+    this.inlineSyntaxes = new Set()
+      ..addAll(inlineSyntaxes ?? [])
+      ..addAll(extensionSet.inlineSyntaxes);
   }
 
   parseRefLinks(List<String> lines) {
diff --git a/pkgs/markdown/lib/src/html_renderer.dart b/pkgs/markdown/lib/src/html_renderer.dart
index 399f992..aa17d5e 100644
--- a/pkgs/markdown/lib/src/html_renderer.dart
+++ b/pkgs/markdown/lib/src/html_renderer.dart
@@ -13,8 +13,8 @@
 
 /// Converts the given string of markdown to HTML.
 String markdownToHtml(String markdown,
-    {List<BlockSyntax> blockSyntaxes,
-    List<InlineSyntax> inlineSyntaxes,
+    {Iterable<BlockSyntax> blockSyntaxes,
+    Iterable<InlineSyntax> inlineSyntaxes,
     ExtensionSet extensionSet,
     Resolver linkResolver,
     Resolver imageLinkResolver,
diff --git a/pkgs/markdown/test/util.dart b/pkgs/markdown/test/util.dart
index e9bd5a8..dfec203 100644
--- a/pkgs/markdown/test/util.dart
+++ b/pkgs/markdown/test/util.dart
@@ -26,25 +26,18 @@
 
 // Locate the "test" directory. Use mirrors so that this works with the test
 // package, which loads this suite into an isolate.
-String get _testDir => p.dirname(currentMirrorSystem()
-      .findLibrary(#markdown.test.util)
-      .uri
-      .path);
+String get _testDir =>
+    p.dirname(currentMirrorSystem().findLibrary(#markdown.test.util).uri.path);
 
 void testFile(String file,
-    {List<BlockSyntax> blockSyntaxes,
-    List<InlineSyntax> inlineSyntaxes}) =>
-  testUnitFile(
-      file,
-      new File(p.join(_testDir, file)),
-      blockSyntaxes: blockSyntaxes,
-      inlineSyntaxes: inlineSyntaxes);
+        {Iterable<BlockSyntax> blockSyntaxes,
+        Iterable<InlineSyntax> inlineSyntaxes}) =>
+    testUnitFile(file, new File(p.join(_testDir, file)),
+        blockSyntaxes: blockSyntaxes, inlineSyntaxes: inlineSyntaxes);
 
-void testUnitFile(
-    String directory,
-    File entry,
-    {List<BlockSyntax> blockSyntaxes,
-    List<InlineSyntax> inlineSyntaxes}) {
+void testUnitFile(String directory, File entry,
+    {Iterable<BlockSyntax> blockSyntaxes,
+    Iterable<InlineSyntax> inlineSyntaxes}) {
   group('$directory ${p.basename(entry.path)}', () {
     var lines = entry.readAsLinesSync();
 
@@ -76,23 +69,15 @@
         expectedOutput += lines[i] + "\n";
       }
 
-      validateCore(
-          description,
-          input,
-          expectedOutput,
-          blockSyntaxes: blockSyntaxes,
-          inlineSyntaxes: inlineSyntaxes
-          );
+      validateCore(description, input, expectedOutput,
+          blockSyntaxes: blockSyntaxes, inlineSyntaxes: inlineSyntaxes);
     }
   });
 }
 
-void validateCore(
-    String description,
-    String markdown,
-    String html,
-    {List<BlockSyntax> blockSyntaxes,
-    List<InlineSyntax> inlineSyntaxes,
+void validateCore(String description, String markdown, String html,
+    {Iterable<BlockSyntax> blockSyntaxes,
+    Iterable<InlineSyntax> inlineSyntaxes,
     Resolver linkResolver,
     Resolver imageLinkResolver,
     bool inlineOnly: false}) {