@@ -16,6 +16,7 @@ import {
1616 useSearchMetadata ,
1717} from "./utils/filtering" ;
1818import { formatHexOffset } from "./utils/format" ;
19+ import { computeBitfieldInfo , type BitfieldInfo } from "./utils/bitfields" ;
1920import {
2021 CollapsedItemsLink ,
2122 CommonGroupMembers ,
@@ -186,6 +187,8 @@ export const SchemaClassView: React.FC<{
186187 return { matchingFields : matching , hiddenCount : declaration . fields . length - matching . length } ;
187188 } , [ declaration . fields , searchWords , searchOffsets , searchMetadata , collapseNonMatching ] ) ;
188189
190+ const bitfieldInfo = useMemo ( ( ) => computeBitfieldInfo ( declaration . fields ) , [ declaration . fields ] ) ;
191+
189192 return (
190193 < CommonGroupWrapper >
191194 < DeclarationHeader >
@@ -210,6 +213,7 @@ export const SchemaClassView: React.FC<{
210213 < SchemaFieldView
211214 key = { `${ field . name } -${ field . offset } ` }
212215 field = { field }
216+ bitfield = { bitfieldInfo . get ( field ) }
213217 highlighted = {
214218 collapseNonMatching ||
215219 ( searchWords . length > 0 && matchesWords ( field . name , searchWords ) ) ||
@@ -341,26 +345,74 @@ function InheritedFieldView({ field }: { field: api.SchemaField }) {
341345 ) ;
342346}
343347
344- function SchemaFieldView ( { field, highlighted } : { field : api . SchemaField ; highlighted : boolean } ) {
348+ const BitRange = styled . span `
349+ font-family:
350+ ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
351+ font-size: 13px;
352+ font-weight: 500;
353+ color: var(--text-dim);
354+ font-variant-numeric: tabular-nums;
355+ ` ;
356+
357+ const BitfieldPadding = styled . div `
358+ padding: 3px 10px;
359+ font-size: 13px;
360+ color: var(--text-dim);
361+ opacity: 0.5;
362+ font-style: italic;
363+ text-align: right;
364+ ` ;
365+
366+ function SchemaFieldView ( {
367+ field,
368+ bitfield,
369+ highlighted,
370+ } : {
371+ field : api . SchemaField ;
372+ bitfield ?: BitfieldInfo ;
373+ highlighted : boolean ;
374+ } ) {
345375 const { root } = useContext ( DeclarationsContext ) ;
346376 const navigate = useNavigate ( ) ;
347377 const offsetHex = formatHexOffset ( field . offset ) ;
348378 return (
349- < FieldRow data-highlighted = { highlighted || undefined } >
350- < FieldIcon >
351- < KindIcon kind = "field" size = "small" />
352- </ FieldIcon >
353- < FieldContent >
354- < FieldSignature >
355- { field . name } : < SchemaTypeView type = { field . type } />
356- < FieldOffset
357- onClick = { ( ) => navigate ( `${ root } ?search=${ encodeURIComponent ( `offset:${ offsetHex } ` ) } ` ) }
358- >
359- { field . offset } ({ offsetHex } )
360- </ FieldOffset >
361- </ FieldSignature >
362- < MetadataTags metadata = { field . metadata } />
363- </ FieldContent >
364- </ FieldRow >
379+ < >
380+ < FieldRow data-highlighted = { highlighted || undefined } >
381+ < FieldIcon >
382+ < KindIcon kind = "field" size = "small" />
383+ </ FieldIcon >
384+ < FieldContent >
385+ < FieldSignature >
386+ { field . name } : < SchemaTypeView type = { field . type } />
387+ { bitfield && (
388+ < BitRange >
389+ bit{ bitfield . bitCount !== 1 ? "s" : "" } { bitfield . bitOffset }
390+ { bitfield . bitCount !== 1 ? `..${ bitfield . bitOffset + bitfield . bitCount - 1 } ` : "" }
391+ </ BitRange >
392+ ) }
393+ < FieldOffset
394+ onClick = { ( ) =>
395+ navigate ( `${ root } ?search=${ encodeURIComponent ( `offset:${ offsetHex } ` ) } ` )
396+ }
397+ >
398+ { field . offset } ({ offsetHex } )
399+ </ FieldOffset >
400+ </ FieldSignature >
401+ < MetadataTags metadata = { field . metadata } />
402+ </ FieldContent >
403+ </ FieldRow >
404+ { bitfield &&
405+ bitfield . totalBits > 0 &&
406+ ( ( ) => {
407+ const totalBytes = Math . ceil ( bitfield . totalBits / 8 ) ;
408+ return (
409+ < BitfieldPadding >
410+ { totalBytes } byte{ totalBytes !== 1 ? "s" : "" } ({ bitfield . totalBits } bit
411+ { bitfield . totalBits !== 1 ? "s" : "" }
412+ { bitfield . padding > 0 ? ` + ${ bitfield . padding } padding` : "" } )
413+ </ BitfieldPadding >
414+ ) ;
415+ } ) ( ) }
416+ </ >
365417 ) ;
366418}
0 commit comments