diff --git a/build.rs b/build.rs index e423b61b..64b5bd94 100644 --- a/build.rs +++ b/build.rs @@ -20,6 +20,10 @@ fn snapshot_from_fs_path(path: &Path) -> io::Result { let file_name = entry.file_name().to_str().unwrap().to_owned(); + if file_name.starts_with(".git") { + continue; + } + // We can skip any TestEZ test files since they aren't necessary for // the plugin to run. if file_name.ends_with(".spec.lua") || file_name.ends_with(".spec.luau") { diff --git a/crates/rojo-insta-ext/src/redaction_map.rs b/crates/rojo-insta-ext/src/redaction_map.rs index 22574704..fab06bf9 100644 --- a/crates/rojo-insta-ext/src/redaction_map.rs +++ b/crates/rojo-insta-ext/src/redaction_map.rs @@ -5,19 +5,13 @@ use serde::Serialize; /// Enables redacting any value that serializes as a string. /// /// Used for transforming Rojo instance IDs into something deterministic. +#[derive(Default)] pub struct RedactionMap { ids: HashMap, last_id: usize, } impl RedactionMap { - pub fn new() -> Self { - Self { - ids: HashMap::new(), - last_id: 0, - } - } - pub fn get_redacted_value(&self, id: impl ToString) -> Option { let id = id.to_string(); diff --git a/plugin/src/App/Components/Checkbox.lua b/plugin/src/App/Components/Checkbox.lua index c4572e93..98cbf8c0 100644 --- a/plugin/src/App/Components/Checkbox.lua +++ b/plugin/src/App/Components/Checkbox.lua @@ -57,8 +57,9 @@ function Checkbox:render() end, }, { StateTip = e(Tooltip.Trigger, { - text = (if self.props.locked then "[LOCKED] " else "") - .. (if self.props.active then "Enabled" else "Disabled"), + text = (if self.props.locked + then (self.props.lockedTooltip or "(Cannot be changed right now)") .. "\n" + else "") .. (if self.props.active then "Enabled" else "Disabled"), }), Active = e(SlicedImage, { diff --git a/plugin/src/App/Components/Dropdown.lua b/plugin/src/App/Components/Dropdown.lua index 72629c18..486a614c 100644 --- a/plugin/src/App/Components/Dropdown.lua +++ b/plugin/src/App/Components/Dropdown.lua @@ -12,6 +12,7 @@ local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync) local SlicedImage = require(script.Parent.SlicedImage) local ScrollingFrame = require(script.Parent.ScrollingFrame) +local Tooltip = require(script.Parent.Tooltip) local e = Roact.createElement @@ -119,6 +120,12 @@ function Dropdown:render() end), BackgroundTransparency = 1, + }, { + StateTip = if self.props.locked + then e(Tooltip.Trigger, { + text = self.props.lockedTooltip or "(Cannot be changed right now)", + }) + else nil, }), Active = e("TextLabel", { Size = UDim2.new(1, -30, 1, 0), diff --git a/plugin/src/App/Components/Tooltip.lua b/plugin/src/App/Components/Tooltip.lua index 55b056c2..25423e8c 100644 --- a/plugin/src/App/Components/Tooltip.lua +++ b/plugin/src/App/Components/Tooltip.lua @@ -23,11 +23,8 @@ local TooltipContext = Roact.createContext({}) local function Popup(props) return Theme.with(function(theme) - local textXSpace = math.min(props.parentSize.X, 120) - local textBounds = Vector2.new( - textXSpace, - getTextBoundsAsync(props.Text, theme.Font.Main, theme.TextSize.Medium, textXSpace).Y - ) + local textXSpace = math.min(props.parentSize.X, 250) - TEXT_PADDING.X + local textBounds = getTextBoundsAsync(props.Text, theme.Font.Main, theme.TextSize.Medium, textXSpace) local contentSize = textBounds + TEXT_PADDING + (Vector2.one * 2) local trigger = props.Trigger:getValue() @@ -39,7 +36,7 @@ local function Popup(props) -- If there's not enough space below, and there's more space above, then show the tooltip above the trigger local displayAbove = spaceBelow < contentSize.Y and spaceAbove > spaceBelow - local X = math.clamp(props.Position.X - X_OFFSET, 0, props.parentSize.X - contentSize.X) + local X = math.clamp(props.Position.X - X_OFFSET, 0, math.max(props.parentSize.X - contentSize.X, 1)) local Y = 0 if displayAbove then diff --git a/plugin/src/App/StatusPages/Settings/Setting.lua b/plugin/src/App/StatusPages/Settings/Setting.lua index 47e7596b..1df42bcf 100644 --- a/plugin/src/App/StatusPages/Settings/Setting.lua +++ b/plugin/src/App/StatusPages/Settings/Setting.lua @@ -102,6 +102,7 @@ function Setting:render() then self.props.input elseif self.props.options ~= nil then e(Dropdown, { locked = self.props.locked, + lockedTooltip = self.props.lockedTooltip, options = self.props.options, active = self.state.setting, transparency = self.props.transparency, @@ -111,6 +112,7 @@ function Setting:render() }) else e(Checkbox, { locked = self.props.locked, + lockedTooltip = self.props.lockedTooltip, active = self.state.setting, transparency = self.props.transparency, onClick = function() diff --git a/plugin/src/App/StatusPages/Settings/init.lua b/plugin/src/App/StatusPages/Settings/init.lua index b2657d22..e76691e2 100644 --- a/plugin/src/App/StatusPages/Settings/init.lua +++ b/plugin/src/App/StatusPages/Settings/init.lua @@ -240,6 +240,7 @@ function SettingsPage:render() name = "Two-Way Sync", description = "Editing files in Studio will sync them into the filesystem", locked = self.props.syncActive, + lockedTooltip = "(Cannot change while currently syncing. Disconnect first.)", tag = "unstable", transparency = self.props.transparency, layoutOrder = layoutIncrement(), diff --git a/src/lua_ast.rs b/src/lua_ast.rs index a61e41c9..6734e8c6 100644 --- a/src/lua_ast.rs +++ b/src/lua_ast.rs @@ -22,6 +22,7 @@ trait FmtLua { } } +#[allow(dead_code)] struct DisplayLua(T); impl fmt::Display for DisplayLua diff --git a/src/multimap.rs b/src/multimap.rs index 9c399c24..fae6cff5 100644 --- a/src/multimap.rs +++ b/src/multimap.rs @@ -19,10 +19,10 @@ impl MultiMap { } } - pub fn get(&self, k: &Q) -> &[V] + pub fn get(&self, k: &Q) -> &[V] where K: Borrow, - Q: Hash + Eq, + Q: Hash + Eq + ?Sized, { self.inner.get(k).map(Vec::as_slice).unwrap_or(&[]) } diff --git a/src/project.rs b/src/project.rs index a83088c0..2b76d66f 100644 --- a/src/project.rs +++ b/src/project.rs @@ -230,7 +230,7 @@ impl Project { io::ErrorKind::NotFound => Error::NoProjectFound { path: project_path.to_path_buf(), }, - _ => return e.into(), + _ => e.into(), })?; Ok(Some(Self::load_from_slice(&contents, project_path, None)?)) @@ -250,7 +250,7 @@ impl Project { io::ErrorKind::NotFound => Error::NoProjectFound { path: project_path.to_path_buf(), }, - _ => return e.into(), + _ => e.into(), })?; Ok(Self::load_from_slice( diff --git a/src/snapshot/patch_compute.rs b/src/snapshot/patch_compute.rs index cb314176..ec93d8b3 100644 --- a/src/snapshot/patch_compute.rs +++ b/src/snapshot/patch_compute.rs @@ -313,7 +313,7 @@ mod test { // addition of a prop named Self, which is a self-referential Ref. let snapshot_id = Ref::new(); let snapshot = InstanceSnapshot { - snapshot_id: snapshot_id, + snapshot_id, properties: [("Self".to_owned(), Variant::Ref(snapshot_id))].into(), metadata: Default::default(), @@ -351,7 +351,7 @@ mod test { // This patch describes the existing instance with a new child added. let snapshot_id = Ref::new(); let snapshot = InstanceSnapshot { - snapshot_id: snapshot_id, + snapshot_id, children: vec![InstanceSnapshot { properties: [("Self".to_owned(), Variant::Ref(snapshot_id))].into(), diff --git a/src/snapshot/tests/apply.rs b/src/snapshot/tests/apply.rs index 27b16904..3e335b6b 100644 --- a/src/snapshot/tests/apply.rs +++ b/src/snapshot/tests/apply.rs @@ -9,7 +9,7 @@ use crate::{ #[test] fn set_name_and_class_name() { - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -36,7 +36,7 @@ fn set_name_and_class_name() { #[test] fn add_property() { - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -63,7 +63,7 @@ fn add_property() { #[test] fn remove_property() { - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -85,7 +85,7 @@ fn remove_property() { id: tree.get_root_id(), changed_name: None, changed_class_name: None, - changed_properties: [("Foo".to_owned(), None).into()].into(), + changed_properties: [("Foo".to_owned(), None)].into(), changed_metadata: None, }], ..Default::default() diff --git a/src/snapshot/tests/compute.rs b/src/snapshot/tests/compute.rs index ae1e2b4c..63c3ba66 100644 --- a/src/snapshot/tests/compute.rs +++ b/src/snapshot/tests/compute.rs @@ -9,7 +9,7 @@ use crate::snapshot::{compute_patch_set, InstanceSnapshot, RojoTree}; #[test] fn set_name_and_class_name() { - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); @@ -31,7 +31,7 @@ fn set_name_and_class_name() { #[test] fn set_property() { - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); @@ -53,7 +53,7 @@ fn set_property() { #[test] fn remove_property() { - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let mut tree = empty_tree(); redactions.intern(tree.get_root_id()); @@ -84,7 +84,7 @@ fn remove_property() { #[test] fn add_child() { - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); @@ -113,7 +113,7 @@ fn add_child() { #[test] fn remove_child() { - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let mut tree = empty_tree(); redactions.intern(tree.get_root_id()); diff --git a/src/snapshot/tree.rs b/src/snapshot/tree.rs index 8c30d5ef..3d4c6fb2 100644 --- a/src/snapshot/tree.rs +++ b/src/snapshot/tree.rs @@ -148,7 +148,7 @@ impl RojoTree { // We need to uphold the invariant that each ID can only map // to one referent. if let Some(new) = &metadata.specified_id { - if self.specified_id_to_refs.get(new).len() > 0 { + if !self.specified_id_to_refs.get(new).is_empty() { log::error!("Duplicate user-specified referent '{new}'"); } @@ -206,7 +206,7 @@ impl RojoTree { } if let Some(specified_id) = &metadata.specified_id { - if self.specified_id_to_refs.get(specified_id).len() > 0 { + if !self.specified_id_to_refs.get(specified_id).is_empty() { log::error!("Duplicate user-specified referent '{specified_id}'"); } diff --git a/src/snapshot_middleware/csv.rs b/src/snapshot_middleware/csv.rs index 6fefa5f2..7e4aa437 100644 --- a/src/snapshot_middleware/csv.rs +++ b/src/snapshot_middleware/csv.rs @@ -177,11 +177,11 @@ Ack,Ack!,,An exclamation of despair,¡Ay!"#, ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_csv( &InstanceContext::default(), - &mut vfs, + &vfs, Path::new("/foo.csv"), "foo", ) @@ -209,11 +209,11 @@ Ack,Ack!,,An exclamation of despair,¡Ay!"#, ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_csv( &InstanceContext::default(), - &mut vfs, + &vfs, Path::new("/foo.csv"), "foo", ) diff --git a/src/snapshot_middleware/dir.rs b/src/snapshot_middleware/dir.rs index a68674eb..5cfab8d5 100644 --- a/src/snapshot_middleware/dir.rs +++ b/src/snapshot_middleware/dir.rs @@ -116,12 +116,11 @@ mod test { imfs.load_snapshot("/foo", VfsSnapshot::empty_dir()) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); - let instance_snapshot = - snapshot_dir(&InstanceContext::default(), &mut vfs, Path::new("/foo")) - .unwrap() - .unwrap(); + let instance_snapshot = snapshot_dir(&InstanceContext::default(), &vfs, Path::new("/foo")) + .unwrap() + .unwrap(); insta::assert_yaml_snapshot!(instance_snapshot); } @@ -135,12 +134,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); - let instance_snapshot = - snapshot_dir(&InstanceContext::default(), &mut vfs, Path::new("/foo")) - .unwrap() - .unwrap(); + let instance_snapshot = snapshot_dir(&InstanceContext::default(), &vfs, Path::new("/foo")) + .unwrap() + .unwrap(); insta::assert_yaml_snapshot!(instance_snapshot); } diff --git a/src/snapshot_middleware/json.rs b/src/snapshot_middleware/json.rs index 3ec65111..bb681779 100644 --- a/src/snapshot_middleware/json.rs +++ b/src/snapshot_middleware/json.rs @@ -98,11 +98,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs.clone()); + let vfs = Vfs::new(imfs.clone()); let instance_snapshot = snapshot_json( &InstanceContext::default(), - &mut vfs, + &vfs, Path::new("/foo.json"), "foo", ) diff --git a/src/snapshot_middleware/lua.rs b/src/snapshot_middleware/lua.rs index c20cac86..d17c90cb 100644 --- a/src/snapshot_middleware/lua.rs +++ b/src/snapshot_middleware/lua.rs @@ -124,11 +124,11 @@ mod test { imfs.load_snapshot("/foo.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(true)), - &mut vfs, + &vfs, Path::new("/foo.lua"), "foo", ScriptType::Module, @@ -147,11 +147,11 @@ mod test { imfs.load_snapshot("/foo.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(false)), - &mut vfs, + &vfs, Path::new("/foo.lua"), "foo", ScriptType::Module, @@ -170,11 +170,11 @@ mod test { imfs.load_snapshot("/foo.server.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(true)), - &mut vfs, + &vfs, Path::new("/foo.server.lua"), "foo", ScriptType::Server, @@ -193,11 +193,11 @@ mod test { imfs.load_snapshot("/foo.server.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(false)), - &mut vfs, + &vfs, Path::new("/foo.server.lua"), "foo", ScriptType::Server, @@ -216,11 +216,11 @@ mod test { imfs.load_snapshot("/foo.client.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(true)), - &mut vfs, + &vfs, Path::new("/foo.client.lua"), "foo", ScriptType::Client, @@ -239,11 +239,11 @@ mod test { imfs.load_snapshot("/foo.client.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(false)), - &mut vfs, + &vfs, Path::new("/foo.client.lua"), "foo", ScriptType::Client, @@ -266,11 +266,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(true)), - &mut vfs, + &vfs, Path::new("/root"), "root", ScriptType::Module, @@ -300,11 +300,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(true)), - &mut vfs, + &vfs, Path::new("/foo.lua"), "foo", ScriptType::Module, @@ -334,11 +334,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(false)), - &mut vfs, + &vfs, Path::new("/foo.lua"), "foo", ScriptType::Module, @@ -368,11 +368,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(true)), - &mut vfs, + &vfs, Path::new("/foo.server.lua"), "foo", ScriptType::Server, @@ -402,11 +402,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(false)), - &mut vfs, + &vfs, Path::new("/foo.server.lua"), "foo", ScriptType::Server, @@ -438,11 +438,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(true)), - &mut vfs, + &vfs, Path::new("/bar.server.lua"), "bar", ScriptType::Server, @@ -474,11 +474,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( &InstanceContext::with_emit_legacy_scripts(Some(false)), - &mut vfs, + &vfs, Path::new("/bar.server.lua"), "bar", ScriptType::Server, diff --git a/src/snapshot_middleware/rbxm.rs b/src/snapshot_middleware/rbxm.rs index 7983d0e7..f2c08dd0 100644 --- a/src/snapshot_middleware/rbxm.rs +++ b/src/snapshot_middleware/rbxm.rs @@ -54,11 +54,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_rbxm( &InstanceContext::default(), - &mut vfs, + &vfs, Path::new("/foo.rbxm"), "foo", ) diff --git a/src/snapshot_middleware/rbxmx.rs b/src/snapshot_middleware/rbxmx.rs index 4266dc0d..d71e28b7 100644 --- a/src/snapshot_middleware/rbxmx.rs +++ b/src/snapshot_middleware/rbxmx.rs @@ -66,11 +66,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs); + let vfs = Vfs::new(imfs); let instance_snapshot = snapshot_rbxmx( &InstanceContext::default(), - &mut vfs, + &vfs, Path::new("/foo.rbxmx"), "foo", ) diff --git a/src/snapshot_middleware/toml.rs b/src/snapshot_middleware/toml.rs index a219d7e7..11212e18 100644 --- a/src/snapshot_middleware/toml.rs +++ b/src/snapshot_middleware/toml.rs @@ -105,11 +105,11 @@ mod test { ) .unwrap(); - let mut vfs = Vfs::new(imfs.clone()); + let vfs = Vfs::new(imfs.clone()); let instance_snapshot = snapshot_toml( &InstanceContext::default(), - &mut vfs, + &vfs, Path::new("/foo.toml"), "foo", ) diff --git a/src/snapshot_middleware/txt.rs b/src/snapshot_middleware/txt.rs index 9076f160..b748667e 100644 --- a/src/snapshot_middleware/txt.rs +++ b/src/snapshot_middleware/txt.rs @@ -50,11 +50,11 @@ mod test { imfs.load_snapshot("/foo.txt", VfsSnapshot::file("Hello there!")) .unwrap(); - let mut vfs = Vfs::new(imfs.clone()); + let vfs = Vfs::new(imfs.clone()); let instance_snapshot = snapshot_txt( &InstanceContext::default(), - &mut vfs, + &vfs, Path::new("/foo.txt"), "foo", ) diff --git a/src/web/interface.rs b/src/web/interface.rs index c10e14bc..365ef031 100644 --- a/src/web/interface.rs +++ b/src/web/interface.rs @@ -119,7 +119,7 @@ pub struct Instance<'a> { pub metadata: Option, } -impl<'a> Instance<'a> { +impl Instance<'_> { pub(crate) fn from_rojo_instance(source: InstanceWithMeta<'_>) -> Instance<'_> { let properties = source .properties() diff --git a/tests/rojo_test/serve_util.rs b/tests/rojo_test/serve_util.rs index 2c33e952..56061935 100644 --- a/tests/rojo_test/serve_util.rs +++ b/tests/rojo_test/serve_util.rs @@ -28,7 +28,7 @@ use crate::rojo_test::io_util::{ pub fn run_serve_test(test_name: &str, callback: impl FnOnce(TestServeSession, RedactionMap)) { let _ = env_logger::try_init(); - let mut redactions = RedactionMap::new(); + let mut redactions = RedactionMap::default(); let mut session = TestServeSession::new(test_name); let info = session.wait_to_come_online();