add ruby support for semantic search
This commit is contained in:
parent
a5dd8dd0a9
commit
ca4e21881e
5 changed files with 256 additions and 0 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -6689,6 +6689,7 @@ dependencies = [
|
||||||
"tree-sitter-elixir 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tree-sitter-elixir 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tree-sitter-json 0.19.0",
|
"tree-sitter-json 0.19.0",
|
||||||
"tree-sitter-lua",
|
"tree-sitter-lua",
|
||||||
|
"tree-sitter-ruby",
|
||||||
"tree-sitter-rust",
|
"tree-sitter-rust",
|
||||||
"tree-sitter-toml 0.20.0",
|
"tree-sitter-toml 0.20.0",
|
||||||
"tree-sitter-typescript 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tree-sitter-typescript 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
|
@ -61,3 +61,4 @@ tree-sitter-toml = "*"
|
||||||
tree-sitter-cpp = "*"
|
tree-sitter-cpp = "*"
|
||||||
tree-sitter-elixir = "*"
|
tree-sitter-elixir = "*"
|
||||||
tree-sitter-lua = "*"
|
tree-sitter-lua = "*"
|
||||||
|
tree-sitter-ruby = "*"
|
||||||
|
|
|
@ -827,6 +827,196 @@ async fn test_code_context_retrieval_cpp() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_code_context_retrieval_ruby() {
|
||||||
|
let language = ruby_lang();
|
||||||
|
let mut retriever = CodeContextRetriever::new();
|
||||||
|
|
||||||
|
let text = r#"
|
||||||
|
# This concern is inspired by "sudo mode" on GitHub. It
|
||||||
|
# is a way to re-authenticate a user before allowing them
|
||||||
|
# to see or perform an action.
|
||||||
|
#
|
||||||
|
# Add `before_action :require_challenge!` to actions you
|
||||||
|
# want to protect.
|
||||||
|
#
|
||||||
|
# The user will be shown a page to enter the challenge (which
|
||||||
|
# is either the password, or just the username when no
|
||||||
|
# password exists). Upon passing, there is a grace period
|
||||||
|
# during which no challenge will be asked from the user.
|
||||||
|
#
|
||||||
|
# Accessing challenge-protected resources during the grace
|
||||||
|
# period will refresh the grace period.
|
||||||
|
module ChallengableConcern
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
CHALLENGE_TIMEOUT = 1.hour.freeze
|
||||||
|
|
||||||
|
def require_challenge!
|
||||||
|
return if skip_challenge?
|
||||||
|
|
||||||
|
if challenge_passed_recently?
|
||||||
|
session[:challenge_passed_at] = Time.now.utc
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
@challenge = Form::Challenge.new(return_to: request.url)
|
||||||
|
|
||||||
|
if params.key?(:form_challenge)
|
||||||
|
if challenge_passed?
|
||||||
|
session[:challenge_passed_at] = Time.now.utc
|
||||||
|
else
|
||||||
|
flash.now[:alert] = I18n.t('challenge.invalid_password')
|
||||||
|
render_challenge
|
||||||
|
end
|
||||||
|
else
|
||||||
|
render_challenge
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def challenge_passed?
|
||||||
|
current_user.valid_password?(challenge_params[:current_password])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Animal
|
||||||
|
include Comparable
|
||||||
|
|
||||||
|
attr_reader :legs
|
||||||
|
|
||||||
|
def initialize(name, legs)
|
||||||
|
@name, @legs = name, legs
|
||||||
|
end
|
||||||
|
|
||||||
|
def <=>(other)
|
||||||
|
legs <=> other.legs
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Singleton method for car object
|
||||||
|
def car.wheels
|
||||||
|
puts "There are four wheels"
|
||||||
|
end"#
|
||||||
|
.unindent();
|
||||||
|
|
||||||
|
let documents = retriever.parse_file(&text, language.clone()).unwrap();
|
||||||
|
|
||||||
|
assert_documents_eq(
|
||||||
|
&documents,
|
||||||
|
&[
|
||||||
|
(
|
||||||
|
r#"
|
||||||
|
# This concern is inspired by "sudo mode" on GitHub. It
|
||||||
|
# is a way to re-authenticate a user before allowing them
|
||||||
|
# to see or perform an action.
|
||||||
|
#
|
||||||
|
# Add `before_action :require_challenge!` to actions you
|
||||||
|
# want to protect.
|
||||||
|
#
|
||||||
|
# The user will be shown a page to enter the challenge (which
|
||||||
|
# is either the password, or just the username when no
|
||||||
|
# password exists). Upon passing, there is a grace period
|
||||||
|
# during which no challenge will be asked from the user.
|
||||||
|
#
|
||||||
|
# Accessing challenge-protected resources during the grace
|
||||||
|
# period will refresh the grace period.
|
||||||
|
module ChallengableConcern
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
CHALLENGE_TIMEOUT = 1.hour.freeze
|
||||||
|
|
||||||
|
def require_challenge!
|
||||||
|
# ...
|
||||||
|
end
|
||||||
|
|
||||||
|
def challenge_passed?
|
||||||
|
# ...
|
||||||
|
end
|
||||||
|
end"#
|
||||||
|
.unindent(),
|
||||||
|
558,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r#"
|
||||||
|
def require_challenge!
|
||||||
|
return if skip_challenge?
|
||||||
|
|
||||||
|
if challenge_passed_recently?
|
||||||
|
session[:challenge_passed_at] = Time.now.utc
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
@challenge = Form::Challenge.new(return_to: request.url)
|
||||||
|
|
||||||
|
if params.key?(:form_challenge)
|
||||||
|
if challenge_passed?
|
||||||
|
session[:challenge_passed_at] = Time.now.utc
|
||||||
|
else
|
||||||
|
flash.now[:alert] = I18n.t('challenge.invalid_password')
|
||||||
|
render_challenge
|
||||||
|
end
|
||||||
|
else
|
||||||
|
render_challenge
|
||||||
|
end
|
||||||
|
end"#
|
||||||
|
.unindent(),
|
||||||
|
663,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r#"
|
||||||
|
def challenge_passed?
|
||||||
|
current_user.valid_password?(challenge_params[:current_password])
|
||||||
|
end"#
|
||||||
|
.unindent(),
|
||||||
|
1254,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r#"
|
||||||
|
class Animal
|
||||||
|
include Comparable
|
||||||
|
|
||||||
|
attr_reader :legs
|
||||||
|
|
||||||
|
def initialize(name, legs)
|
||||||
|
# ...
|
||||||
|
end
|
||||||
|
|
||||||
|
def <=>(other)
|
||||||
|
# ...
|
||||||
|
end
|
||||||
|
end"#
|
||||||
|
.unindent(),
|
||||||
|
1363,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r#"
|
||||||
|
def initialize(name, legs)
|
||||||
|
@name, @legs = name, legs
|
||||||
|
end"#
|
||||||
|
.unindent(),
|
||||||
|
1427,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r#"
|
||||||
|
def <=>(other)
|
||||||
|
legs <=> other.legs
|
||||||
|
end"#
|
||||||
|
.unindent(),
|
||||||
|
1501,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r#"
|
||||||
|
# Singleton method for car object
|
||||||
|
def car.wheels
|
||||||
|
puts "There are four wheels"
|
||||||
|
end"#
|
||||||
|
.unindent(),
|
||||||
|
1591,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
fn test_dot_product(mut rng: StdRng) {
|
fn test_dot_product(mut rng: StdRng) {
|
||||||
assert_eq!(dot(&[1., 0., 0., 0., 0.], &[0., 1., 0., 0., 0.]), 0.);
|
assert_eq!(dot(&[1., 0., 0., 0., 0.], &[0., 1., 0., 0., 0.]), 0.);
|
||||||
|
@ -1186,6 +1376,47 @@ fn lua_lang() -> Arc<Language> {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ruby_lang() -> Arc<Language> {
|
||||||
|
Arc::new(
|
||||||
|
Language::new(
|
||||||
|
LanguageConfig {
|
||||||
|
name: "Ruby".into(),
|
||||||
|
path_suffixes: vec!["rb".into()],
|
||||||
|
collapsed_placeholder: "# ...".to_string(),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
Some(tree_sitter_ruby::language()),
|
||||||
|
)
|
||||||
|
.with_embedding_query(
|
||||||
|
r#"
|
||||||
|
(
|
||||||
|
(comment)* @context
|
||||||
|
.
|
||||||
|
[
|
||||||
|
(module
|
||||||
|
"module" @name
|
||||||
|
name: (_) @name)
|
||||||
|
(method
|
||||||
|
"def" @name
|
||||||
|
name: (_) @name
|
||||||
|
body: (body_statement) @collapse)
|
||||||
|
(class
|
||||||
|
"class" @name
|
||||||
|
name: (_) @name)
|
||||||
|
(singleton_method
|
||||||
|
"def" @name
|
||||||
|
object: (_) @name
|
||||||
|
"." @name
|
||||||
|
name: (_) @name
|
||||||
|
body: (body_statement) @collapse)
|
||||||
|
] @item
|
||||||
|
)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn elixir_lang() -> Arc<Language> {
|
fn elixir_lang() -> Arc<Language> {
|
||||||
Arc::new(
|
Arc::new(
|
||||||
Language::new(
|
Language::new(
|
||||||
|
|
|
@ -10,3 +10,4 @@ brackets = [
|
||||||
{ start = "\"", end = "\"", close = true, newline = false, not_in = ["comment", "string"] },
|
{ start = "\"", end = "\"", close = true, newline = false, not_in = ["comment", "string"] },
|
||||||
{ start = "'", end = "'", close = true, newline = false, not_in = ["comment", "string"] },
|
{ start = "'", end = "'", close = true, newline = false, not_in = ["comment", "string"] },
|
||||||
]
|
]
|
||||||
|
collapsed_placeholder = "# ..."
|
||||||
|
|
22
crates/zed/src/languages/ruby/embedding.scm
Normal file
22
crates/zed/src/languages/ruby/embedding.scm
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
(
|
||||||
|
(comment)* @context
|
||||||
|
.
|
||||||
|
[
|
||||||
|
(module
|
||||||
|
"module" @name
|
||||||
|
name: (_) @name)
|
||||||
|
(method
|
||||||
|
"def" @name
|
||||||
|
name: (_) @name
|
||||||
|
body: (body_statement) @collapse)
|
||||||
|
(class
|
||||||
|
"class" @name
|
||||||
|
name: (_) @name)
|
||||||
|
(singleton_method
|
||||||
|
"def" @name
|
||||||
|
object: (_) @name
|
||||||
|
"." @name
|
||||||
|
name: (_) @name
|
||||||
|
body: (body_statement) @collapse)
|
||||||
|
] @item
|
||||||
|
)
|
Loading…
Add table
Add a link
Reference in a new issue