194 lines
5.9 KiB
C#
194 lines
5.9 KiB
C#
|
using FishNet.CodeGenerating.Helping;
|
|||
|
using FishNet.CodeGenerating.ILCore;
|
|||
|
using FishNet.CodeGenerating.Processing;
|
|||
|
using FishNet.CodeGenerating.Processing.Rpc;
|
|||
|
using MonoFN.Cecil;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using Unity.CompilationPipeline.Common.Diagnostics;
|
|||
|
#if !UNITY_2020_1_OR_NEWER
|
|||
|
using UnityEngine;
|
|||
|
#endif
|
|||
|
using SR = System.Reflection;
|
|||
|
|
|||
|
|
|||
|
namespace FishNet.CodeGenerating
|
|||
|
{
|
|||
|
|
|||
|
internal class CodegenSession
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Current module for this session.
|
|||
|
/// </summary>
|
|||
|
internal ModuleDefinition Module;
|
|||
|
/// <summary>
|
|||
|
/// Outputs errors when codegen fails.
|
|||
|
/// </summary>
|
|||
|
internal List<DiagnosticMessage> Diagnostics;
|
|||
|
/// <summary>
|
|||
|
/// SyncVars that are being accessed from an assembly other than the currently being processed one.
|
|||
|
/// </summary>
|
|||
|
internal List<FieldDefinition> DifferentAssemblySyncVars = new List<FieldDefinition>();
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// CodegenBase classes for processing a module.
|
|||
|
/// </summary>
|
|||
|
private List<CodegenBase> _bases;
|
|||
|
/// <summary>
|
|||
|
/// Quick lookup of base classes.
|
|||
|
/// </summary>
|
|||
|
private Dictionary<string, CodegenBase> _basesCache = new Dictionary<string, CodegenBase>();
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns class of type if found within CodegenBase classes.
|
|||
|
/// </summary>
|
|||
|
/// <typeparam name="T"></typeparam>
|
|||
|
/// <returns></returns>
|
|||
|
internal T GetClass<T>() where T : CodegenBase
|
|||
|
{
|
|||
|
string tName = typeof(T).Name;
|
|||
|
return (T)_basesCache[tName];
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Resets all helpers while importing any information needed by them.
|
|||
|
/// </summary>
|
|||
|
/// <param name="module"></param>
|
|||
|
/// <returns></returns>
|
|||
|
internal bool Initialize(ModuleDefinition module)
|
|||
|
{
|
|||
|
Module = module;
|
|||
|
Diagnostics = new List<DiagnosticMessage>();
|
|||
|
|
|||
|
_bases = new List<CodegenBase>()
|
|||
|
{
|
|||
|
new ReaderImports(), new ReaderProcessor()
|
|||
|
,new WriterImports(), new WriterProcessor()
|
|||
|
, new PhysicsHelper(), new TimeManagerHelper(), new AttributeHelper(), new GeneralHelper()
|
|||
|
, new ObjectHelper(), new NetworkBehaviourHelper()
|
|||
|
, new CreatedSyncVarGenerator(), new TransportHelper()
|
|||
|
, new NetworkConnectionImports(), new PredictedObjectHelper(), new GeneratorHelper()
|
|||
|
, new CustomSerializerProcessor()
|
|||
|
, new NetworkBehaviourProcessor()
|
|||
|
, new QolAttributeProcessor()
|
|||
|
, new RpcProcessor()
|
|||
|
, new NetworkBehaviourSyncProcessor()
|
|||
|
, new PredictionProcessor()
|
|||
|
};
|
|||
|
|
|||
|
//Add all to dictionary first, then import.
|
|||
|
foreach (CodegenBase item in _bases)
|
|||
|
{
|
|||
|
string tName = item.GetType().Name;
|
|||
|
_basesCache.Add(tName, item);
|
|||
|
}
|
|||
|
|
|||
|
//Initialize.
|
|||
|
foreach (CodegenBase item in _bases)
|
|||
|
{
|
|||
|
item.Initialize(this);
|
|||
|
if (!item.ImportReferences())
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#region Logging.
|
|||
|
/// <summary>
|
|||
|
/// Logs a warning.
|
|||
|
/// </summary>
|
|||
|
/// <param name="msg"></param>
|
|||
|
internal void LogWarning(string msg)
|
|||
|
{
|
|||
|
#if UNITY_2020_1_OR_NEWER
|
|||
|
Diagnostics.AddWarning(msg);
|
|||
|
#else
|
|||
|
Debug.LogWarning(msg);
|
|||
|
#endif
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Logs an error.
|
|||
|
/// </summary>
|
|||
|
/// <param name="msg"></param>
|
|||
|
internal void LogError(string msg)
|
|||
|
{
|
|||
|
#if UNITY_2020_1_OR_NEWER
|
|||
|
Diagnostics.AddError(msg);
|
|||
|
#else
|
|||
|
Debug.LogError(msg);
|
|||
|
#endif
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region ImportReference.
|
|||
|
|
|||
|
public MethodReference ImportReference(SR.MethodBase method)
|
|||
|
{
|
|||
|
return Module.ImportReference(method);
|
|||
|
}
|
|||
|
|
|||
|
public MethodReference ImportReference(SR.MethodBase method, IGenericParameterProvider context)
|
|||
|
{
|
|||
|
return Module.ImportReference(method, context);
|
|||
|
}
|
|||
|
|
|||
|
public TypeReference ImportReference(TypeReference type)
|
|||
|
{
|
|||
|
return Module.ImportReference(type);
|
|||
|
}
|
|||
|
|
|||
|
public TypeReference ImportReference(TypeReference type, IGenericParameterProvider context)
|
|||
|
{
|
|||
|
return Module.ImportReference(type, context);
|
|||
|
}
|
|||
|
|
|||
|
public FieldReference ImportReference(FieldReference field)
|
|||
|
{
|
|||
|
return Module.ImportReference(field);
|
|||
|
}
|
|||
|
|
|||
|
public FieldReference ImportReference(FieldReference field, IGenericParameterProvider context)
|
|||
|
{
|
|||
|
return Module.ImportReference(field, context);
|
|||
|
}
|
|||
|
public MethodReference ImportReference(MethodReference method)
|
|||
|
{
|
|||
|
return Module.ImportReference(method);
|
|||
|
}
|
|||
|
|
|||
|
public MethodReference ImportReference(MethodReference method, IGenericParameterProvider context)
|
|||
|
{
|
|||
|
return Module.ImportReference(method, context);
|
|||
|
}
|
|||
|
public TypeReference ImportReference(System.Type type)
|
|||
|
{
|
|||
|
return ImportReference(type, null);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public TypeReference ImportReference(System.Type type, IGenericParameterProvider context)
|
|||
|
{
|
|||
|
return Module.ImportReference(type, context);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public FieldReference ImportReference(SR.FieldInfo field)
|
|||
|
{
|
|||
|
return Module.ImportReference(field);
|
|||
|
}
|
|||
|
|
|||
|
public FieldReference ImportReference(SR.FieldInfo field, IGenericParameterProvider context)
|
|||
|
{
|
|||
|
return Module.ImportReference(field, context);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|