Detailed changes
@@ -25,11 +25,11 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
[[package]]
name = "ahash"
-version = "0.7.4"
+version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
dependencies = [
- "getrandom 0.2.2",
+ "getrandom 0.2.6",
"once_cell",
"version_check",
]
@@ -43,15 +43,6 @@ dependencies = [
"memchr",
]
-[[package]]
-name = "ansi_term"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
-dependencies = [
- "winapi 0.3.9",
-]
-
[[package]]
name = "ansi_term"
version = "0.12.1"
@@ -81,9 +72,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]]
name = "arrayvec"
-version = "0.7.1"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd"
+checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]]
name = "ascii"
@@ -124,9 +115,9 @@ dependencies = [
[[package]]
name = "async-compression"
-version = "0.3.12"
+version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2bf394cfbbe876f0ac67b13b6ca819f9c9f2fb9ec67223cceb1555fbab1c31a"
+checksum = "345fd392ab01f746c717b1357165b76f0b67a60192007b234058c9045fdcf695"
dependencies = [
"flate2",
"futures-core",
@@ -137,16 +128,16 @@ dependencies = [
[[package]]
name = "async-executor"
-version = "1.4.0"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146"
+checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965"
dependencies = [
"async-task",
"concurrent-queue",
"fastrand",
"futures-lite",
"once_cell",
- "vec-arena",
+ "slab",
]
[[package]]
@@ -162,42 +153,40 @@ dependencies = [
[[package]]
name = "async-io"
-version = "1.3.1"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd"
+checksum = "e5e18f61464ae81cde0a23e713ae8fd299580c54d697a35820cfd0625b8b0e07"
dependencies = [
"concurrent-queue",
- "fastrand",
"futures-lite",
"libc",
"log",
- "nb-connect",
"once_cell",
"parking",
"polling",
- "vec-arena",
+ "slab",
+ "socket2",
"waker-fn",
"winapi 0.3.9",
]
[[package]]
name = "async-lock"
-version = "2.4.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b"
+checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6"
dependencies = [
"event-listener",
]
[[package]]
name = "async-net"
-version = "1.5.0"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06de475c85affe184648202401d7622afb32f0f74e02192857d0201a16defbe5"
+checksum = "5373304df79b9b4395068fb080369ec7178608827306ce4d081cba51cac551df"
dependencies = [
"async-io",
"blocking",
- "fastrand",
"futures-lite",
]
@@ -212,15 +201,16 @@ dependencies = [
[[package]]
name = "async-process"
-version = "1.0.2"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef37b86e2fa961bae5a4d212708ea0154f904ce31d1a4a7f47e1bbc33a0c040b"
+checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c"
dependencies = [
"async-io",
"blocking",
"cfg-if 1.0.0",
"event-listener",
"futures-lite",
+ "libc",
"once_cell",
"signal-hook",
"winapi 0.3.9",
@@ -278,9 +268,9 @@ dependencies = [
[[package]]
name = "async-trait"
-version = "0.1.50"
+version = "0.1.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722"
+checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716"
dependencies = [
"proc-macro2",
"quote",
@@ -312,11 +302,11 @@ dependencies = [
[[package]]
name = "atomic"
-version = "0.5.0"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3410529e8288c463bedb5930f82833bc0c90e5d2fe639a56582a4d09220b281"
+checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c"
dependencies = [
- "autocfg 1.0.1",
+ "autocfg 1.1.0",
]
[[package]]
@@ -357,21 +347,24 @@ dependencies = [
[[package]]
name = "autocfg"
-version = "0.1.7"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
+checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
+dependencies = [
+ "autocfg 1.1.0",
+]
[[package]]
name = "autocfg"
-version = "1.0.1"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "axum"
-version = "0.5.4"
+version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4af7447fc1214c1f3a1ace861d0216a6c8bb13965b64bbad9650f375b67689a"
+checksum = "ab2504b827a8bef941ba3dd64bdffe9cf56ca182908a147edd6189c95fbcae7d"
dependencies = [
"async-trait",
"axum-core",
@@ -383,7 +376,7 @@ dependencies = [
"http",
"http-body",
"hyper",
- "itoa 1.0.1",
+ "itoa",
"matchit",
"memchr",
"mime",
@@ -404,9 +397,9 @@ dependencies = [
[[package]]
name = "axum-core"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bdc19781b16e32f8a7200368a336fa4509d4b72ef15dd4e41df5290855ee1e6"
+checksum = "da31c0ed7b4690e2c78fe4b880d21cd7db04a346ebc658b4270251b695437f17"
dependencies = [
"async-trait",
"bytes",
@@ -437,24 +430,24 @@ dependencies = [
[[package]]
name = "backtrace"
-version = "0.3.64"
+version = "0.3.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f"
+checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61"
dependencies = [
"addr2line",
"cc",
"cfg-if 1.0.0",
"libc",
- "miniz_oxide 0.4.4",
+ "miniz_oxide 0.5.3",
"object",
"rustc-demangle",
]
[[package]]
name = "base-x"
-version = "0.2.8"
+version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b"
+checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74"
[[package]]
name = "base64"
@@ -470,9 +463,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]]
name = "base64ct"
-version = "1.0.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0d27fb6b6f1e43147af148af49d49329413ba781aa0d5e10979831c210173b5"
+checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179"
[[package]]
name = "bincode"
@@ -492,7 +485,7 @@ dependencies = [
"bitflags",
"cexpr",
"clang-sys",
- "clap 2.33.3",
+ "clap 2.34.0",
"env_logger",
"lazy_static",
"lazycell",
@@ -512,18 +505,6 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-[[package]]
-name = "bitvec"
-version = "0.19.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321"
-dependencies = [
- "funty",
- "radium",
- "tap",
- "wyz",
-]
-
[[package]]
name = "block"
version = "0.1.6"
@@ -550,9 +531,9 @@ dependencies = [
[[package]]
name = "blocking"
-version = "1.0.2"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9"
+checksum = "c6ccb65d468978a086b69884437ded69a90faab3bbe6e67f242173ea728acccc"
dependencies = [
"async-channel",
"async-task",
@@ -579,36 +560,30 @@ dependencies = [
[[package]]
name = "bstr"
-version = "0.2.15"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d"
+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
dependencies = [
"memchr",
]
-[[package]]
-name = "build_const"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7"
-
[[package]]
name = "bumpalo"
-version = "3.7.0"
+version = "3.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631"
+checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3"
[[package]]
name = "bytemuck"
-version = "1.5.1"
+version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bed57e2090563b83ba8f83366628ce535a7584c9afa4c9fc0612a03925c6df58"
+checksum = "cdead85bdec19c194affaeeb670c0e41fe23de31459efd1c174d049269cf02cc"
[[package]]
name = "byteorder"
-version = "1.4.2"
+version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]]
name = "bytes"
@@ -629,9 +604,9 @@ dependencies = [
[[package]]
name = "cache-padded"
-version = "1.1.1"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
+checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
[[package]]
name = "castaway"
@@ -641,9 +616,9 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6"
[[package]]
name = "cc"
-version = "1.0.67"
+version = "1.0.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
dependencies = [
"jobserver",
]
@@ -654,7 +629,7 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [
- "nom 7.1.1",
+ "nom",
]
[[package]]
@@ -680,7 +655,7 @@ dependencies = [
"postage",
"settings",
"theme",
- "time 0.3.7",
+ "time 0.3.9",
"util",
"workspace",
]
@@ -694,7 +669,7 @@ dependencies = [
"libc",
"num-integer",
"num-traits",
- "time 0.1.44",
+ "time 0.1.43",
"winapi 0.3.9",
]
@@ -715,9 +690,9 @@ dependencies = [
[[package]]
name = "clang-sys"
-version = "1.1.1"
+version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f54d78e30b388d4815220c8dd03fea5656b6c6d32adb59e89061552a102f8da1"
+checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b"
dependencies = [
"glob",
"libc",
@@ -726,11 +701,11 @@ dependencies = [
[[package]]
name = "clap"
-version = "2.33.3"
+version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
- "ansi_term 0.11.0",
+ "ansi_term",
"atty",
"bitflags",
"strsim 0.8.0",
@@ -741,9 +716,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "3.1.12"
+version = "3.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c167e37342afc5f33fd87bbc870cedd020d2a6dffa05d45ccd9241fbdd146db"
+checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b"
dependencies = [
"atty",
"bitflags",
@@ -758,9 +733,9 @@ dependencies = [
[[package]]
name = "clap_derive"
-version = "3.1.7"
+version = "3.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1"
+checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c"
dependencies = [
"heck 0.4.0",
"proc-macro-error",
@@ -771,9 +746,9 @@ dependencies = [
[[package]]
name = "clap_lex"
-version = "0.1.1"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669"
+checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213"
dependencies = [
"os_str_bytes",
]
@@ -783,10 +758,10 @@ name = "cli"
version = "0.1.0"
dependencies = [
"anyhow",
- "clap 3.1.12",
+ "clap 3.1.18",
"core-foundation",
"core-services",
- "dirs 3.0.1",
+ "dirs 3.0.2",
"ipc-channel",
"plist",
"serde",
@@ -806,14 +781,14 @@ dependencies = [
"isahc",
"lazy_static",
"log",
- "parking_lot",
+ "parking_lot 0.11.2",
"postage",
- "rand 0.8.3",
+ "rand 0.8.5",
"rpc",
"smol",
"sum_tree",
"thiserror",
- "time 0.3.7",
+ "time 0.3.9",
"tiny_http",
"url",
"util",
@@ -828,9 +803,9 @@ dependencies = [
[[package]]
name = "cmake"
-version = "0.1.45"
+version = "0.1.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855"
+checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a"
dependencies = [
"cc",
]
@@ -874,7 +849,7 @@ dependencies = [
"axum",
"axum-extra",
"base64 0.13.0",
- "clap 3.1.12",
+ "clap 3.1.18",
"client",
"collections",
"ctor",
@@ -890,16 +865,16 @@ dependencies = [
"log",
"lsp",
"nanoid",
- "parking_lot",
+ "parking_lot 0.11.2",
"project",
- "rand 0.8.3",
+ "rand 0.8.5",
"reqwest",
"rpc",
"scrypt",
"serde",
"serde_json",
"settings",
- "sha-1 0.9.6",
+ "sha-1 0.9.8",
"sqlx",
"theme",
"time 0.2.27",
@@ -957,9 +932,9 @@ dependencies = [
[[package]]
name = "const_fn"
-version = "0.4.8"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7"
+checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935"
[[package]]
name = "contacts_panel"
@@ -1056,36 +1031,33 @@ dependencies = [
[[package]]
name = "cpufeatures"
-version = "0.1.4"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8"
+checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b"
dependencies = [
"libc",
]
[[package]]
-name = "cpufeatures"
-version = "0.2.1"
+name = "crc"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469"
+checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23"
dependencies = [
- "libc",
+ "crc-catalog",
]
[[package]]
-name = "crc"
-version = "1.8.1"
+name = "crc-catalog"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
-dependencies = [
- "build_const",
-]
+checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403"
[[package]]
name = "crc32fast"
-version = "1.2.1"
+version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
dependencies = [
"cfg-if 1.0.0",
]
@@ -1102,47 +1074,47 @@ dependencies = [
[[package]]
name = "crossbeam-channel"
-version = "0.5.0"
+version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
+checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53"
dependencies = [
"cfg-if 1.0.0",
- "crossbeam-utils 0.8.2",
+ "crossbeam-utils 0.8.8",
]
[[package]]
name = "crossbeam-deque"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
+checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
dependencies = [
"cfg-if 1.0.0",
"crossbeam-epoch",
- "crossbeam-utils 0.8.2",
+ "crossbeam-utils 0.8.8",
]
[[package]]
name = "crossbeam-epoch"
-version = "0.9.2"
+version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d60ab4a8dba064f2fbb5aa270c28da5cf4bbd0e72dae1140a6b0353a779dbe00"
+checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c"
dependencies = [
+ "autocfg 1.1.0",
"cfg-if 1.0.0",
- "crossbeam-utils 0.8.2",
+ "crossbeam-utils 0.8.8",
"lazy_static",
- "loom",
"memoffset",
"scopeguard",
]
[[package]]
name = "crossbeam-queue"
-version = "0.3.1"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f6cb3c7f5b8e51bc3ebb73a2327ad4abdbd119dc13223f14f961d2f38486756"
+checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2"
dependencies = [
"cfg-if 1.0.0",
- "crossbeam-utils 0.8.2",
+ "crossbeam-utils 0.8.8",
]
[[package]]
@@ -1151,21 +1123,19 @@ version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
dependencies = [
- "autocfg 1.0.1",
+ "autocfg 1.1.0",
"cfg-if 0.1.10",
"lazy_static",
]
[[package]]
name = "crossbeam-utils"
-version = "0.8.2"
+version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae8f328835f8f5a6ceb6a7842a7f2d0c03692adb5c889347235d59194731fe3"
+checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38"
dependencies = [
- "autocfg 1.0.1",
"cfg-if 1.0.0",
"lazy_static",
- "loom",
]
[[package]]
@@ -1180,19 +1150,9 @@ dependencies = [
[[package]]
name = "crypto-mac"
-version = "0.10.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6"
-dependencies = [
- "generic-array",
- "subtle",
-]
-
-[[package]]
-name = "crypto-mac"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e"
+checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
dependencies = [
"generic-array",
"subtle",
@@ -1200,9 +1160,9 @@ dependencies = [
[[package]]
name = "ctor"
-version = "0.1.20"
+version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d"
+checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c"
dependencies = [
"quote",
"syn",
@@ -1210,24 +1170,24 @@ dependencies = [
[[package]]
name = "curl"
-version = "0.4.42"
+version = "0.4.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7de97b894edd5b5bcceef8b78d7da9b75b1d2f2f9a910569d0bde3dd31d84939"
+checksum = "37d855aeef205b43f65a5001e0997d81f8efca7badad4fad7d897aa7f0d0651f"
dependencies = [
"curl-sys",
"libc",
"openssl-probe",
"openssl-sys",
"schannel",
- "socket2 0.4.0",
+ "socket2",
"winapi 0.3.9",
]
[[package]]
name = "curl-sys"
-version = "0.4.52+curl-7.81.0"
+version = "0.4.55+curl-7.83.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14b8c2d1023ea5fded5b7b892e4b8e95f70038a421126a056761a84246a28971"
+checksum = "23734ec77368ec583c2e61dd3f0b0e5c98b93abe6d2a004ca06b91dd7e3e2762"
dependencies = [
"cc",
"libc",
@@ -1241,9 +1201,9 @@ dependencies = [
[[package]]
name = "data-url"
-version = "0.1.0"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d33fe99ccedd6e84bc035f1931bb2e6be79739d6242bd895e7311c886c50dc9c"
+checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193"
dependencies = [
"matches",
]
@@ -1266,7 +1226,7 @@ checksum = "47003dc9f6368a88e85956c3b2573a7e6872746a3e5d762a8885da3a136a0381"
dependencies = [
"backtrace",
"lazy_static",
- "parking_lot",
+ "parking_lot 0.11.2",
"rustc-hash",
"serde",
"serde_json",
@@ -1311,13 +1271,14 @@ checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506"
dependencies = [
"block-buffer 0.10.2",
"crypto-common",
+ "subtle",
]
[[package]]
name = "dirs"
-version = "3.0.1"
+version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff"
+checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309"
dependencies = [
"dirs-sys",
]
@@ -1343,9 +1304,9 @@ dependencies = [
[[package]]
name = "dirs-sys"
-version = "0.3.6"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
dependencies = [
"libc",
"redox_users",
@@ -1389,15 +1350,15 @@ dependencies = [
[[package]]
name = "dyn-clone"
-version = "1.0.4"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf"
+checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28"
[[package]]
name = "easy-parallel"
-version = "3.1.0"
+version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd4afd79212583ff429b913ad6605242ed7eec277e950b1438f300748f948f4"
+checksum = "6907e25393cdcc1f4f3f513d9aac1e840eb1cc341a0fccb01171f7d14d10b946"
[[package]]
name = "editor"
@@ -1419,10 +1380,10 @@ dependencies = [
"log",
"lsp",
"ordered-float",
- "parking_lot",
+ "parking_lot 0.11.2",
"postage",
"project",
- "rand 0.8.3",
+ "rand 0.8.5",
"rpc",
"serde",
"settings",
@@ -1447,9 +1408,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
[[package]]
name = "encoding_rs"
-version = "0.8.28"
+version = "0.8.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065"
+checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b"
dependencies = [
"cfg-if 1.0.0",
]
@@ -1487,9 +1448,9 @@ dependencies = [
[[package]]
name = "etagere"
-version = "0.2.4"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "520d7de540904fd09b11c03a47d50a7ce4ff37d1aa763f454fa60d9088ef8356"
+checksum = "6301151a318f367f392c31395beb1cfba5ccd9abc44d1db0db3a4b27b9601c89"
dependencies = [
"euclid",
"svg_fmt",
@@ -1497,18 +1458,18 @@ dependencies = [
[[package]]
name = "euclid"
-version = "0.22.2"
+version = "0.22.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51e5bac4ec41ece6346fd867815a57a221abdf48f4eb931b033789b5b4b6fc70"
+checksum = "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade"
dependencies = [
"num-traits",
]
[[package]]
name = "event-listener"
-version = "2.5.1"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59"
+checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71"
[[package]]
name = "expat-sys"
@@ -1557,14 +1518,12 @@ checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e"
[[package]]
name = "flate2"
-version = "1.0.20"
+version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0"
+checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6"
dependencies = [
- "cfg-if 1.0.0",
"crc32fast",
- "libc",
- "miniz_oxide 0.4.4",
+ "miniz_oxide 0.5.3",
]
[[package]]
@@ -1611,13 +1570,13 @@ dependencies = [
[[package]]
name = "fontdb"
-version = "0.5.1"
+version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "428948a0f39fb83fe55991d4423e35a793cdbb0322ebe23853f6024124a330d7"
+checksum = "e58903f4f8d5b58c7d300908e4ebe5289c1bfdf5587964330f12023b8ff17fd1"
dependencies = [
"log",
- "memmap2 0.1.0",
- "ttf-parser 0.9.0",
+ "memmap2",
+ "ttf-parser 0.12.3",
]
[[package]]
@@ -1672,15 +1631,15 @@ version = "2.0.2"
dependencies = [
"bitflags",
"fsevent-sys",
- "parking_lot",
+ "parking_lot 0.11.2",
"tempdir",
]
[[package]]
name = "fsevent-sys"
-version = "3.0.2"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a29c77f1ca394c3e73a9a5d24cfcabb734682d9634fc398f2204a63c994120"
+checksum = "ca6f5e6817058771c10f0eb0f05ddf1e35844266f972004fe8e4b21fda295bd5"
dependencies = [
"libc",
]
@@ -1707,17 +1666,11 @@ version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
-[[package]]
-name = "funty"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7"
-
[[package]]
name = "futures"
-version = "0.3.12"
+version = "0.3.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da9052a1a50244d8d5aa9bf55cbc2fb6f357c86cc52e46c62ed390a7180cf150"
+checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e"
dependencies = [
"futures-channel",
"futures-core",
@@ -1746,15 +1699,26 @@ checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3"
[[package]]
name = "futures-executor"
-version = "0.3.12"
+version = "0.3.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9e59fdc009a4b3096bf94f740a0f2424c082521f20a9b08c5c07c48d90fd9b9"
+checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6"
dependencies = [
"futures-core",
"futures-task",
"futures-util",
]
+[[package]]
+name = "futures-intrusive"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e"
+dependencies = [
+ "futures-core",
+ "lock_api",
+ "parking_lot 0.11.2",
+]
+
[[package]]
name = "futures-io"
version = "0.3.21"
@@ -1825,24 +1789,11 @@ dependencies = [
"util",
]
-[[package]]
-name = "generator"
-version = "0.6.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cdc09201b2e8ca1b19290cf7e65de2246b8e91fb6874279722189c4de7b94dc"
-dependencies = [
- "cc",
- "libc",
- "log",
- "rustc_version",
- "winapi 0.3.9",
-]
-
[[package]]
name = "generic-array"
-version = "0.14.4"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
+checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803"
dependencies = [
"typenum",
"version_check",
@@ -99,6 +99,7 @@
"context": "Editor && vim_operator == g",
"bindings": {
"g": "vim::StartOfDocument",
+ "h": "editor::Hover",
"escape": [
"vim::SwitchMode",
"Normal"
@@ -25,9 +25,9 @@ use gpui::{
geometry::vector::{vec2f, Vector2F},
impl_actions, impl_internal_actions,
platform::CursorStyle,
- text_layout, AppContext, AsyncAppContext, Axis, ClipboardItem, Element, ElementBox, Entity,
- ModelHandle, MutableAppContext, RenderContext, Task, View, ViewContext, ViewHandle,
- WeakViewHandle,
+ text_layout, AppContext, AsyncAppContext, Axis, ClipboardItem, Element, ElementBox,
+ ElementStateContext, Entity, ModelHandle, MutableAppContext, ReadModel, RenderContext, Task,
+ View, ViewContext, ViewHandle, WeakViewHandle,
};
pub use language::{char_kind, CharKind};
use language::{
@@ -81,7 +81,7 @@ pub struct Scroll(pub Vector2F);
pub struct Select(pub SelectPhase);
#[derive(Clone)]
-pub struct Hover {
+pub struct HoverAt {
point: Option<DisplayPoint>,
}
@@ -198,6 +198,7 @@ actions!(
ShowCompletions,
OpenExcerpts,
RestartLanguageServer,
+ Hover,
]
);
@@ -214,7 +215,7 @@ impl_actions!(
]
);
-impl_internal_actions!(editor, [Scroll, Select, Hover, GoToDefinitionAt]);
+impl_internal_actions!(editor, [Scroll, Select, HoverAt, GoToDefinitionAt]);
enum DocumentHighlightRead {}
enum DocumentHighlightWrite {}
@@ -302,6 +303,7 @@ pub fn init(cx: &mut MutableAppContext) {
cx.add_action(Editor::show_completions);
cx.add_action(Editor::toggle_code_actions);
cx.add_action(Editor::hover);
+ cx.add_action(Editor::hover_at);
cx.add_action(Editor::open_excerpts);
cx.add_action(Editor::restart_language_server);
cx.add_async_action(Editor::confirm_completion);
@@ -888,48 +890,64 @@ impl CodeActionsMenu {
}
}
-struct HoverPopover {
+#[derive(Clone)]
+pub(crate) struct HoverPopover {
+ pub project: ModelHandle<Project>,
+ pub hover_point: DisplayPoint,
pub range: Range<DisplayPoint>,
pub contents: Vec<HoverBlock>,
}
impl HoverPopover {
- fn render(&self, style: EditorStyle, project: &Project) -> (DisplayPoint, ElementBox) {
- let mut flex = Flex::new(Axis::Vertical);
- flex.extend(self.contents.iter().map(|content| {
- if let Some(language) = content
- .language
- .clone()
- .and_then(|language| project.languages().get_language(&language))
- {
- let runs =
- language.highlight_text(&content.text.as_str().into(), 0..content.text.len());
-
- Text::new(content.text.clone(), style.text.clone())
- .with_soft_wrap(true)
- .with_highlights(
- runs.iter()
- .filter_map(|(range, id)| {
- id.style(style.theme.syntax.as_ref())
- .map(|style| (range.clone(), style))
- })
- .collect(),
- )
- .boxed()
- } else {
- Text::new(content.text.clone(), style.hover_popover.prose.clone())
- .with_soft_wrap(true)
- .contained()
- .with_style(style.hover_popover.block_style)
- .boxed()
- }
- }));
- (
- self.range.start,
+ fn render<C: ElementStateContext + ReadModel>(
+ &self,
+ style: EditorStyle,
+ cx: &mut C,
+ ) -> (DisplayPoint, ElementBox) {
+ let element = MouseEventHandler::new::<HoverPopover, _, _>(0, cx, |_, cx| {
+ let mut flex = Flex::new(Axis::Vertical).scrollable::<HoverBlock, _>(1, None, cx);
+ flex.extend(self.contents.iter().map(|content| {
+ let project = self.project.read(cx);
+ if let Some(language) = content
+ .language
+ .clone()
+ .and_then(|language| project.languages().get_language(&language))
+ {
+ let runs = language
+ .highlight_text(&content.text.as_str().into(), 0..content.text.len());
+
+ Text::new(content.text.clone(), style.text.clone())
+ .with_soft_wrap(true)
+ .with_highlights(
+ runs.iter()
+ .filter_map(|(range, id)| {
+ id.style(style.theme.syntax.as_ref())
+ .map(|style| (range.clone(), style))
+ })
+ .collect(),
+ )
+ .boxed()
+ } else {
+ Text::new(content.text.clone(), style.hover_popover.prose.clone())
+ .with_soft_wrap(true)
+ .contained()
+ .with_style(style.hover_popover.block_style)
+ .boxed()
+ }
+ }));
flex.contained()
.with_style(style.hover_popover.container)
- .boxed(),
- )
+ .boxed()
+ })
+ .with_cursor_style(CursorStyle::Arrow)
+ .with_padding(Padding {
+ bottom: 5.,
+ top: 5.,
+ ..Default::default()
+ })
+ .boxed();
+
+ (self.range.start, element)
}
}
@@ -1489,7 +1507,7 @@ impl Editor {
}
}
- self.hover_state.close();
+ self.hide_hover(cx);
if old_cursor_position.to_display_point(&display_map).row()
!= new_cursor_position.to_display_point(&display_map).row()
@@ -1852,6 +1870,10 @@ impl Editor {
return;
}
+ if self.hide_hover(cx) {
+ return;
+ }
+
if self.hide_context_menu(cx).is_some() {
return;
}
@@ -2480,49 +2502,65 @@ impl Editor {
}))
}
- /// The hover action dispatches between `show_hover` or `hide_hover`
+ /// Bindable action which uses the most recent selection head to trigger a hover
+ fn hover(&mut self, _: &Hover, cx: &mut ViewContext<Self>) {
+ let head = self.selections.newest_display(cx).head();
+ self.show_hover(head, true, cx);
+ }
+
+ /// The internal hover action dispatches between `show_hover` or `hide_hover`
/// depending on whether a point to hover over is provided.
- fn hover(&mut self, action: &Hover, cx: &mut ViewContext<Self>) {
+ fn hover_at(&mut self, action: &HoverAt, cx: &mut ViewContext<Self>) {
if let Some(point) = action.point {
- self.show_hover(point, cx);
+ self.show_hover(point, false, cx);
} else {
self.hide_hover(cx);
}
}
- /// Hides the type information popup ASAP.
- /// Triggered by the `Hover` action when the cursor is not over a symbol.
- fn hide_hover(&mut self, cx: &mut ViewContext<Self>) {
- let task = cx.spawn_weak(|this, mut cx| {
- async move {
- if let Some(this) = this.upgrade(&cx) {
- this.update(&mut cx, |this, cx| {
- // consistently keep track of state to make handoff smooth
- let (_recent_hover, _in_grace) = this.hover_state.determine_state(false);
+ /// Hides the type information popup.
+ /// Triggered by the `Hover` action when the cursor is not over a symbol or when the
+ /// selecitons changed.
+ fn hide_hover(&mut self, cx: &mut ViewContext<Self>) -> bool {
+ // consistently keep track of state to make handoff smooth
+ self.hover_state.determine_state(false);
- // only notify the context once
- if this.hover_state.popover.is_some() {
- this.hover_state.popover = None;
- cx.notify();
- }
- });
- }
- Ok(())
- }
- .log_err()
- });
+ let mut did_hide = false;
- self.hover_task = Some(task);
+ // only notify the context once
+ if self.hover_state.popover.is_some() {
+ self.hover_state.popover = None;
+ did_hide = true;
+ cx.notify();
+ }
+
+ self.clear_background_highlights::<HoverState>(cx);
+
+ self.hover_task = None;
+
+ did_hide
}
/// Queries the LSP and shows type info and documentation
/// about the symbol the mouse is currently hovering over.
/// Triggered by the `Hover` action when the cursor may be over a symbol.
- fn show_hover(&mut self, point: DisplayPoint, cx: &mut ViewContext<Self>) {
+ fn show_hover(
+ &mut self,
+ point: DisplayPoint,
+ ignore_timeout: bool,
+ cx: &mut ViewContext<Self>,
+ ) {
if self.pending_rename.is_some() {
return;
}
+ if let Some(hover) = &self.hover_state.popover {
+ if hover.hover_point == point {
+ // Hover triggered from same location as last time. Don't show again.
+ return;
+ }
+ }
+
let snapshot = self.snapshot(cx);
let (buffer, buffer_position) = if let Some(output) = self
.buffer
@@ -2534,15 +2572,6 @@ impl Editor {
return;
};
- let buffer_snapshot = buffer.read(cx).snapshot();
-
- if let Some(existing_popover) = &self.hover_state.popover {
- if existing_popover.range.contains(&point) {
- // Hover already contains value. No need to request a new one
- return;
- }
- }
-
let project = if let Some(project) = self.project.clone() {
project
} else {
@@ -2550,49 +2579,44 @@ impl Editor {
};
// query the LSP for hover info
- let hover = project.update(cx, |project, cx| {
+ let hover_request = project.update(cx, |project, cx| {
project.hover(&buffer, buffer_position.clone(), cx)
});
+ let buffer_snapshot = buffer.read(cx).snapshot();
+
let task = cx.spawn_weak(|this, mut cx| {
async move {
- let mut contents = None;
-
- let hover = match hover.await {
- Ok(hover) => hover,
- Err(_) => None,
- };
+ // Construct new hover popover from hover request
+ let hover_popover = hover_request.await.ok().flatten().and_then(|hover_result| {
+ if hover_result.contents.is_empty() {
+ return None;
+ }
- let mut symbol_range = point..point;
+ let range = if let Some(range) = hover_result.range {
+ let offset_range = range.to_offset(&buffer_snapshot);
+ if !offset_range
+ .contains(&point.to_offset(&snapshot.display_snapshot, Bias::Left))
+ {
+ return None;
+ }
- // determine the contents of the popover
- if let Some(hover) = hover {
- if hover.contents.is_empty() {
- contents = None;
+ offset_range
+ .start
+ .to_display_point(&snapshot.display_snapshot)
+ ..offset_range
+ .end
+ .to_display_point(&snapshot.display_snapshot)
} else {
- contents = Some(hover.contents);
-
- if let Some(range) = hover.range {
- let offset_range = range.to_offset(&buffer_snapshot);
- if offset_range
- .contains(&point.to_offset(&snapshot.display_snapshot, Bias::Left))
- {
- symbol_range = offset_range
- .start
- .to_display_point(&snapshot.display_snapshot)
- ..offset_range
- .end
- .to_display_point(&snapshot.display_snapshot);
- } else {
- contents = None;
- }
- }
- }
- };
+ point..point
+ };
- let hover_popover = contents.map(|contents| HoverPopover {
- range: symbol_range,
- contents,
+ Some(HoverPopover {
+ project: project.clone(),
+ hover_point: point,
+ range,
+ contents: hover_result.contents,
+ })
});
if let Some(this) = this.upgrade(&cx) {
@@ -2612,7 +2636,32 @@ impl Editor {
// `smooth_handoff` and `in_grace` determine whether to switch right away.
// `recent_hover` will activate the handoff after the initial delay.
- if (smooth_handoff || !recent_hover || in_grace) && visible {
+ // `ignore_timeout` is set when the user manually sent the hover action.
+ if (ignore_timeout || smooth_handoff || !recent_hover || in_grace)
+ && visible
+ {
+ // Highlight the selected symbol using a background highlight
+ if let Some(display_range) =
+ hover_popover.as_ref().map(|popover| popover.range.clone())
+ {
+ let start = snapshot.display_snapshot.buffer_snapshot.anchor_after(
+ display_range
+ .start
+ .to_offset(&snapshot.display_snapshot, Bias::Right),
+ );
+ let end = snapshot.display_snapshot.buffer_snapshot.anchor_before(
+ display_range
+ .end
+ .to_offset(&snapshot.display_snapshot, Bias::Left),
+ );
+
+ this.highlight_background::<HoverState>(
+ vec![start..end],
+ |theme| theme.editor.hover_popover.highlight,
+ cx,
+ );
+ }
+
this.hover_state.popover = hover_popover;
cx.notify();
}
@@ -2869,18 +2918,11 @@ impl Editor {
) -> Option<(DisplayPoint, ElementBox)> {
self.context_menu
.as_ref()
- .map(|menu| menu.render(cursor_position, style))
+ .map(|menu| menu.render(cursor_position, style, cx))
}
- pub fn render_hover_popover(
- &self,
- style: EditorStyle,
- project: &Project,
- ) -> Option<(DisplayPoint, ElementBox)> {
- self.hover_state
- .popover
- .as_ref()
- .map(|hover| hover.render(style, project))
+ pub(crate) fn hover_popover(&self) -> Option<HoverPopover> {
+ self.hover_state.popover.clone()
}
fn show_context_menu(&mut self, menu: ContextMenu, cx: &mut ViewContext<Self>) {
@@ -4963,7 +5005,6 @@ impl Editor {
// Position the selection in the rename editor so that it matches the current selection.
this.show_local_selections = false;
let rename_editor = cx.add_view(|cx| {
- println!("Rename editor created.");
let mut editor = Editor::single_line(None, cx);
if let Some(old_highlight_id) = old_highlight_id {
editor.override_text_style =
@@ -5,7 +5,7 @@ use super::{
};
use crate::{
display_map::{DisplaySnapshot, TransformBlock},
- EditorStyle, GoToDefinition, Hover,
+ EditorStyle, GoToDefinition, HoverAt,
};
use clock::ReplicaId;
use collections::{BTreeMap, HashMap};
@@ -509,36 +509,31 @@ impl EditorElement {
}
if let Some((position, hover_popover)) = layout.hover.as_mut() {
- if position.row() >= start_row {
- if let Some(cursor_row_layout) = &layout
- .line_layouts
- .get((position.row() - start_row) as usize)
- {
- cx.scene.push_stacking_context(None);
-
- let size = hover_popover.size();
- let x = cursor_row_layout.x_for_index(position.column() as usize) - scroll_left;
- let y = position.row() as f32 * layout.line_height - scroll_top - size.y();
- let mut popover_origin = content_origin + vec2f(x, y);
-
- if popover_origin.y() < 0.0 {
- popover_origin.set_y(popover_origin.y() + layout.line_height + size.y());
- }
+ cx.scene.push_stacking_context(None);
- let x_out_of_bounds = bounds.max_x() - (popover_origin.x() + size.x());
- if x_out_of_bounds < 0.0 {
- popover_origin.set_x(popover_origin.x() + x_out_of_bounds);
- }
+ // This is safe because we check on layout whether the required row is available
+ let hovered_row_layout = &layout.line_layouts[(position.row() - start_row) as usize];
+ let size = hover_popover.size();
+ let x = hovered_row_layout.x_for_index(position.column() as usize) - scroll_left;
+ let y = position.row() as f32 * layout.line_height - scroll_top - size.y();
+ let mut popover_origin = content_origin + vec2f(x, y);
- hover_popover.paint(
- popover_origin,
- RectF::from_points(Vector2F::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor
- cx,
- );
+ if popover_origin.y() < 0.0 {
+ popover_origin.set_y(popover_origin.y() + layout.line_height + size.y());
+ }
- cx.scene.pop_stacking_context();
- }
+ let x_out_of_bounds = bounds.max_x() - (popover_origin.x() + size.x());
+ if x_out_of_bounds < 0.0 {
+ popover_origin.set_x(popover_origin.x() + x_out_of_bounds);
}
+
+ hover_popover.paint(
+ popover_origin,
+ RectF::from_points(Vector2F::zero(), vec2f(f32::MAX, f32::MAX)), // Let content bleed outside of editor
+ cx,
+ );
+
+ cx.scene.pop_stacking_context();
}
cx.scene.pop_layer();
@@ -1114,7 +1109,6 @@ impl Element for EditorElement {
let mut context_menu = None;
let mut code_actions_indicator = None;
- let mut hover = None;
cx.render(&self.view.upgrade(cx).unwrap(), |view, cx| {
let newest_selection_head = view
.selections
@@ -1125,18 +1119,14 @@ impl Element for EditorElement {
let style = view.style(cx);
if (start_row..end_row).contains(&newest_selection_head.row()) {
if view.context_menu_visible() {
- context_menu = view.render_context_menu(newest_selection_head, style.clone());
+ context_menu =
+ view.render_context_menu(newest_selection_head, style.clone(), cx);
}
code_actions_indicator = view
.render_code_actions_indicator(&style, cx)
.map(|indicator| (newest_selection_head.row(), indicator));
}
-
- if let Some(project) = view.project.clone() {
- let project = project.read(cx);
- hover = view.render_hover_popover(style, project);
- }
});
if let Some((_, context_menu)) = context_menu.as_mut() {
@@ -1159,18 +1149,27 @@ impl Element for EditorElement {
);
}
- if let Some((_, hover)) = hover.as_mut() {
- hover.layout(
- SizeConstraint {
- min: Vector2F::zero(),
- max: vec2f(
- (120. * em_width).min(size.x()),
- (size.y() - line_height) * 3. / 2.,
- ),
- },
- cx,
- );
- }
+ let hover = self.view(cx).hover_popover().and_then(|hover| {
+ let (point, mut rendered) = hover.render(style.clone(), cx);
+
+ if point.row() >= snapshot.scroll_position().y() as u32 {
+ if line_layouts.len() > (point.row() - start_row) as usize {
+ rendered.layout(
+ SizeConstraint {
+ min: Vector2F::zero(),
+ max: vec2f(
+ (120. * em_width).min(size.x()),
+ (size.y() - line_height) * 1. / 2.,
+ ),
+ },
+ cx,
+ );
+ return Some((point, rendered));
+ }
+ }
+
+ None
+ });
let blocks = self.layout_blocks(
start_row..end_row,
@@ -1270,6 +1269,12 @@ impl Element for EditorElement {
}
}
+ if let Some((_, hover)) = &mut layout.hover {
+ if hover.dispatch_event(event, cx) {
+ return true;
+ }
+ }
+
for (_, block) in &mut layout.blocks {
if block.dispatch_event(event, cx) {
return true;
@@ -1317,7 +1322,7 @@ impl Element for EditorElement {
None
};
- cx.dispatch_action(Hover { point });
+ cx.dispatch_action(HoverAt { point });
true
}
_ => false,
@@ -195,6 +195,14 @@ impl SelectionsCollection {
resolve(self.newest_anchor(), &self.buffer(cx))
}
+ pub fn newest_display(&self, cx: &mut MutableAppContext) -> Selection<DisplayPoint> {
+ let display_map = self.display_map(cx);
+ let selection = self
+ .newest_anchor()
+ .map(|point| point.to_display_point(&display_map));
+ selection
+ }
+
pub fn oldest_anchor(&self) -> &Selection<Anchor> {
self.disjoint
.iter()
@@ -319,6 +319,17 @@ impl Element for Flex {
}
}
}
+
+ if !handled {
+ if let &Event::MouseMoved { position, .. } = event {
+ // If this is a scrollable flex, and the mouse is over it, eat the scroll event to prevent
+ // propogating it to the element below.
+ if self.scroll_state.is_some() && bounds.contains_point(position) {
+ handled = true;
+ }
+ }
+ }
+
handled
}
@@ -160,7 +160,12 @@ impl Presenter {
if cx.window_is_active(self.window_id) {
if let Some(event) = self.last_mouse_moved_event.clone() {
- self.dispatch_event(event, cx)
+ let mut invalidated_views = Vec::new();
+ self.handle_hover_events(&event, &mut invalidated_views, cx);
+
+ for view_id in invalidated_views {
+ cx.notify_view(self.window_id, view_id);
+ }
}
}
} else {
@@ -222,8 +227,6 @@ impl Presenter {
pub fn dispatch_event(&mut self, event: Event, cx: &mut MutableAppContext) {
if let Some(root_view_id) = cx.root_view_id(self.window_id) {
let mut invalidated_views = Vec::new();
- let mut hovered_regions = Vec::new();
- let mut unhovered_regions = Vec::new();
let mut mouse_down_out_handlers = Vec::new();
let mut mouse_down_region = None;
let mut clicked_region = None;
@@ -288,46 +291,8 @@ impl Presenter {
}
}
}
- Event::MouseMoved {
- position,
- left_mouse_down,
- } => {
+ Event::MouseMoved { .. } => {
self.last_mouse_moved_event = Some(event.clone());
-
- if !left_mouse_down {
- let mut style_to_assign = CursorStyle::Arrow;
- for region in self.cursor_regions.iter().rev() {
- if region.bounds.contains_point(position) {
- style_to_assign = region.style;
- break;
- }
- }
- cx.platform().set_cursor_style(style_to_assign);
-
- let mut hover_depth = None;
- for (region, depth) in self.mouse_regions.iter().rev() {
- if region.bounds.contains_point(position)
- && hover_depth.map_or(true, |hover_depth| hover_depth == *depth)
- {
- hover_depth = Some(*depth);
- if let Some(region_id) = region.id() {
- if !self.hovered_region_ids.contains(®ion_id) {
- invalidated_views.push(region.view_id);
- hovered_regions.push((region.clone(), position));
- self.hovered_region_ids.insert(region_id);
- }
- }
- } else {
- if let Some(region_id) = region.id() {
- if self.hovered_region_ids.contains(®ion_id) {
- invalidated_views.push(region.view_id);
- unhovered_regions.push((region.clone(), position));
- self.hovered_region_ids.remove(®ion_id);
- }
- }
- }
- }
- }
}
Event::LeftMouseDragged { position } => {
if let Some((clicked_region, prev_drag_position)) = self
@@ -348,25 +313,8 @@ impl Presenter {
_ => {}
}
- let mut event_cx = self.build_event_context(cx);
- let mut handled = false;
- for (unhovered_region, position) in unhovered_regions {
- handled = true;
- if let Some(hover_callback) = unhovered_region.hover {
- event_cx.with_current_view(unhovered_region.view_id, |event_cx| {
- hover_callback(position, false, event_cx);
- })
- }
- }
-
- for (hovered_region, position) in hovered_regions {
- handled = true;
- if let Some(hover_callback) = hovered_region.hover {
- event_cx.with_current_view(hovered_region.view_id, |event_cx| {
- hover_callback(position, true, event_cx);
- })
- }
- }
+ let (mut handled, mut event_cx) =
+ self.handle_hover_events(&event, &mut invalidated_views, cx);
for (handler, view_id, position) in mouse_down_out_handlers {
event_cx.with_current_view(view_id, |event_cx| handler(position, event_cx))
@@ -439,6 +387,80 @@ impl Presenter {
}
}
+ fn handle_hover_events<'a>(
+ &'a mut self,
+ event: &Event,
+ invalidated_views: &mut Vec<usize>,
+ cx: &'a mut MutableAppContext,
+ ) -> (bool, EventContext<'a>) {
+ let mut unhovered_regions = Vec::new();
+ let mut hovered_regions = Vec::new();
+
+ if let Event::MouseMoved {
+ position,
+ left_mouse_down,
+ } = event
+ {
+ if !left_mouse_down {
+ let mut style_to_assign = CursorStyle::Arrow;
+ for region in self.cursor_regions.iter().rev() {
+ if region.bounds.contains_point(*position) {
+ style_to_assign = region.style;
+ break;
+ }
+ }
+ cx.platform().set_cursor_style(style_to_assign);
+
+ let mut hover_depth = None;
+ for (region, depth) in self.mouse_regions.iter().rev() {
+ if region.bounds.contains_point(*position)
+ && hover_depth.map_or(true, |hover_depth| hover_depth == *depth)
+ {
+ hover_depth = Some(*depth);
+ if let Some(region_id) = region.id() {
+ if !self.hovered_region_ids.contains(®ion_id) {
+ invalidated_views.push(region.view_id);
+ hovered_regions.push((region.clone(), position));
+ self.hovered_region_ids.insert(region_id);
+ }
+ }
+ } else {
+ if let Some(region_id) = region.id() {
+ if self.hovered_region_ids.contains(®ion_id) {
+ invalidated_views.push(region.view_id);
+ unhovered_regions.push((region.clone(), position));
+ self.hovered_region_ids.remove(®ion_id);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ let mut event_cx = self.build_event_context(cx);
+ let mut handled = false;
+
+ for (unhovered_region, position) in unhovered_regions {
+ handled = true;
+ if let Some(hover_callback) = unhovered_region.hover {
+ event_cx.with_current_view(unhovered_region.view_id, |event_cx| {
+ hover_callback(*position, false, event_cx);
+ })
+ }
+ }
+
+ for (hovered_region, position) in hovered_regions {
+ handled = true;
+ if let Some(hover_callback) = hovered_region.hover {
+ event_cx.with_current_view(hovered_region.view_id, |event_cx| {
+ hover_callback(*position, true, event_cx);
+ })
+ }
+ }
+
+ (handled, event_cx)
+ }
+
pub fn build_event_context<'a>(
&'a mut self,
cx: &'a mut MutableAppContext,
@@ -984,6 +984,7 @@ impl LspCommand for GetHover {
_: ModelHandle<Buffer>,
_: AsyncAppContext,
) -> Result<Self::Response> {
+ println!("Response from proto");
let range = if let (Some(start), Some(end)) = (message.start, message.end) {
language::proto::deserialize_anchor(start)
.and_then(|start| language::proto::deserialize_anchor(end).map(|end| start..end))
@@ -219,7 +219,7 @@ pub struct Symbol {
pub signature: [u8; 32],
}
-#[derive(Debug)]
+#[derive(Clone, Debug)]
pub struct HoverBlock {
pub text: String,
pub language: Option<String>,
@@ -2926,7 +2926,6 @@ impl Project {
position: T,
cx: &mut ModelContext<Self>,
) -> Task<Result<Option<Hover>>> {
- // TODO: proper return type
let position = position.to_point_utf16(buffer.read(cx));
self.request_lsp(buffer.clone(), GetHover { position }, cx)
}
@@ -3767,8 +3766,10 @@ impl Project {
} else if let Some(project_id) = self.remote_id() {
let rpc = self.client.clone();
let message = request.to_proto(project_id, buffer);
+ dbg!(&message);
return cx.spawn(|this, cx| async move {
let response = rpc.request(message).await?;
+ dbg!(&response);
request
.response_from_proto(response, this, buffer_handle, cx)
.await
@@ -629,4 +629,5 @@ pub struct HoverPopover {
pub container: ContainerStyle,
pub block_style: ContainerStyle,
pub prose: TextStyle,
+ pub highlight: Color,
}
@@ -21,6 +21,7 @@ export default function HoverPopover(theme: Theme) {
block_style: {
padding: { top: 4 },
},
- prose: text(theme, "sans", "primary", { "size": "sm" })
+ prose: text(theme, "sans", "primary", { "size": "sm" }),
+ highlight: theme.editor.highlight.occurrence.value,
}
}