@@ -359,40 +359,13 @@ function field_offset_and_type(
359
359
)
360
360
elseif S <: Geometry.AdjointAxisVector
361
361
return field_offset_and_type (name_pair, T, fieldtype (S, 1 ), key_error)
362
- else
363
- child_name, remaining_field_chain =
364
- if name_pair[1 ] != @name () &&
365
- extract_first (name_pair[1 ]) in fieldnames (S)
366
- @inline (
367
- extract_first (name_pair[1 ]),
368
- (drop_first (name_pair[1 ]), name_pair[2 ]),
369
- )
370
- elseif name_pair[2 ] != @name () &&
371
- extract_first (name_pair[2 ]) in fieldnames (S)
372
- @inline (
373
- extract_first (name_pair[2 ]),
374
- (name_pair[1 ], drop_first (name_pair[2 ])),
375
- )
376
- elseif ! any (isequal (@name ()), name_pair) # implicit tensor structure
377
- (remaining_offset, end_type, apply_zero) =
378
- field_offset_and_type (
379
- (drop_first (name_pair[1 ]), drop_first (name_pair[2 ])),
380
- T,
381
- S,
382
- key_error,
383
- )
384
- return (
385
- remaining_offset,
386
- end_type,
387
- extract_first (name_pair[1 ]) == extract_first (name_pair[2 ]) ?
388
- apply_zero : true ,
389
- )
390
- else
391
- throw (key_error)
392
- end
393
- child_type = fieldtype (S, child_name)
362
+ elseif name_pair[1 ] != @name () &&
363
+ extract_first (name_pair[1 ]) in fieldnames (S)
364
+
365
+ remaining_field_chain = (drop_first (name_pair[1 ]), name_pair[2 ])
366
+ child_type = fieldtype (S, extract_first (name_pair[1 ]))
394
367
field_index = unrolled_filter (
395
- i -> fieldname (S, i) == child_name ,
368
+ i -> fieldname (S, i) == extract_first (name_pair[ 1 ]) ,
396
369
1 : fieldcount (S),
397
370
)[1 ]
398
371
(remaining_offset, end_type, apply_zero) = field_offset_and_type (
@@ -406,7 +379,41 @@ function field_offset_and_type(
406
379
end_type,
407
380
apply_zero,
408
381
)
382
+ elseif name_pair[2 ] != @name () &&
383
+ extract_first (name_pair[2 ]) in fieldnames (S)
409
384
385
+ remaining_field_chain = name_pair[1 ], drop_first (name_pair[2 ])
386
+ child_type = fieldtype (S, extract_first (name_pair[2 ]))
387
+ field_index = unrolled_filter (
388
+ i -> fieldname (S, i) == extract_first (name_pair[2 ]),
389
+ 1 : fieldcount (S),
390
+ )[1 ]
391
+ (remaining_offset, end_type, apply_zero) = field_offset_and_type (
392
+ remaining_field_chain,
393
+ T,
394
+ child_type,
395
+ key_error,
396
+ )
397
+ return (
398
+ DataLayouts. fieldtypeoffset (T, S, field_index) + remaining_offset,
399
+ end_type,
400
+ apply_zero,
401
+ )
402
+ elseif ! any (isequal (@name ()), name_pair) # implicit tensor structure
403
+ (remaining_offset, end_type, apply_zero) = field_offset_and_type (
404
+ (drop_first (name_pair[1 ]), drop_first (name_pair[2 ])),
405
+ T,
406
+ S,
407
+ key_error,
408
+ )
409
+ return (
410
+ remaining_offset,
411
+ end_type,
412
+ extract_first (name_pair[1 ]) == extract_first (name_pair[2 ]) ?
413
+ apply_zero : true ,
414
+ )
415
+ else
416
+ throw (key_error)
410
417
end
411
418
end
412
419
if hasfield (Method, :recursion_relation )
0 commit comments