Add inclusive range scope overrides. Don't auto-close quotes at the ends of line comments (#20206)

Closes #9195
Closes #19787

Release Notes:

- Fixed an issue where single quotation marks were spuriously
auto-closed when typing in line comments
This commit is contained in:
Max Brunsfeld 2024-11-04 15:36:39 -08:00 committed by GitHub
parent 369de400be
commit 258cf6c746
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 120 additions and 61 deletions

View file

@ -945,7 +945,14 @@ struct RunnableConfig {
struct OverrideConfig {
query: Query,
values: HashMap<u32, (String, LanguageConfigOverride)>,
values: HashMap<u32, OverrideEntry>,
}
#[derive(Debug)]
struct OverrideEntry {
name: String,
range_is_inclusive: bool,
value: LanguageConfigOverride,
}
#[derive(Default, Clone)]
@ -1265,58 +1272,66 @@ impl Language {
};
let mut override_configs_by_id = HashMap::default();
for (ix, name) in query.capture_names().iter().enumerate() {
if !name.starts_with('_') {
let value = self.config.overrides.remove(*name).unwrap_or_default();
for server_name in &value.opt_into_language_servers {
if !self
.config
.scope_opt_in_language_servers
.contains(server_name)
{
util::debug_panic!("Server {server_name:?} has been opted-in by scope {name:?} but has not been marked as an opt-in server");
}
}
override_configs_by_id.insert(ix as u32, (name.to_string(), value));
for (ix, mut name) in query.capture_names().iter().copied().enumerate() {
let mut range_is_inclusive = false;
if name.starts_with('_') {
continue;
}
if let Some(prefix) = name.strip_suffix(".inclusive") {
name = prefix;
range_is_inclusive = true;
}
let value = self.config.overrides.get(name).cloned().unwrap_or_default();
for server_name in &value.opt_into_language_servers {
if !self
.config
.scope_opt_in_language_servers
.contains(server_name)
{
util::debug_panic!("Server {server_name:?} has been opted-in by scope {name:?} but has not been marked as an opt-in server");
}
}
override_configs_by_id.insert(
ix as u32,
OverrideEntry {
name: name.to_string(),
range_is_inclusive,
value,
},
);
}
if !self.config.overrides.is_empty() {
let keys = self.config.overrides.keys().collect::<Vec<_>>();
Err(anyhow!(
"language {:?} has overrides in config not in query: {keys:?}",
self.config.name
))?;
}
let referenced_override_names = self.config.overrides.keys().chain(
self.config
.brackets
.disabled_scopes_by_bracket_ix
.iter()
.flatten(),
);
for disabled_scope_name in self
.config
.brackets
.disabled_scopes_by_bracket_ix
.iter()
.flatten()
{
for referenced_name in referenced_override_names {
if !override_configs_by_id
.values()
.any(|(scope_name, _)| scope_name == disabled_scope_name)
.any(|entry| entry.name == *referenced_name)
{
Err(anyhow!(
"language {:?} has overrides in config not in query: {disabled_scope_name:?}",
"language {:?} has overrides in config not in query: {referenced_name:?}",
self.config.name
))?;
}
}
for (name, override_config) in override_configs_by_id.values_mut() {
override_config.disabled_bracket_ixs = self
for entry in override_configs_by_id.values_mut() {
entry.value.disabled_bracket_ixs = self
.config
.brackets
.disabled_scopes_by_bracket_ix
.iter()
.enumerate()
.filter_map(|(ix, disabled_scope_names)| {
if disabled_scope_names.contains(name) {
if disabled_scope_names.contains(&entry.name) {
Some(ix as u16)
} else {
None
@ -1534,14 +1549,14 @@ impl LanguageScope {
let id = self.override_id?;
let grammar = self.language.grammar.as_ref()?;
let override_config = grammar.override_config.as_ref()?;
override_config.values.get(&id).map(|e| e.0.as_str())
override_config.values.get(&id).map(|e| e.name.as_str())
}
fn config_override(&self) -> Option<&LanguageConfigOverride> {
let id = self.override_id?;
let grammar = self.language.grammar.as_ref()?;
let override_config = grammar.override_config.as_ref()?;
override_config.values.get(&id).map(|e| &e.1)
override_config.values.get(&id).map(|e| &e.value)
}
}