Better showing templates

x) Remove oid
x) Make res ?
x) Dont show types when the type is the same as its enclosing type
This commit is contained in:
Marc Hernandez 2024-05-02 18:27:28 -07:00
parent da63a246e6
commit 0c37db10b5
3 changed files with 59 additions and 29 deletions

View File

@ -100,9 +100,6 @@ public record class Versioned<T> : Imm
Meta Imm.Meta => MetaStorage;
ObjectIDGenerator oIdGen = new();
[lib.Dont]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
internal ChangeDelegate OnChange = (old, cur) => {};
@ -114,8 +111,7 @@ public record class Versioned<T> : Imm
[CallerLineNumber] int dbgLine = 0
)
{
var oid = oIdGen.GetId( fn, out var firstTime );
log.debug( $"ADD {oid}/{firstTime} {log.whatFile(dbgPath)}({dbgLine}): {dbgName} added OnChange bcs {reason}" );
log.debug( $"ADD {log.whatFile(dbgPath)}({dbgLine}): {dbgName} added OnChange bcs {reason}" );
OnChange += fn;
}
@ -125,8 +121,7 @@ public record class Versioned<T> : Imm
[CallerLineNumber] int dbgLine = 0
)
{
var oid = oIdGen.GetId( fn, out var firstTime );
log.debug( $"REM {oid}/{firstTime}{log.whatFile(dbgPath)}({dbgLine}): {dbgName} removing OnChange" );
log.debug( $"REM {log.whatFile(dbgPath)}({dbgLine}): {dbgName} removing OnChange" );
OnChange -= fn;
}

View File

@ -59,7 +59,7 @@ namespace res
[Serializable]
public class Ref<T> : Ref where T : class
{
public T res => m_res != null ? m_res : ( m_res = Mgr.load<T>( Filename ) );
public T? res => m_res != null ? m_res : ( m_res = Mgr.load<T>( Filename ) );
//For serialization
public Ref()
@ -254,7 +254,7 @@ namespace res
}
//*/
static public T load<T>( string filename ) where T : class
static public T? load<T>( string filename ) where T : class
{
if( ResCache<T>.s_cache.TryGetValue( filename, out var wr ) )
{

View File

@ -978,10 +978,10 @@ namespace lib
public void Serialize( Stream stream, object root )
{
Serialize( stream, null, root );
Serialize( stream, null, typeof( object ), root );
}
public void Serialize( Stream stream, MemberInfo mi, object root )
public void Serialize( Stream stream, MemberInfo mi, Type mType, object root )
{
//lib.log.info( "Serialize( Stream stream, object root ) {0} {1}", m_rndVal, m_alreadySerialized.Count );
@ -992,7 +992,7 @@ namespace lib
writer.Formatting = Formatting.Indented;
Serialize( writer, mi, root );
Serialize( writer, mi, mType, root );
//Rely on the parent closing the stream.
//writer.Close();
@ -1001,14 +1001,14 @@ namespace lib
//lib.log.info( "Serialize END ( Stream stream, object root ) {0} {1}", m_rndVal, m_alreadySerialized.Count );
}
private void Serialize( XmlWriter writer, MemberInfo mi, object root )
private void Serialize( XmlWriter writer, MemberInfo mi, Type mType, object root )
{
//writer.WriteStartDocument();
Serialize( writer, mi, root, "root", 1, true );
Serialize( writer, mi, mType, root, "root", 1, true );
//writer.WriteEndDocument();
}
private void Serialize( XmlWriter writer, MemberInfo mi, object root, string name, int depth, bool forceType )
private void Serialize( XmlWriter writer, MemberInfo mi, Type mType, object root, string name, int depth, bool forceType )
{
if( root != null )
{
@ -1035,16 +1035,16 @@ namespace lib
{
if( IsEnumerable( type ) )
{
SerializeCollection( writer, mi, root, depth );
SerializeCollection( writer, mi, mType, root, depth );
}
else
{
SerializeObject( writer, mi, root, depth );
SerializeObject( writer, mi, mType, root, depth );
}
}
else
{
SerializeArray( writer, mi, root, depth );
SerializeArray( writer, mi, mType, root, depth );
}
}
}
@ -1065,6 +1065,7 @@ namespace lib
{
if( forceType )
writer.WriteAttributeString( "_.t", getTypeName( root.GetType() ) );
writer.WriteAttributeString( "v", root.ToString() );
}
else
@ -1073,7 +1074,7 @@ namespace lib
}
}
private void SerializeCollection( XmlWriter writer, MemberInfo mi, object root, int depth )
private void SerializeCollection( XmlWriter writer, MemberInfo? mi, Type mType, object root, int depth )
{
IEnumerable it = root as IEnumerable;
@ -1083,7 +1084,11 @@ namespace lib
Type type = root.GetType();
writer.WriteAttributeString( "_.t", getTypeName( type ) );
if( mType != type )
{
log.info( $"Coll: {mType.Name} {mi?.Name} != {type.Name}" );
writer.WriteAttributeString( "_.t", getTypeName( type ) );
}
bool first;
@ -1104,16 +1109,24 @@ namespace lib
int i = 0;
foreach( var v in it )
{
Serialize( writer, mi, v, "i" + i.ToString(), depth + 1, false );
Serialize( writer, null, typeElem, v, "i" + i.ToString(), depth + 1, false );
++i;
}
}
}
private void SerializeObject( XmlWriter writer, MemberInfo mi, object root, int depth )
private void SerializeObject( XmlWriter writer, MemberInfo mi, Type mType, object root, int depth )
{
writer.WriteAttributeString( "_.t", getTypeName( root.GetType() ) );
if( mType != root.GetType() )
{
var rType = root.GetType();
var rTypeName = !rType.IsNested ? rType.Name : $"{rType.DeclaringType.Name}.{rType.Name}";
var mTypeName = !mType.IsNested ? mType.Name : $"{mType.DeclaringType.Name}.{mType.Name}";
var rootTypeName = !mType.IsNested ? mType.Name : $"{mType.DeclaringType.Name}.{mType.Name}";
log.info( $"SerObj {mTypeName} != {rTypeName}" );
writer.WriteAttributeString( "_.t", getTypeName( root.GetType() ) );
}
if( depth == 1 )
{
@ -1159,7 +1172,7 @@ namespace lib
name = refl.TypeToIdentifier( name );
Serialize( writer, mi, serMember.Value, name, depth, true );
Serialize( writer, mi, mType, serMember.Value, name, depth, true );
}
return;
@ -1200,6 +1213,8 @@ namespace lib
HashSet<string> whitelistFields, whitelistProps;
GetFilters( _cfg.TypesDefault, mi, narrowType, out filterFields, out filterProps, out doImpls, out doFields, out doProps, out whitelistFields, out whitelistProps );
var isImm = typeof(imm.Imm).IsAssignableFrom( narrowType );
if( doFields || doImpls )
{
var fields = refl.GetAllFields( narrowType );
@ -1227,6 +1242,12 @@ namespace lib
continue;
}
if( isImm )
{
if( name == "MetaStorage" ) continue;
if( name == "Fn" ) continue;
}
if( FilterField( filterFields, doImpls, whitelistFields, childFi as MemberInfo, name ) )
continue;
@ -1245,7 +1266,7 @@ namespace lib
propName :
name;
Serialize( writer, childFi, childFi.GetValue( root ), finalName, depth + 1, false );
Serialize( writer, childFi, childFi.FieldType, childFi.GetValue( root ), finalName, depth + 1, false );
}
}
@ -1263,6 +1284,12 @@ namespace lib
continue;
}
if( isImm )
{
if( name == "MetaStorage" ) continue;
if( name == "Fn" ) continue;
}
if( FilterField( filterProps, doImpls, whitelistProps, childPi as MemberInfo, name ) )
continue;
@ -1275,7 +1302,7 @@ namespace lib
name = refl.TypeToIdentifier( name );
Serialize( writer, childPi, childPi.GetValue( root ), name, depth + 1, false );
Serialize( writer, childPi, childPi.PropertyType, childPi.GetValue( root ), name, depth + 1, false );
}
}
@ -1298,7 +1325,7 @@ namespace lib
whitelistProps = new( custWLProps?.Values ?? new string[0] );
}
private void SerializeArray( XmlWriter writer, MemberInfo mi, object root, int depth )
private void SerializeArray( XmlWriter writer, MemberInfo mi, Type mType, object root, int depth )
{
Array arr = (Array)root;
@ -1306,7 +1333,14 @@ namespace lib
Type type = root.GetType();
writer.WriteAttributeString( "_.t", getTypeName( type ) );
Type typeOfMember = typeof( object );
if( mi is FieldInfo fi ) typeOfMember = fi.FieldType;
if( mi is PropertyInfo pi ) typeOfMember = pi.PropertyType;
if( typeOfMember != type )
{
log.info( $"SerArr {typeOfMember.Name} {mi?.Name} != {type.Name}" );
writer.WriteAttributeString( "_.t", getTypeName( type ) );
}
bool first;
@ -1324,10 +1358,11 @@ namespace lib
m_alreadySerialized[refInt] = root;
}
//typeElem.MemberType
for( int i = 0; i < arr.Length; ++i )
{
Serialize( writer, mi, arr.GetValue( i ), "i" + i.ToString(), depth + 1, false );
Serialize( writer, mi, typeElem, arr.GetValue( i ), "i" + i.ToString(), depth + 1, false );
}
}
}