@ -25,6 +25,12 @@ pub struct HighlightingAssets {
fallback_theme : Option < & ' static str > ,
fallback_theme : Option < & ' static str > ,
}
}
#[ derive(Debug) ]
pub struct SyntaxReferenceInSet < ' a > {
pub syntax : & ' a SyntaxReference ,
pub syntax_set : & ' a SyntaxSet ,
}
const IGNORED_SUFFIXES : [ & str ; 10 ] = [
const IGNORED_SUFFIXES : [ & str ; 10 ] = [
// Editor etc backups
// Editor etc backups
"~" ,
"~" ,
@ -217,21 +223,26 @@ impl HighlightingAssets {
file_name : impl AsRef < Path > ,
file_name : impl AsRef < Path > ,
mapping : & SyntaxMapping ,
mapping : & SyntaxMapping ,
) -> Option < & SyntaxReference > {
) -> Option < & SyntaxReference > {
self . get_syntax_for_file_name ( file_name , mapping ) . expect (
self . get_syntax_for_file_name ( file_name , mapping )
".syntax_for_file_name() is deprecated, use .get_syntax_for_file_name() instead" ,
. expect (
)
".syntax_for_file_name() is deprecated, use .get_syntax_for_file_name() instead" ,
)
. map ( | syntax_in_set | syntax_in_set . syntax )
}
}
pub fn get_syntax_for_file_name (
pub fn get_syntax_for_file_name (
& self ,
& self ,
file_name : impl AsRef < Path > ,
file_name : impl AsRef < Path > ,
mapping : & SyntaxMapping ,
mapping : & SyntaxMapping ,
) -> Result < Option < & SyntaxReference > > {
) -> Result < Option < SyntaxReference InSet > > {
let file_name = file_name . as_ref ( ) ;
let file_name = file_name . as_ref ( ) ;
Ok ( match mapping . get_syntax_for ( file_name ) {
Ok ( match mapping . get_syntax_for ( file_name ) {
Some ( MappingTarget ::MapToUnknown ) = > None ,
Some ( MappingTarget ::MapToUnknown ) = > None ,
Some ( MappingTarget ::MapTo ( syntax_name ) ) = > {
Some ( MappingTarget ::MapTo ( syntax_name ) ) = > {
self . get_syntax_set ( ) ? . find_syntax_by_name ( syntax_name )
let syntax_set = self . get_syntax_set ( ) ? ;
syntax_set
. find_syntax_by_name ( syntax_name )
. map ( | syntax | SyntaxReferenceInSet { syntax , syntax_set } )
}
}
None = > self . get_extension_syntax ( file_name . as_os_str ( ) ) ? ,
None = > self . get_extension_syntax ( file_name . as_os_str ( ) ) ? ,
} )
} )
@ -259,10 +270,12 @@ impl HighlightingAssets {
language : Option < & str > ,
language : Option < & str > ,
input : & mut OpenedInput ,
input : & mut OpenedInput ,
mapping : & SyntaxMapping ,
mapping : & SyntaxMapping ,
) -> Result < & SyntaxReference > {
) -> Result < SyntaxReference InSet > {
if let Some ( language ) = language {
if let Some ( language ) = language {
self . get_syntax_set ( ) ?
let syntax_set = self . get_syntax_set ( ) ? ;
syntax_set
. find_syntax_by_token ( language )
. find_syntax_by_token ( language )
. map ( | syntax | SyntaxReferenceInSet { syntax , syntax_set } )
. ok_or_else ( | | ErrorKind ::UnknownSyntax ( language . to_owned ( ) ) . into ( ) )
. ok_or_else ( | | ErrorKind ::UnknownSyntax ( language . to_owned ( ) ) . into ( ) )
} else {
} else {
let line_syntax = self . get_first_line_syntax ( & mut input . reader ) ? ;
let line_syntax = self . get_first_line_syntax ( & mut input . reader ) ? ;
@ -293,10 +306,13 @@ impl HighlightingAssets {
ErrorKind ::UndetectedSyntax ( path . to_string_lossy ( ) . into ( ) ) . into ( )
ErrorKind ::UndetectedSyntax ( path . to_string_lossy ( ) . into ( ) ) . into ( )
} ) ,
} ) ,
Some ( MappingTarget ::MapTo ( syntax_name ) ) = > self
Some ( MappingTarget ::MapTo ( syntax_name ) ) = > {
. get_syntax_set ( ) ?
let syntax_set = self . get_syntax_set ( ) ? ;
. find_syntax_by_name ( syntax_name )
syntax_set
. ok_or_else ( | | ErrorKind ::UnknownSyntax ( syntax_name . to_owned ( ) ) . into ( ) ) ,
. find_syntax_by_name ( syntax_name )
. map ( | syntax | SyntaxReferenceInSet { syntax , syntax_set } )
. ok_or_else ( | | ErrorKind ::UnknownSyntax ( syntax_name . to_owned ( ) ) . into ( ) )
}
None = > {
None = > {
let file_name = path . file_name ( ) . unwrap_or_default ( ) ;
let file_name = path . file_name ( ) . unwrap_or_default ( ) ;
@ -314,7 +330,7 @@ impl HighlightingAssets {
}
}
}
}
fn get_extension_syntax ( & self , file_name : & OsStr ) -> Result < Option < & SyntaxReference > > {
fn get_extension_syntax ( & self , file_name : & OsStr ) -> Result < Option < SyntaxReference InSet > > {
let mut syntax = self . find_syntax_by_file_name ( file_name ) ? ;
let mut syntax = self . find_syntax_by_file_name ( file_name ) ? ;
if syntax . is_none ( ) {
if syntax . is_none ( ) {
syntax = self . find_syntax_by_file_name_extension ( file_name ) ? ;
syntax = self . find_syntax_by_file_name_extension ( file_name ) ? ;
@ -325,23 +341,27 @@ impl HighlightingAssets {
Ok ( syntax )
Ok ( syntax )
}
}
fn find_syntax_by_file_name ( & self , file_name : & OsStr ) -> Result < Option < & SyntaxReference > > {
fn find_syntax_by_file_name ( & self , file_name : & OsStr ) -> Result < Option < SyntaxReferenceInSet > > {
Ok ( self
let syntax_set = self . get_syntax_set ( ) ? ;
. get_syntax_set ( ) ?
Ok ( syntax_set
. find_syntax_by_extension ( file_name . to_str ( ) . unwrap_or_default ( ) ) )
. find_syntax_by_extension ( file_name . to_str ( ) . unwrap_or_default ( ) )
. map ( | syntax | SyntaxReferenceInSet { syntax , syntax_set } ) )
}
}
fn find_syntax_by_file_name_extension (
fn find_syntax_by_file_name_extension (
& self ,
& self ,
file_name : & OsStr ,
file_name : & OsStr ,
) -> Result < Option < & SyntaxReference > > {
) -> Result < Option < SyntaxReference InSet > > {
let file_path = Path ::new ( file_name ) ;
let file_path = Path ::new ( file_name ) ;
Ok ( self . get_syntax_set ( ) ? . find_syntax_by_extension (
let syntax_set = self . get_syntax_set ( ) ? ;
file_path
Ok ( syntax_set
. extension ( )
. find_syntax_by_extension (
. and_then ( | x | x . to_str ( ) )
file_path
. unwrap_or_default ( ) ,
. extension ( )
) )
. and_then ( | x | x . to_str ( ) )
. unwrap_or_default ( ) ,
)
. map ( | syntax | SyntaxReferenceInSet { syntax , syntax_set } ) )
}
}
/// If we find an ignored suffix on the file name, e.g. '~', we strip it and
/// If we find an ignored suffix on the file name, e.g. '~', we strip it and
@ -349,7 +369,7 @@ impl HighlightingAssets {
fn get_extension_syntax_with_stripped_suffix (
fn get_extension_syntax_with_stripped_suffix (
& self ,
& self ,
file_name : & OsStr ,
file_name : & OsStr ,
) -> Result < Option < & SyntaxReference > > {
) -> Result < Option < SyntaxReference InSet > > {
let file_path = Path ::new ( file_name ) ;
let file_path = Path ::new ( file_name ) ;
let mut syntax = None ;
let mut syntax = None ;
if let Some ( file_str ) = file_path . to_str ( ) {
if let Some ( file_str ) = file_path . to_str ( ) {
@ -363,11 +383,15 @@ impl HighlightingAssets {
Ok ( syntax )
Ok ( syntax )
}
}
fn get_first_line_syntax ( & self , reader : & mut InputReader ) -> Result < Option < & SyntaxReference > > {
fn get_first_line_syntax (
& self ,
reader : & mut InputReader ,
) -> Result < Option < SyntaxReferenceInSet > > {
let syntax_set = self . get_syntax_set ( ) ? ;
let syntax_set = self . get_syntax_set ( ) ? ;
Ok ( String ::from_utf8 ( reader . first_line . clone ( ) )
Ok ( String ::from_utf8 ( reader . first_line . clone ( ) )
. ok ( )
. ok ( )
. and_then ( | l | syntax_set . find_syntax_by_first_line ( & l ) ) )
. and_then ( | l | syntax_set . find_syntax_by_first_line ( & l ) )
. map ( | syntax | SyntaxReferenceInSet { syntax , syntax_set } ) )
}
}
}
}
@ -462,7 +486,7 @@ mod tests {
) -> String {
) -> String {
self . assets
self . assets
. get_syntax ( language , input , mapping )
. get_syntax ( language , input , mapping )
. map ( | syntax | syntax . name . clone ( ) )
. map ( | syntax _in_set | syntax_in_set . syntax . name . clone ( ) )
. unwrap_or_else ( | _ | "!no syntax!" . to_owned ( ) )
. unwrap_or_else ( | _ | "!no syntax!" . to_owned ( ) )
}
}