@@ -2869,11 +2869,18 @@ fn compile_builtin_function_call(
28692869 arguments
28702870 {
28712871 let mut parent_ctx = ctx;
2872- let mut component_access_tokens = quote ! ( _self) ;
2872+ let mut component_access_tokens = MemberAccess :: Direct ( quote ! ( _self) ) ;
28732873 if let llr:: PropertyReference :: InParent { level, .. } = parent_ref {
28742874 for _ in 0 ..level. get ( ) {
2875- component_access_tokens =
2876- quote ! ( #component_access_tokens. parent. upgrade( ) . unwrap( ) . as_pin_ref( ) ) ;
2875+ component_access_tokens = match component_access_tokens {
2876+ MemberAccess :: Option ( token_stream) => MemberAccess :: Option (
2877+ quote ! ( #token_stream. and_then( |a| a. as_pin_ref( ) . parent. upgrade( ) ) ) ,
2878+ ) ,
2879+ MemberAccess :: Direct ( token_stream) => {
2880+ MemberAccess :: Option ( quote ! ( #token_stream. parent. upgrade( ) ) )
2881+ }
2882+ _ => unreachable ! ( ) ,
2883+ } ;
28772884 parent_ctx = parent_ctx. parent . as_ref ( ) . unwrap ( ) . ctx ;
28782885 }
28792886 }
@@ -2894,7 +2901,7 @@ fn compile_builtin_function_call(
28942901 let close_policy = compile_expression ( close_policy, ctx) ;
28952902 let window_adapter_tokens = access_window_adapter_field ( ctx) ;
28962903 let popup_id_name = internal_popup_id ( * popup_index as usize ) ;
2897- quote ! ( {
2904+ component_access_tokens . then ( |component_access_tokens| quote ! ( {
28982905 let popup_instance = #popup_window_id:: new( #component_access_tokens. self_weak. get( ) . unwrap( ) . clone( ) ) . unwrap( ) ;
28992906 let popup_instance_vrc = sp:: VRc :: map( popup_instance. clone( ) , |x| x) ;
29002907 let position = { let _self = popup_instance_vrc. as_pin_ref( ) ; #position } ;
@@ -2911,7 +2918,7 @@ fn compile_builtin_function_call(
29112918 ) )
29122919 ) ;
29132920 #popup_window_id:: user_init( popup_instance_vrc. clone( ) ) ;
2914- } )
2921+ } ) )
29152922 } else {
29162923 panic ! ( "internal error: invalid args to ShowPopupWindow {arguments:?}" )
29172924 }
@@ -2921,18 +2928,34 @@ fn compile_builtin_function_call(
29212928 arguments
29222929 {
29232930 let mut parent_ctx = ctx;
2924- let mut component_access_tokens = quote ! ( _self) ;
2931+ let mut component_access_tokens = MemberAccess :: Direct ( quote ! ( _self) ) ;
29252932 if let llr:: PropertyReference :: InParent { level, .. } = parent_ref {
29262933 for _ in 0 ..level. get ( ) {
2927- component_access_tokens =
2928- quote ! ( #component_access_tokens. parent. upgrade( ) . unwrap( ) . as_pin_ref( ) ) ;
2934+ component_access_tokens = match component_access_tokens {
2935+ MemberAccess :: Option ( token_stream) => MemberAccess :: Option (
2936+ quote ! ( #token_stream. and_then( |a| a. parent. upgrade( ) ) ) ,
2937+ ) ,
2938+ MemberAccess :: Direct ( token_stream) => {
2939+ MemberAccess :: Option ( quote ! ( #token_stream. parent. upgrade( ) ) )
2940+ }
2941+ _ => unreachable ! ( ) ,
2942+ } ;
29292943 parent_ctx = parent_ctx. parent . as_ref ( ) . unwrap ( ) . ctx ;
29302944 }
29312945 }
29322946 let window_adapter_tokens = access_window_adapter_field ( ctx) ;
29332947 let popup_id_name = internal_popup_id ( * popup_index as usize ) ;
2948+ let current_id_tokens = match component_access_tokens {
2949+ MemberAccess :: Option ( token_stream) => quote ! (
2950+ #token_stream. and_then( |a| a. as_pin_ref( ) . #popup_id_name. take( ) )
2951+ ) ,
2952+ MemberAccess :: Direct ( token_stream) => {
2953+ quote ! ( #token_stream. as_ref( ) . #popup_id_name. take( ) )
2954+ }
2955+ _ => unreachable ! ( ) ,
2956+ } ;
29342957 quote ! (
2935- if let Some ( current_id) = #component_access_tokens . #popup_id_name . take ( ) {
2958+ if let Some ( current_id) = #current_id_tokens {
29362959 sp:: WindowInner :: from_pub( #window_adapter_tokens. window( ) ) . close_popup( current_id) ;
29372960 }
29382961 )
0 commit comments