@@ -191,7 +191,9 @@ impl<'a> StructuralNameModel<'a> {
191191 match ty {
192192 KotlinType :: Class ( class) => {
193193 let name = & class. segments . last ( ) ?. name ;
194- ( name. as_str ( ) != "Object" ) . then ( || self . morphology . lower_camel ( name) )
194+ let source = name. as_str ( ) ;
195+ ( source != "Object" && !is_register_style_name ( source) )
196+ . then ( || self . morphology . lower_camel ( name) )
195197 }
196198 KotlinType :: Array ( element) => self
197199 . java_type_name ( element)
@@ -556,11 +558,64 @@ impl<'a> SemanticNameRecovery<'a> {
556558 . flatten ( )
557559 . chain ( this_variable)
558560 . collect :: < BTreeSet < _ > > ( ) ;
559- ConstrainedNameSolver :: new ( StructuralNameModel :: for_graph ( self . types , & graph) , 35 ) . solve (
561+ let model = StructuralNameModel :: for_graph ( self . types , & graph) ;
562+ let mut names =
563+ ConstrainedNameSolver :: new ( StructuralNameModel :: for_graph ( self . types , & graph) , 35 )
564+ . solve ( & graph, & roles, parameter_names, & excluded) ;
565+ fill_remaining_source_names (
560566 & graph,
561567 & roles,
568+ & model,
562569 parameter_names,
563570 & excluded,
564- )
571+ & mut names,
572+ ) ;
573+ names
574+ }
575+ }
576+
577+ fn is_register_style_name ( name : & str ) -> bool {
578+ name. strip_prefix ( 'v' ) . is_some_and ( |digits| {
579+ !digits. is_empty ( ) && digits. bytes ( ) . all ( |byte| byte. is_ascii_digit ( ) )
580+ } )
581+ }
582+
583+ fn fill_remaining_source_names (
584+ graph : & VariableSemanticGraph ,
585+ roles : & VariableRoleScores ,
586+ model : & StructuralNameModel < ' _ > ,
587+ reserved : & [ KotlinIdentifier ] ,
588+ excluded : & BTreeSet < u32 > ,
589+ names : & mut BTreeMap < u32 , KotlinIdentifier > ,
590+ ) {
591+ let mut used = names. values ( ) . cloned ( ) . collect :: < BTreeSet < _ > > ( ) ;
592+ for name in reserved {
593+ used. insert ( name. clone ( ) ) ;
594+ }
595+ for variable in graph. variables ( ) {
596+ if !variable. is_source_binding ( ) || excluded. contains ( & variable. identity ( ) ) {
597+ continue ;
598+ }
599+ if names. contains_key ( & variable. identity ( ) ) {
600+ continue ;
601+ }
602+ let preferred = model
603+ . type_name ( variable. ty ( ) )
604+ . or_else ( || {
605+ roles
606+ . roles ( variable. identity ( ) )
607+ . max_by_key ( |( _, score) | * score)
608+ . filter ( |( _, score) | * score > 0 )
609+ . map ( |( role, _) | {
610+ KotlinIdentifier :: from_hint ( StructuralNameModel :: role_name ( role) )
611+ } )
612+ } )
613+ . unwrap_or_else ( || KotlinIdentifier :: from_hint ( "value" ) ) ;
614+ let name = if used. insert ( preferred. clone ( ) ) {
615+ preferred
616+ } else {
617+ ConstrainedNameSolver :: < StructuralNameModel > :: claim_variant ( & preferred, & mut used)
618+ } ;
619+ names. insert ( variable. identity ( ) , name) ;
565620 }
566621}
0 commit comments