Wait for language to load when parsing markdown

This commit is contained in:
Julia 2023-10-04 17:36:51 -04:00
parent ea6f366d23
commit a881b1f5fb
4 changed files with 137 additions and 92 deletions

View file

@ -7,7 +7,7 @@ pub use crate::{
use crate::{
diagnostic_set::{DiagnosticEntry, DiagnosticGroup},
language_settings::{language_settings, LanguageSettings},
markdown,
markdown::parse_markdown,
outline::OutlineItem,
syntax_map::{
SyntaxLayerInfo, SyntaxMap, SyntaxMapCapture, SyntaxMapCaptures, SyntaxMapMatches,
@ -145,7 +145,7 @@ pub struct Diagnostic {
pub is_unnecessary: bool,
}
pub fn prepare_completion_documentation(
pub async fn prepare_completion_documentation(
documentation: &lsp::Documentation,
language_registry: &Arc<LanguageRegistry>,
language: Option<Arc<Language>>,
@ -170,7 +170,7 @@ pub fn prepare_completion_documentation(
}
lsp::MarkupKind::Markdown => {
let parsed = markdown::parse_markdown(value, language_registry, language, style);
let parsed = parse_markdown(value, language_registry, language, style).await;
Some(Documentation::MultiLineMarkdown(parsed))
}
},

View file

@ -2,7 +2,6 @@ use std::ops::Range;
use std::sync::Arc;
use crate::{Language, LanguageRegistry};
use futures::FutureExt;
use gpui::fonts::{HighlightStyle, Underline, Weight};
use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag};
@ -20,7 +19,7 @@ pub struct ParsedRegion {
pub link_url: Option<String>,
}
pub fn parse_markdown(
pub async fn parse_markdown(
markdown: &str,
language_registry: &Arc<LanguageRegistry>,
language: Option<Arc<Language>>,
@ -40,7 +39,8 @@ pub fn parse_markdown(
&mut highlights,
&mut region_ranges,
&mut regions,
);
)
.await;
ParsedMarkdown {
text,
@ -50,7 +50,7 @@ pub fn parse_markdown(
}
}
pub fn parse_markdown_block(
pub async fn parse_markdown_block(
markdown: &str,
language_registry: &Arc<LanguageRegistry>,
language: Option<Arc<Language>>,
@ -143,8 +143,8 @@ pub fn parse_markdown_block(
current_language = if let CodeBlockKind::Fenced(language) = kind {
language_registry
.language_for_name(language.as_ref())
.now_or_never()
.and_then(Result::ok)
.await
.ok()
} else {
language.clone()
}