Expose `path` string to DocumentSnapshot (#244)

* Pass a `path` variable that can resolve to a DocumentReference to DocumentSnapshot

* Added `path` to all other calls to DocumentSnapshot.

* document_change.dart nit

* query_snapshot.dart nitpick

* Fixing nits and adding a documentID getter

* Changed final "reference" to "path"

* Untested attempt at Objective-C implementation

* Newline nit

* VSC added spaces :(

* Update pubspec.yaml

* Update CHANGELOG.md
diff --git a/packages/firebase_firestore/CHANGELOG.md b/packages/firebase_firestore/CHANGELOG.md
index f956327..f824c41 100644
--- a/packages/firebase_firestore/CHANGELOG.md
+++ b/packages/firebase_firestore/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.0.2
+
+* Add path property to DocumentSnapshot
+
 ## 0.0.1+1
 
 * Update project homepage
diff --git a/packages/firebase_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FirestorePlugin.java b/packages/firebase_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FirestorePlugin.java
index bf520ec..153b889 100644
--- a/packages/firebase_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FirestorePlugin.java
+++ b/packages/firebase_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FirestorePlugin.java
@@ -74,8 +74,10 @@
       arguments.put("handle", handle);
       if (documentSnapshot.exists()) {
         arguments.put("data", documentSnapshot.getData());
+        arguments.put("path", documentSnapshot.getReference().getPath());
       } else {
         arguments.put("data", null);
+        arguments.put("path", documentSnapshot.getReference().getPath());
       }
       channel.invokeMethod("DocumentSnapshot", arguments);
     }
@@ -93,10 +95,13 @@
       Map<String, Object> arguments = new HashMap<>();
       arguments.put("handle", handle);
 
+      List<String> paths = new ArrayList<>();
       List<Map<String, Object>> documents = new ArrayList<>();
       for (DocumentSnapshot document : querySnapshot.getDocuments()) {
+        paths.add(document.getReference().getPath());
         documents.add(document.getData());
       }
+      arguments.put("paths", paths);
       arguments.put("documents", documents);
 
       List<Map<String, Object>> documentChanges = new ArrayList<>();
@@ -118,6 +123,7 @@
         change.put("oldIndex", documentChange.getOldIndex());
         change.put("newIndex", documentChange.getNewIndex());
         change.put("document", documentChange.getDocument().getData());
+        change.put("path", documentChange.getDocument().getReference().getPath());
         documentChanges.add(change);
       }
       arguments.put("documentChanges", documentChanges);
diff --git a/packages/firebase_firestore/ios/Classes/FirestorePlugin.m b/packages/firebase_firestore/ios/Classes/FirestorePlugin.m
index 7a8d2f3..0b97987 100644
--- a/packages/firebase_firestore/ios/Classes/FirestorePlugin.m
+++ b/packages/firebase_firestore/ios/Classes/FirestorePlugin.m
@@ -67,8 +67,10 @@
     id<FIRListenerRegistration> listener = [getQuery(call.arguments)
         addSnapshotListener:^(FIRQuerySnapshot *_Nullable snapshot, NSError *_Nullable error) {
           if (error) result(error.flutterError);
+          NSMutableArray *paths = [NSMutableArray array];
           NSMutableArray *documents = [NSMutableArray array];
           for (FIRDocumentSnapshot *document in snapshot.documents) {
+            [paths addObject:document.reference.path];
             [documents addObject:document.data];
           }
           NSMutableArray *documentChanges = [NSMutableArray array];
@@ -88,6 +90,7 @@
             [documentChanges addObject:@{
               @"type" : type,
               @"document" : documentChange.document.data,
+              @"path" : documentChange.document.reference.path,
               @"oldIndex" : [NSNumber numberWithUnsignedInteger:documentChange.oldIndex],
               @"newIndex" : [NSNumber numberWithUnsignedInteger:documentChange.newIndex],
             }];
@@ -95,6 +98,7 @@
           [self.channel invokeMethod:@"QuerySnapshot"
                            arguments:@{
                              @"handle" : handle,
+                             @"paths" : paths,
                              @"documents" : documents,
                              @"documentChanges" : documentChanges
                            }];
@@ -111,6 +115,7 @@
           [self.channel invokeMethod:@"DocumentSnapshot"
                            arguments:@{
                              @"handle" : handle,
+                             @"path" : snapshot.reference.path,
                              @"data" : snapshot.exists ? snapshot.data : [NSNull null],
                            }];
         }];
diff --git a/packages/firebase_firestore/lib/src/document_change.dart b/packages/firebase_firestore/lib/src/document_change.dart
index e7cf80f..8a7f101 100644
--- a/packages/firebase_firestore/lib/src/document_change.dart
+++ b/packages/firebase_firestore/lib/src/document_change.dart
@@ -26,7 +26,10 @@
   DocumentChange._(Map<String, dynamic> data)
       : oldIndex = data['oldIndex'],
         newIndex = data['newIndex'],
-        document = new DocumentSnapshot._(data['document']),
+        document = new DocumentSnapshot._(
+          data['path'],
+          data['document'],
+        ),
         type = DocumentChangeType.values.firstWhere((DocumentChangeType type) {
           return type.toString() == data['type'];
         });
diff --git a/packages/firebase_firestore/lib/src/document_snapshot.dart b/packages/firebase_firestore/lib/src/document_snapshot.dart
index 13e1484..a02ebf8 100644
--- a/packages/firebase_firestore/lib/src/document_snapshot.dart
+++ b/packages/firebase_firestore/lib/src/document_snapshot.dart
@@ -10,11 +10,17 @@
 /// The data can be extracted with the data property or by using subscript
 /// syntax to access a specific field.
 class DocumentSnapshot {
+  /// Represents the document's reference
+  final String path;
+
   /// Contains all the data of this snapshot
   final Map<String, dynamic> data;
 
-  DocumentSnapshot._(this.data);
+  DocumentSnapshot._(this.path, this.data);
 
   /// Reads individual values from the snapshot
   dynamic operator [](String key) => data[key];
+
+  /// Returns the ID of the snapshot's document
+  String get documentID => path.split('/').last;
 }
diff --git a/packages/firebase_firestore/lib/src/firestore.dart b/packages/firebase_firestore/lib/src/firestore.dart
index e4537da..d5c902e 100644
--- a/packages/firebase_firestore/lib/src/firestore.dart
+++ b/packages/firebase_firestore/lib/src/firestore.dart
@@ -26,6 +26,7 @@
         _queryObservers[call.arguments['handle']].add(snapshot);
       } else if (call.method == 'DocumentSnapshot') {
         final DocumentSnapshot snapshot = new DocumentSnapshot._(
+          call.arguments['path'],
           call.arguments['data'],
         );
         _documentObservers[call.arguments['handle']].add(snapshot);
diff --git a/packages/firebase_firestore/lib/src/query_snapshot.dart b/packages/firebase_firestore/lib/src/query_snapshot.dart
index 333b321..6f80abc 100644
--- a/packages/firebase_firestore/lib/src/query_snapshot.dart
+++ b/packages/firebase_firestore/lib/src/query_snapshot.dart
@@ -13,10 +13,13 @@
   /// is the first snapshot, all documents will be in the list as Added changes.
   final List<DocumentChange> documentChanges;
 
-  QuerySnapshot._(Map<String, List<Map<String, dynamic>>> data)
+  QuerySnapshot._(Map<String, List<dynamic>> data)
       : documents = new List<DocumentSnapshot>.generate(
             data['documents'].length, (int index) {
-          return new DocumentSnapshot._(data['documents'][index]);
+          return new DocumentSnapshot._(
+            data['paths'][index],
+            data['documents'][index],
+          );
         }),
         documentChanges = new List<DocumentChange>.generate(
             data['documentChanges'].length, (int index) {
diff --git a/packages/firebase_firestore/pubspec.yaml b/packages/firebase_firestore/pubspec.yaml
index 0a33ea9..616e510 100755
--- a/packages/firebase_firestore/pubspec.yaml
+++ b/packages/firebase_firestore/pubspec.yaml
@@ -3,7 +3,7 @@
 description: Firestore plugin for Flutter.
 author: Flutter Team <flutter-dev@googlegroups.com>
 homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_firestore
-version: 0.0.1+1
+version: 0.0.2
 
 flutter:
   plugin: