diff --git a/src/snapshot/metadata.rs b/src/snapshot/metadata.rs index eadbd1ca..0105e34e 100644 --- a/src/snapshot/metadata.rs +++ b/src/snapshot/metadata.rs @@ -13,15 +13,27 @@ pub struct InstanceMetadata { /// manage. pub ignore_unknown_instances: bool, - // TODO: Make source_path a SmallVec in order to support meta - // files? Maybe we should use another member of the snapshot middleware to - // support damage-painting - /// The path that this file came from, if it's the top-level instance from a - /// model that came directly from disk. + /// The paths that, when changed, could cause the function that generated + /// this snapshot to generate a different snapshot. Paths should be included + /// even if they don't exist, since the presence of a file can change the + /// outcome of a snapshot function. + /// + /// For example, a file named foo.lua might have these contributing paths: + /// - foo.lua + /// - foo.meta.json (even if this file doesn't exist!) + /// + /// A directory named bar/ included in the project file might have these: + /// - bar/ + /// - bar/init.meta.json + /// - bar/init.lua + /// - bar/init.server.lua + /// - bar/init.client.lua + /// - default.project.json /// /// This path is used to make sure that file changes update all instances - /// that may need updates.. - pub source_path: Option, + /// that may need updates. + // TODO: Change this to be a SmallVec for performance in common cases? + pub contributing_paths: Vec, /// If this instance was defined in a project file, this is the name from /// the project file and the node under it. @@ -36,7 +48,7 @@ impl Default for InstanceMetadata { fn default() -> Self { InstanceMetadata { ignore_unknown_instances: false, - source_path: None, + contributing_paths: Vec::new(), project_node: None, } } diff --git a/src/snapshot/tests/snapshots/apply__add_property.snap b/src/snapshot/tests/snapshots/apply__add_property.snap index e702f856..bb466314 100644 --- a/src/snapshot/tests/snapshots/apply__add_property.snap +++ b/src/snapshot/tests/snapshots/apply__add_property.snap @@ -11,6 +11,6 @@ properties: Value: Value of Foo metadata: ignore_unknown_instances: false - source_path: ~ + contributing_paths: [] project_node: ~ children: [] diff --git a/src/snapshot/tests/snapshots/apply__remove_property_after_patch.snap b/src/snapshot/tests/snapshots/apply__remove_property_after_patch.snap index c267148f..a732e1b0 100644 --- a/src/snapshot/tests/snapshots/apply__remove_property_after_patch.snap +++ b/src/snapshot/tests/snapshots/apply__remove_property_after_patch.snap @@ -8,6 +8,6 @@ class_name: ROOT properties: {} metadata: ignore_unknown_instances: false - source_path: ~ + contributing_paths: [] project_node: ~ children: [] diff --git a/src/snapshot/tests/snapshots/apply__remove_property_initial.snap b/src/snapshot/tests/snapshots/apply__remove_property_initial.snap index 7b912600..a8aaaa3e 100644 --- a/src/snapshot/tests/snapshots/apply__remove_property_initial.snap +++ b/src/snapshot/tests/snapshots/apply__remove_property_initial.snap @@ -11,6 +11,6 @@ properties: Value: Should be removed metadata: ignore_unknown_instances: false - source_path: ~ + contributing_paths: [] project_node: ~ children: [] diff --git a/src/snapshot/tests/snapshots/apply__set_name_and_class_name.snap b/src/snapshot/tests/snapshots/apply__set_name_and_class_name.snap index 4d2fb365..707accac 100644 --- a/src/snapshot/tests/snapshots/apply__set_name_and_class_name.snap +++ b/src/snapshot/tests/snapshots/apply__set_name_and_class_name.snap @@ -8,6 +8,6 @@ class_name: Folder properties: {} metadata: ignore_unknown_instances: false - source_path: ~ + contributing_paths: [] project_node: ~ children: [] diff --git a/src/snapshot/tests/snapshots/compute__add_child.snap b/src/snapshot/tests/snapshots/compute__add_child.snap index 7ea5e6c2..b2281d8a 100644 --- a/src/snapshot/tests/snapshots/compute__add_child.snap +++ b/src/snapshot/tests/snapshots/compute__add_child.snap @@ -9,7 +9,7 @@ added_instances: snapshot_id: ~ metadata: ignore_unknown_instances: false - source_path: ~ + contributing_paths: [] project_node: ~ name: New class_name: Folder diff --git a/src/snapshot/tree.rs b/src/snapshot/tree.rs index 27aa3f45..f5a30dce 100644 --- a/src/snapshot/tree.rs +++ b/src/snapshot/tree.rs @@ -110,12 +110,12 @@ impl RojoTree { // If this instance's source path changed, we need to update our // path associations so that file changes will trigger updates // to this instance correctly. - if existing_metadata.source_path != metadata.source_path { - if let Some(existing_path) = &existing_metadata.source_path { + if existing_metadata.contributing_paths != metadata.contributing_paths { + for existing_path in &existing_metadata.contributing_paths { self.path_to_ids.remove(existing_path, id); } - if let Some(new_path) = &metadata.source_path { + for new_path in &metadata.contributing_paths { self.path_to_ids.insert(new_path.clone(), id); } } @@ -140,8 +140,8 @@ impl RojoTree { } fn insert_metadata(&mut self, id: RbxId, metadata: InstanceMetadata) { - if let Some(source_path) = &metadata.source_path { - self.path_to_ids.insert(source_path.clone(), id); + for path in &metadata.contributing_paths { + self.path_to_ids.insert(path.clone(), id); } self.metadata_map.insert(id, metadata); @@ -157,9 +157,9 @@ impl RojoTree { ) { let metadata = self.metadata_map.remove(&id).unwrap(); - if let Some(source_path) = &metadata.source_path { - self.path_to_ids.remove(source_path, id); - path_to_ids.insert(source_path.clone(), id); + for path in &metadata.contributing_paths { + self.path_to_ids.remove(path, id); + path_to_ids.insert(path.clone(), id); } metadata_map.insert(id, metadata);