@@ -359,32 +359,23 @@ module HashTastMemberOrVals =
359359        |  Some _  ->  hashMember ( g,  obs)  emptyTyparInst vref.Deref
360360
361361/// Lossless accumulation of TType structure 
362- module  TypeStructural  = 
363-     // Helper struct whose instances are never equal (even to themselves). 
362+ module  StructuralUtilities  = 
364363    [<Struct;  CustomEquality;  NoComparison>] 
365364    type  NeverEqual  = 
366365        struct 
367366            interface  System.IEquatable< NeverEqual>  with 
368367                member  _.Equals  _  =  false 
369- 
370-             override  _.Equals ( _ )  =  false 
368+             override  _.Equals  _  =  false 
371369            override  _.GetHashCode ()  =  0 
372370        end 
373371
374-     [<Struct;  NoComparison>] 
372+     [<Struct;  NoComparison;  RequireQualifiedAccess >] 
375373    type  NullnessToken  = 
376374        |  Known of  info :  NullnessInfo 
377375        |  Variable of  never :  NeverEqual 
378376        |  Absent
379377
380-     /// Convert compiler Nullness info to token form 
381- let inline  toNullnessToken   ( n :  Nullness )  = 
382-         match  n with 
383-         |  Nullness.Known k ->  NullnessToken.Known k
384-         |  Nullness.Variable _  ->  NullnessToken.Variable( NeverEqual()) 
385- 
386-     /// Tokens capturing a lossless, structural representation of TType needed for deterministic keys. 
387- [<Struct;  NoComparison>] 
378+     [<Struct;  NoComparison;  RequireQualifiedAccess>] 
388379    type  TypeToken  = 
389380        |  Stamp of  stamp :  Stamp 
390381        |  UCase of  name :  string 
@@ -395,59 +386,70 @@ module TypeStructural =
395386
396387    type  TypeStructure  =  TypeToken[] 
397388
398-     /// Accumulate Measure to MeasureToken 
399- let rec  private  accumulateMeasure  m acc  = 
389+     [<Literal>] 
390+     let  private  initialTokenCapacity  =  4 
391+ 
392+     // Single reusable token for Nullness.Variable 
393+     let  private  neverEqual  =  NullnessToken.Variable( NeverEqual()) 
394+ 
395+     let inline  toNullnessToken   ( n :  Nullness )  = 
396+         match  n with 
397+         |  Nullness.Known k ->  NullnessToken.Known k
398+         // If nullness is not known we must treat the types as not equal for caching purposes. 
399+         |  Nullness.Variable _  ->  neverEqual
400+ 
401+     let rec  private  accumulateMeasure   ( tokens :  ResizeArray < TypeToken >)  ( m :  Measure )  = 
400402        match  m with 
401-         |  Measure.Var mv ->  acc ( Stamp mv.Stamp) 
402-         |  Measure.Const( tcref,  _)  ->  acc ( Stamp tcref.Stamp) 
403+         |  Measure.Var mv -> 
404+             tokens.Add( TypeToken.Stamp mv.Stamp) 
405+         |  Measure.Const( tcref,  _)  -> 
406+             tokens.Add( TypeToken.Stamp tcref.Stamp) 
403407        |  Measure.Prod( m1,  m2,  _)  -> 
404-             accumulateMeasure m1 acc
405-             accumulateMeasure m2 acc
406-         |  Measure.Inv m1 ->  accumulateMeasure m1 acc
407-         |  Measure.One _  ->  acc MeasureOne
408+             accumulateMeasure tokens m1
409+             accumulateMeasure tokens m2
410+         |  Measure.Inv m1 -> 
411+             accumulateMeasure tokens m1
412+         |  Measure.One _  -> 
413+             tokens.Add( TypeToken.MeasureOne) 
408414        |  Measure.RationalPower( m1,  r)  -> 
409-             accumulateMeasure m1 acc 
410-             acc  ( MeasureRational r) 
415+             accumulateMeasure tokens m1 
416+             tokens.Add ( TypeToken. MeasureRational r) 
411417
412-     /// Accumulate a TType into a lossless token list. Uses stamps for identity where appropriate (matching hashTType logic). 
413- let rec  private  accumulateTType   ( ty :  TType )  acc  = 
418+     let rec  private  accumulateTType   ( tokens :  ResizeArray < TypeToken >)  ( ty :  TType )  = 
414419        match  ty with 
415420        |  TType_ ucase( u,  tinst)  -> 
416-             acc ( UCase u.CaseName) 
417- 
421+             tokens.Add( TypeToken.UCase u.CaseName) 
418422            for  arg in  tinst do 
419-                 accumulateTType arg acc 
423+                 accumulateTType tokens arg 
420424        |  TType_ app( tcref,  tinst,  n)  -> 
421-             acc ( Stamp tcref.Stamp) 
422-             acc ( Nullness( toNullnessToken n)) 
423- 
425+             tokens.Add( TypeToken.Stamp tcref.Stamp) 
426+             tokens.Add( TypeToken.Nullness( toNullnessToken n)) 
424427            for  arg in  tinst do 
425-                 accumulateTType arg acc 
428+                 accumulateTType tokens arg 
426429        |  TType_ anon( info,  tys)  -> 
427-             acc ( Stamp info.Stamp) 
428- 
430+             tokens.Add( TypeToken.Stamp info.Stamp) 
429431            for  arg in  tys do 
430-                 accumulateTType arg acc 
432+                 accumulateTType tokens arg 
431433        |  TType_ tuple( tupInfo,  tys)  -> 
432-             acc ( TupInfo( evalTupInfoIsStruct tupInfo)) 
433- 
434+             tokens.Add( TypeToken.TupInfo( evalTupInfoIsStruct tupInfo)) 
434435            for  arg in  tys do 
435-                 accumulateTType arg acc 
436+                 accumulateTType tokens arg 
436437        |  TType_ forall( tps,  tau)  -> 
437438            for  tp in  tps do 
438-                 acc ( Stamp tp.Stamp) 
439- 
440-             accumulateTType tau acc
439+                 tokens.Add( TypeToken.Stamp tp.Stamp) 
440+             accumulateTType tokens tau
441441        |  TType_ fun( d,  r,  n)  -> 
442-             accumulateTType d acc 
443-             accumulateTType r acc 
444-             acc  ( Nullness( toNullnessToken n)) 
442+             accumulateTType tokens d 
443+             accumulateTType tokens r 
444+             tokens.Add ( TypeToken. Nullness( toNullnessToken n)) 
445445        |  TType_ var( r,  n)  -> 
446-             acc ( Stamp r.Stamp) 
447-             acc ( Nullness( toNullnessToken n)) 
448-         |  TType_ measure m ->  accumulateMeasure m acc
446+             tokens.Add( TypeToken.Stamp r.Stamp) 
447+             tokens.Add( TypeToken.Nullness( toNullnessToken n)) 
448+         |  TType_ measure m -> 
449+             accumulateMeasure tokens m
449450
451+     /// Get the full structure of a type as a sequence of tokens, suitable for equality  
450452let  getTypeStructure  ty  = 
451-         let  tokens  =  ResizeArray( )
452-         accumulateTType ty  tokens.Add 
453+         let  tokens  =  ResizeArray< TypeToken >( initialTokenCapacity ) 
454+         accumulateTType tokens ty 
453455        tokens.ToArray() 
0 commit comments