@ -8,30 +8,42 @@
 
			
		
	
		
		
			
				
					
					 * / 
 * / 
 
			
		
	
		
		
			
				
					
					open !  IStd ; open !  IStd ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					/*  internally it uses reversed list to store qualified name, for example: ["get", "shared_ptr<int>", "std"] */  
			
		
	
		
		
			
				
					
					type  t  =  list  string  [ @@ deriving  compare ] ; type  t  =  list  string  [ @@ deriving  compare ] ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  equal  =  [ % compare . equal  :  t ] ; let  equal  =  [ % compare . equal  :  t ] ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  empty  =  [] ; let  empty  =  [] ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  append_qualifier  quals  qual :: qual  = >  List . append quals  [ qual ]  ; let  append_qualifier  quals  qual :: qual  = >  List . cons qual  quals  ;  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  to_list  quals  = >  quals ; let  extract_last  =  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  fun 
 
			
		
	
		
		
			
				
					
					  |  [ last ,  ... rest ]  = >  Some  ( last ,  rest ) 
 
			
		
	
		
		
			
				
					
					  |  []  = >  None ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  of_list  quals  = >  quals ; let  to_list  =  List . rev ;  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  to_rev_list  =  ident ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  of_list  =  List . rev ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  of_rev_list  =  ident ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  cpp_separator  =  " :: " ; let  cpp_separator  =  " :: " ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					/*  This is simplistic and will give the wrong answer in some cases, eg /*  This is simplistic and will give the wrong answer in some cases, eg  
			
		
	
		
		
			
				
					
					   " foo<bar::baz<goo>>::someMethod "  will  get  parsed  as  [ " foo<bar " ,  " baz<goo>> " , 
   " foo<bar::baz<goo>>::someMethod "  will  get  parsed  as  [ " foo<bar " ,  " baz<goo>> " , 
 
			
		
	
		
		
			
				
					
					   " someMethod " ] .  Avoid  using  it  if  possible  * / 
   " someMethod " ] .  Avoid  using  it  if  possible  * / 
 
			
		
	
		
		
			
				
					
					let  of_qual_string  =  { let  of_qual_string  str  = > {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  let  class_sep_regex  =  Str . regexp_string  cpp_separator ; 
  let  class_sep_regex  =  Str . regexp_string  cpp_separator ; 
 
			
		
	
		
		
			
				
					
					  /*  wait until here to define the function so that [class_sep_regex] is only computed once  */ 
  /*  wait until here to define the function so that [class_sep_regex] is only computed once  */ 
 
			
		
	
		
		
			
				
					
					  Str . split  class_sep_regex 
  Str . split  class_sep_regex  str  | >  List . rev  
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					} ; } ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  to_qual_string  =  String . concat  sep :: cpp_separator ; let  to_separated_string  quals  sep :: sep  = >  List . rev  quals  | >  String . concat  sep :: sep ;  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  to_qual_string  =  to_separated_string  sep :: cpp_separator ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  pp  fmt  quals  = >  Format . fprintf  fmt  " %s "  ( to_qual_string  quals ) ; let  pp  fmt  quals  = >  Format . fprintf  fmt  " %s "  ( to_qual_string  quals ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -39,7 +51,7 @@ let module Match = {
 
			
		
	
		
		
			
				
					
					  type  quals_matcher  =  Str . regexp ; 
  type  quals_matcher  =  Str . regexp ; 
 
			
		
	
		
		
			
				
					
					  let  matching_separator  =  " # " ; 
  let  matching_separator  =  " # " ; 
 
			
		
	
		
		
			
				
					
					  let  regexp_string_of_qualifiers  quals  = > 
  let  regexp_string_of_qualifiers  quals  = > 
 
			
		
	
		
		
			
				
					
					    Str . quote  ( String . concat sep :: matching_separator  quals )  ^  " $ " ; 
    Str . quote  ( to_separated_string sep :: matching_separator  quals )  ^  " $ " ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  let  qualifiers_list_matcher  quals_list  = > 
  let  qualifiers_list_matcher  quals_list  = > 
 
			
		
	
		
		
			
				
					
					    ( 
    ( 
 
			
		
	
		
		
			
				
					
					      if  ( List . is_empty  quals_list )  { 
      if  ( List . is_empty  quals_list )  { 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -66,6 +78,6 @@ let module Match = {
 
			
		
	
		
		
			
				
					
					      let  no_template_name  s  = >  List . hd_exn  ( String . split  on :: '<'  s ) ; 
      let  no_template_name  s  = >  List . hd_exn  ( String . split  on :: '<'  s ) ; 
 
			
		
	
		
		
			
				
					
					      List . map  f :: no_template_name  quals 
      List . map  f :: no_template_name  quals 
 
			
		
	
		
		
			
				
					
					    } ; 
    } ; 
 
			
		
	
		
		
			
				
					
					    Str . string_match  matcher  ( String . concat sep :: matching_separator  normalized_qualifiers )  0 
    Str . string_match  matcher  ( to_separated_string sep :: matching_separator  normalized_qualifiers )  0 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  } ; 
  } ; 
 
			
		
	
		
		
			
				
					
					} ; } ;