Compare commits

..

7 commits

Author SHA1 Message Date
Gered 836a07ad6e try to improve the amount of times where multiline completions are given
this may yet backfire, but as of yet it's not at all clear to me what
that big blob of code i commented out was really trying to accomplish.
in my own testing, it seemed to only result in disappointing single-
line completions only when i would've expected multi-line completions.

and so far in my limited testing, this seems to work fine ...?
2024-11-10 19:27:09 -05:00
Gered 8cde5ce43f upgrade ollama backend support to use the chat completions api 2024-11-10 18:52:20 -05:00
Gered 29cec6445c add missing string -> LanguageId conversions
forgot to add "php" before.

also add extra variations for existing Bash and Yaml language types
2024-11-10 12:52:12 -05:00
Gered 880a729f48 add cmake, dockerfile, php, toml and yaml tree-sitter support 2024-11-10 12:50:50 -05:00
Gered 25b4794d3e update tree-sitter dependencies
removed tree-sitter-kotlin and tree-sitter-objc as there doesn't seem
to be versions of these compatible with the latest tree-sitter
2024-11-09 17:47:22 -05:00
Gered 9748c0fd60 pass api_token option to ollama backend 2024-11-03 17:56:39 -05:00
Gered 5abb3c86b4 add rust-toolchain.toml to set rust 1.79.0 to fix build issues
there are some dependency updates necessary to use 1.80+, but i'm not
really interested in fixes these problems myself, so i'll just sidestep
that problem with this
2024-11-03 17:14:10 -05:00
7 changed files with 278 additions and 206 deletions

229
Cargo.lock generated
View file

@ -264,12 +264,13 @@ dependencies = [
[[package]]
name = "cc"
version = "1.0.83"
version = "1.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf"
dependencies = [
"jobserver",
"libc",
"shlex",
]
[[package]]
@ -946,9 +947,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]]
name = "jobserver"
version = "0.1.27"
version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
dependencies = [
"libc",
]
@ -1002,7 +1003,9 @@ dependencies = [
"tree-sitter-bash",
"tree-sitter-c",
"tree-sitter-c-sharp",
"tree-sitter-cmake",
"tree-sitter-cpp",
"tree-sitter-dockerfile",
"tree-sitter-elixir",
"tree-sitter-erlang",
"tree-sitter-go",
@ -1010,17 +1013,18 @@ dependencies = [
"tree-sitter-java",
"tree-sitter-javascript",
"tree-sitter-json",
"tree-sitter-kotlin",
"tree-sitter-lua",
"tree-sitter-md",
"tree-sitter-objc",
"tree-sitter-php",
"tree-sitter-python",
"tree-sitter-r",
"tree-sitter-ruby",
"tree-sitter-rust",
"tree-sitter-scala",
"tree-sitter-swift",
"tree-sitter-toml",
"tree-sitter-typescript",
"tree-sitter-yaml",
"uuid",
]
@ -1523,14 +1527,14 @@ dependencies = [
[[package]]
name = "regex"
version = "1.9.5"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata 0.3.8",
"regex-syntax 0.7.5",
"regex-automata 0.4.8",
"regex-syntax 0.8.5",
]
[[package]]
@ -1544,13 +1548,13 @@ dependencies = [
[[package]]
name = "regex-automata"
version = "0.3.8"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax 0.7.5",
"regex-syntax 0.8.5",
]
[[package]]
@ -1565,6 +1569,12 @@ version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "reqwest"
version = "0.11.20"
@ -1852,6 +1862,12 @@ dependencies = [
"lazy_static",
]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook-registry"
version = "1.4.1"
@ -1920,6 +1936,12 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f026164926842ec52deb1938fae44f83dfdb82d0a5b0270c5bd5935ab74d6dd"
[[package]]
name = "streaming-iterator"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520"
[[package]]
name = "strsim"
version = "0.10.0"
@ -2321,232 +2343,267 @@ dependencies = [
[[package]]
name = "tree-sitter"
version = "0.20.10"
version = "0.24.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e747b1f9b7b931ed39a548c1fae149101497de3c1fc8d9e18c62c1a66c683d3d"
checksum = "f9871f16d6cf5c4757dcf30d5d2172a2df6987c510c017bbb7abfb7f9aa24d06"
dependencies = [
"cc",
"regex",
"regex-syntax 0.8.5",
"streaming-iterator",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-bash"
version = "0.20.3"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "096f57b3b44c04bfc7b21a4da44bfa16adf1f88aba18993b8478a091076d0968"
checksum = "3aa5e1c6bd02c0053f3f68edcf5d8866b38a8640584279e30fca88149ce14dda"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-c"
version = "0.20.6"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30b03bdf218020057abee831581a74bff8c298323d6c6cd1a70556430ded9f4b"
checksum = "c8b3fb515e498e258799a31d78e6603767cd6892770d9e2290ec00af5c3ad80b"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-c-sharp"
version = "0.20.0"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9ab3dc608f34924fa9e10533a95f62dbc14b6de0ddd7107722eba66fe19ae31"
checksum = "04c0f6d2209a3cd6d0bb9d2934715da15a15710d3c09c7c1ecd4c9804c3ecd10"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-cmake"
version = "0.5.0"
source = "git+https://code.blarg.ca/gered/tree-sitter-cmake.git?branch=tree-sitter-language#2a50b3b0ce318f11489dc8ec95ef165a84a262bf"
dependencies = [
"cc",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-cpp"
version = "0.20.3"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b4b625f46a7370544b9cf0545532c26712ae49bfc02eb09825db358b9f79e1"
checksum = "1d67e862242878d6ee50e1e5814f267ee3eea0168aea2cdbd700ccfb4c74b6d3"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-dockerfile"
version = "0.2.0"
source = "git+https://code.blarg.ca/gered/tree-sitter-dockerfile.git?branch=tree-sitter-language#ca73f2e024e2d6d92ddd785f7275ab2c6b6666eb"
dependencies = [
"cc",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-elixir"
version = "0.1.0"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a9916f3e1c80b3c8aab8582604e97e8720cb9b893489b347cf999f80f9d469e"
checksum = "97bf0efa4be41120018f23305b105ad4dfd3be1b7f302dc4071d0e6c2dec3a32"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-erlang"
version = "0.4.0"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93ced5145ebb17f83243bf055b74e108da7cc129e12faab4166df03f59b287f4"
checksum = "489bf4fed178fc0192ef47bf4570225558723952b8c88233704fd91445b45a8e"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-go"
version = "0.20.0"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ad6d11f19441b961af2fda7f12f5d0dac325f6d6de83836a1d3750018cc5114"
checksum = "caf57626e4c9b6d6efaf8a8d5ee1241c5f178ae7bfdf693713ae6a774f01424e"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-html"
version = "0.20.0"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "017822b6bd42843c4bd67fabb834f61ce23254e866282dd93871350fd6b7fa1d"
checksum = "7d52d710a3723360ebade986d3f0ae2aa2c3bcfb87bb1cdf60988ec51c81c40d"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-java"
version = "0.20.2"
version = "0.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2adc5696bf5abf761081d7457d2bb82d0e3b28964f4214f63fd7e720ef462653"
checksum = "b38b26736e6e97421760201f7a91c859f3b0d44382d48ac18aa963828f784ebf"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-javascript"
version = "0.20.1"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edbc663376bdd294bd1f0a6daf859aedb9aa5bdb72217d7ad8ba2d5314102cf7"
checksum = "59e1f62f8babb640b909f30675d1addeb1f17802f2a4d2af287569753b243977"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-json"
version = "0.20.1"
version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50d82d2e33ee675dc71289e2ace4f8f9cf96d36d81400e9dae5ea61edaf5dea6"
checksum = "35cc3c8d2fec2ba6d6a4d1cdf83153e1230d0de30742b875d857f8b9bbe042d0"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-kotlin"
version = "0.3.1"
name = "tree-sitter-language"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5f367466210220a194a2d8831fc12d15aa13305e7bcdf2dba47714aa328e86"
dependencies = [
"cc",
"tree-sitter",
]
checksum = "e8ddffe35a0e5eeeadf13ff7350af564c6e73993a24db62caee1822b185c2600"
[[package]]
name = "tree-sitter-lua"
version = "0.0.19"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0968cf4962ead1d26da28921dde1fd97407e7bbcf2f959cd20cf04ba2daa9421"
checksum = "5cdb9adf0965fec58e7660cbb3a059dbb12ebeec9459e6dcbae3db004739641e"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-md"
version = "0.1.5"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a237fa10f6b466b76c783c79b08cc172581e547ef1dbb6ddf1f8b4e230157e1"
checksum = "17f968c22a01010b83fc960455ae729db08dbeb6388617d9113897cb9204b030"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-objc"
version = "3.0.0"
name = "tree-sitter-php"
version = "0.23.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f465c1a24f400b1e4837c97ef350954dea05ff72030f6808fb3945e04fe0b27"
checksum = "8c9e1c3e04e8aca119bebc6d26ea06b961e91c57c54d389531a62db2e8c79036"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-python"
version = "0.20.4"
version = "0.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c93b1b1fbd0d399db3445f51fd3058e43d0b4dcff62ddbdb46e66550978aa5"
checksum = "65661b1a3e24139e2e54207e47d910ab07e28790d78efc7d5dc3a11ce2a110eb"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-r"
version = "0.19.5"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "522c13f4cc46213148b19d4ad40a988ffabd51fd90eb7de759844fbde49bda0c"
checksum = "51759bc3400109e5e5e09e80745d9e787655634e9c3b6e736eeaef44e7bcec0b"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-ruby"
version = "0.20.0"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ac30cbb1560363ae76e1ccde543d6d99087421e228cc47afcec004b86bb711a"
checksum = "6ec5ee842e27791e0adffa0b2a177614de51d2a26e5c7e84d014ed7f097e5ed0"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-rust"
version = "0.20.4"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0832309b0b2b6d33760ce5c0e818cb47e1d72b468516bfe4134408926fa7594"
checksum = "cffbbcb780348fbae8395742ae5b34c1fd794e4085d43aac9f259387f9a84dc8"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-scala"
version = "0.20.2"
version = "0.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93df43ab4f2b3299fe97e73eb9b946bbca453b402bea8debf1fa69ab4e28412b"
checksum = "a7394987e126e3b36dc94a89e48544bea8542db66a62532f6d19930685cc1230"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-swift"
version = "0.4.0"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "452e6ee0a14b82a0dcd93400b8d3fe3784fdbd775191a89ef84586e5ccec6be7"
checksum = "d65aeb41726119416567d0333ec17580ac4abfb96db1f67c4bd638c65f9992fe"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-toml"
version = "0.20.0"
source = "git+https://code.blarg.ca/gered/tree-sitter-toml.git?branch=tree-sitter-language#0975ccfb7d7c567cbf21d24bf198ff9515af371e"
dependencies = [
"cc",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-typescript"
version = "0.20.3"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75049f0aafabb2aac205d7bb24da162b53dcd0cfb326785f25a2f32efa8071a"
checksum = "aecf1585ae2a9dddc2b1d4c0e2140b2ec9876e2a25fd79de47fcf7dae0384685"
dependencies = [
"cc",
"tree-sitter",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-yaml"
version = "0.6.1"
source = "git+https://code.blarg.ca/gered/tree-sitter-yaml.git?branch=tree-sitter-language#9ffe10a1b805e9ddcb926e7b0602ea7fc1b7f1e0"
dependencies = [
"cc",
"tree-sitter-language",
]
[[package]]

View file

@ -33,29 +33,32 @@ tower-lsp = "0.20"
tracing = "0.1"
tracing-appender = "0.2"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
tree-sitter = "0.20"
tree-sitter-bash = "0.20"
tree-sitter-c = "0.20"
tree-sitter-cpp = "0.20"
tree-sitter-c-sharp = "0.20"
tree-sitter-elixir = "0.1"
tree-sitter-erlang = "0.4"
tree-sitter-go = "0.20"
tree-sitter-html = "0.20"
tree-sitter-java = "0.20"
tree-sitter-javascript = "0.20"
tree-sitter-json = "0.20"
tree-sitter-kotlin = "0.3.1"
tree-sitter-lua = "0.0.19"
tree-sitter-md = "0.1"
tree-sitter-objc = "3"
tree-sitter-python = "0.20"
tree-sitter-r = "0.19"
tree-sitter-ruby = "0.20"
tree-sitter-rust = "0.20"
tree-sitter-scala = "0.20"
tree-sitter-swift = "0.4"
tree-sitter-typescript = "0.20"
tree-sitter = "0.24.3"
tree-sitter-bash = "0.23.1"
tree-sitter-c = "0.23.1"
tree-sitter-cmake = { git = "https://code.blarg.ca/gered/tree-sitter-cmake.git", branch = "tree-sitter-language" }
tree-sitter-cpp = "0.23.1"
tree-sitter-c-sharp = "0.23.0"
tree-sitter-dockerfile = { git = "https://code.blarg.ca/gered/tree-sitter-dockerfile.git", branch = "tree-sitter-language" }
tree-sitter-elixir = "0.3.1"
tree-sitter-erlang = "0.9.0"
tree-sitter-go = "0.23.1"
tree-sitter-html = "0.23.0"
tree-sitter-java = "0.23.2"
tree-sitter-javascript = "0.23.0"
tree-sitter-json = "0.24.1"
tree-sitter-lua = "0.2.0"
tree-sitter-md = "0.3.2"
tree-sitter-php = "0.23.5"
tree-sitter-python = "0.23.2"
tree-sitter-r = "1.1.0"
tree-sitter-ruby = "0.23.0"
tree-sitter-rust = "0.23.0"
tree-sitter-scala = "0.23.2"
tree-sitter-swift = "0.6.0"
tree-sitter-toml = { git = "https://code.blarg.ca/gered/tree-sitter-toml.git", branch = "tree-sitter-language" }
tree-sitter-typescript = "0.23.0"
tree-sitter-yaml = { git = "https://code.blarg.ca/gered/tree-sitter-yaml.git", branch = "tree-sitter-language" }
[dependencies.uuid]
version = "1.4"

View file

@ -99,14 +99,26 @@ fn parse_llamacpp_text(text: &str) -> Result<Vec<Generation>> {
}
#[derive(Debug, Serialize, Deserialize)]
struct OllamaGeneration {
response: String,
struct OllamaGenerationChoiceMessage {
role: String,
content: String,
}
impl From<OllamaGeneration> for Generation {
fn from(value: OllamaGeneration) -> Self {
#[derive(Debug, Serialize, Deserialize)]
struct OllamaGenerationChoice {
index: i32,
message: OllamaGenerationChoiceMessage,
}
#[derive(Debug, Serialize, Deserialize)]
struct OllamaGeneration {
choices: Vec<OllamaGenerationChoice>
}
impl From<OllamaGenerationChoice> for Generation {
fn from(value: OllamaGenerationChoice) -> Self {
Generation {
generated_text: value.response,
generated_text: value.message.content,
}
}
}
@ -118,13 +130,13 @@ enum OllamaAPIResponse {
Error(APIError),
}
fn build_ollama_headers() -> HeaderMap {
HeaderMap::new()
fn build_ollama_headers(api_token: Option<&String>, ide: Ide) -> Result<HeaderMap> {
build_api_headers(api_token, ide)
}
fn parse_ollama_text(text: &str) -> Result<Vec<Generation>> {
match serde_json::from_str(text)? {
OllamaAPIResponse::Generation(gen) => Ok(vec![gen.into()]),
OllamaAPIResponse::Generation(completion) => Ok(completion.choices.into_iter().map(|x| x.into()).collect()),
OllamaAPIResponse::Error(err) => Err(Error::Ollama(err)),
}
}
@ -227,7 +239,9 @@ pub(crate) fn build_body(
request_body.insert("prompt".to_owned(), Value::String(prompt));
}
Backend::Ollama { .. } | Backend::OpenAi { .. } => {
request_body.insert("prompt".to_owned(), Value::String(prompt));
request_body.insert("messages".to_owned(), json!([
{ "role": "user", "content": prompt }
]));
request_body.insert("model".to_owned(), Value::String(model));
request_body.insert("stream".to_owned(), Value::Bool(false));
}
@ -243,7 +257,7 @@ pub(crate) fn build_headers(
match backend {
Backend::HuggingFace { .. } => build_api_headers(api_token, ide),
Backend::LlamaCpp { .. } => Ok(build_llamacpp_headers()),
Backend::Ollama { .. } => Ok(build_ollama_headers()),
Backend::Ollama { .. } => build_ollama_headers(api_token, ide),
Backend::OpenAi { .. } => build_openai_headers(api_token, ide),
Backend::Tgi { .. } => build_tgi_headers(api_token, ide),
}

View file

@ -6,123 +6,93 @@ use crate::error::{Error, Result};
use crate::language_id::LanguageId;
fn get_parser(language_id: LanguageId) -> Result<Parser> {
match language_id {
let language = match language_id {
LanguageId::Bash => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_bash::language())?;
Ok(parser)
Some(tree_sitter_bash::LANGUAGE)
}
LanguageId::C => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_c::language())?;
Ok(parser)
Some(tree_sitter_c::LANGUAGE)
}
LanguageId::Cmake => {
Some(tree_sitter_cmake::LANGUAGE)
}
LanguageId::Cpp => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_cpp::language())?;
Ok(parser)
Some(tree_sitter_cpp::LANGUAGE)
}
LanguageId::CSharp => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_c_sharp::language())?;
Ok(parser)
Some(tree_sitter_c_sharp::LANGUAGE)
}
LanguageId::Dockerfile => {
Some(tree_sitter_dockerfile::LANGUAGE)
}
LanguageId::Elixir => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_elixir::language())?;
Ok(parser)
Some(tree_sitter_elixir::LANGUAGE)
}
LanguageId::Erlang => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_erlang::language())?;
Ok(parser)
Some(tree_sitter_erlang::LANGUAGE)
}
LanguageId::Go => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_go::language())?;
Ok(parser)
Some(tree_sitter_go::LANGUAGE)
}
LanguageId::Html => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_html::language())?;
Ok(parser)
Some(tree_sitter_html::LANGUAGE)
}
LanguageId::Java => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_java::language())?;
Ok(parser)
Some(tree_sitter_java::LANGUAGE)
}
LanguageId::JavaScript | LanguageId::JavaScriptReact => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_javascript::language())?;
Ok(parser)
Some(tree_sitter_javascript::LANGUAGE)
}
LanguageId::Json => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_json::language())?;
Ok(parser)
}
LanguageId::Kotlin => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_kotlin::language())?;
Ok(parser)
Some(tree_sitter_json::LANGUAGE)
}
LanguageId::Lua => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_lua::language())?;
Ok(parser)
Some(tree_sitter_lua::LANGUAGE)
}
LanguageId::Markdown => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_md::language())?;
Ok(parser)
Some(tree_sitter_md::LANGUAGE)
}
LanguageId::ObjectiveC => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_objc::language())?;
Ok(parser)
LanguageId::Php => {
Some(tree_sitter_php::LANGUAGE_PHP)
}
LanguageId::Python => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_python::language())?;
Ok(parser)
Some(tree_sitter_python::LANGUAGE)
}
LanguageId::R => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_r::language())?;
Ok(parser)
Some(tree_sitter_r::LANGUAGE)
}
LanguageId::Ruby => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_ruby::language())?;
Ok(parser)
Some(tree_sitter_ruby::LANGUAGE)
}
LanguageId::Rust => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_rust::language())?;
Ok(parser)
Some(tree_sitter_rust::LANGUAGE)
}
LanguageId::Scala => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_scala::language())?;
Ok(parser)
Some(tree_sitter_scala::LANGUAGE)
}
LanguageId::Swift => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_swift::language())?;
Ok(parser)
Some(tree_sitter_swift::LANGUAGE)
}
LanguageId::Toml => {
Some(tree_sitter_toml::LANGUAGE)
}
LanguageId::TypeScript => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_typescript::language_typescript())?;
Ok(parser)
Some(tree_sitter_typescript::LANGUAGE_TYPESCRIPT)
}
LanguageId::TypeScriptReact => {
let mut parser = Parser::new();
parser.set_language(tree_sitter_typescript::language_tsx())?;
Ok(parser)
Some(tree_sitter_typescript::LANGUAGE_TSX)
}
LanguageId::Unknown => Ok(Parser::new()),
LanguageId::Yaml => {
Some(tree_sitter_yaml::LANGUAGE)
}
LanguageId::Unknown => None,
};
if let Some(language) = language {
let mut parser = Parser::new();
parser.set_language(&language.into())?;
Ok(parser)
} else {
Ok(Parser::new())
}
}

View file

@ -5,8 +5,10 @@ use std::fmt;
pub(crate) enum LanguageId {
Bash,
C,
Cmake,
Cpp,
CSharp,
Dockerfile,
Elixir,
Erlang,
Go,
@ -15,18 +17,19 @@ pub(crate) enum LanguageId {
JavaScript,
JavaScriptReact,
Json,
Kotlin,
Lua,
Markdown,
ObjectiveC,
Php,
Python,
R,
Ruby,
Rust,
Scala,
Swift,
Toml,
TypeScript,
TypeScriptReact,
Yaml,
Unknown,
}
@ -35,8 +38,10 @@ impl fmt::Display for LanguageId {
match self {
Self::Bash => write!(f, "shellscript"),
Self::C => write!(f, "c"),
Self::Cmake => write!(f, "cmake"),
Self::Cpp => write!(f, "cpp"),
Self::CSharp => write!(f, "csharp"),
Self::Dockerfile => write!(f, "dockerfile"),
Self::Elixir => write!(f, "elixir"),
Self::Erlang => write!(f, "erlang"),
Self::Go => write!(f, "go"),
@ -45,18 +50,19 @@ impl fmt::Display for LanguageId {
Self::JavaScript => write!(f, "javascript"),
Self::JavaScriptReact => write!(f, "javascriptreact"),
Self::Json => write!(f, "json"),
Self::Kotlin => write!(f, "kotlin"),
Self::Lua => write!(f, "lua"),
Self::Markdown => write!(f, "markdown"),
Self::ObjectiveC => write!(f, "objective-c"),
Self::Php => write!(f, "php"),
Self::Python => write!(f, "python"),
Self::R => write!(f, "r"),
Self::Ruby => write!(f, "ruby"),
Self::Rust => write!(f, "rust"),
Self::Scala => write!(f, "scala"),
Self::Swift => write!(f, "swift"),
Self::Toml => write!(f, "toml"),
Self::TypeScript => write!(f, "typescript"),
Self::TypeScriptReact => write!(f, "typescriptreact"),
Self::Yaml => write!(f, "yaml"),
Self::Unknown => write!(f, "unknown"),
}
}
@ -66,8 +72,10 @@ impl From<&str> for LanguageId {
fn from(value: &str) -> Self {
match value {
"c" => Self::C,
"cmake" => Self::Cmake,
"cpp" => Self::Cpp,
"csharp" => Self::CSharp,
"dockerfile" => Self::Dockerfile,
"elixir" => Self::Elixir,
"erlang" => Self::Erlang,
"go" => Self::Go,
@ -76,19 +84,22 @@ impl From<&str> for LanguageId {
"javascript" => Self::JavaScript,
"javascriptreact" => Self::JavaScriptReact,
"json" => Self::Json,
"kotlin" => Self::Kotlin,
"lua" => Self::Lua,
"markdown" => Self::Markdown,
"objective-c" => Self::ObjectiveC,
"php" => Self::Php,
"python" => Self::Python,
"r" => Self::R,
"ruby" => Self::Ruby,
"rust" => Self::Rust,
"scala" => Self::Scala,
"shellscript" => Self::Bash,
"sh" => Self::Bash,
"swift" => Self::Swift,
"toml" => Self::Toml,
"typescript" => Self::TypeScript,
"typescriptreact" => Self::TypeScriptReact,
"yaml" => Self::Yaml,
"yaml.ansible" => Self::Yaml,
_ => Self::Unknown,
}
}

View file

@ -77,6 +77,20 @@ fn should_complete(document: &Document, position: Position) -> Result<Completion
column: column + 1,
},
);
// HACK?: It's not entirely clear to me what the below commented out block of code that was originally being
// used was trying to accomplish. What I found is that in a lot of cases, even when the document was
// parsed into some known language with a document tree present, the logic below would end up returning
// CompletionType::SingleLine ... usually because the specific scenario didn't fall into the root node
// check at the start.
// So far, with the below simplified to just return CompletionType::MultiLine in all cases where the
// document tree is parsed into some known language _seems_ to work better? Certainly I get much less
// forced single-line completions which was extremely disappointing and irritating to see!
if current_node.is_some() {
return Ok(CompletionType::MultiLine);
}
/*
if let Some(node) = current_node {
if node == tree.root_node() {
return Ok(CompletionType::MultiLine);
@ -110,6 +124,7 @@ fn should_complete(document: &Document, position: Position) -> Result<Completion
return Ok(CompletionType::MultiLine);
}
}
*/
}
let start_idx = document.text.try_line_to_char(row)?;
// XXX: We treat the end of a document as a newline
@ -441,19 +456,19 @@ fn build_url(backend: Backend, model: &str, disable_url_path_completion: bool) -
}
}
Backend::Ollama { mut url } => {
if url.ends_with("/api/generate") {
if url.ends_with("/v1/chat/completions") {
url
} else if url.ends_with("/api/") {
url.push_str("generate");
} else if url.ends_with("/v1/") {
url.push_str("chat/completions");
url
} else if url.ends_with("/api") {
url.push_str("/generate");
} else if url.ends_with("/v1") {
url.push_str("/chat/completions");
url
} else if url.ends_with('/') {
url.push_str("api/generate");
url.push_str("v1/chat/completions");
url
} else {
url.push_str("/api/generate");
url.push_str("/v1/chat/completions");
url
}
}

2
rust-toolchain.toml Normal file
View file

@ -0,0 +1,2 @@
[toolchain]
channel = "1.79.0"