private static string GenerateProviderSource(Type type) { /* Example: * * namespace Ludiq.PeekCore.Generated.PropertyProviders * { * [Ludiq.SerializedPropertyProvider(typeof(MyNamespace.MyType))] * public class MyNamespace_MyType : SerializedPropertyProvider<MyNamespace.MyType> { } * } * */ Ensure.That(nameof(type)).IsNotNull(type); var unit = new CodeCompileUnit(); var @namespace = new CodeNamespace("Ludiq.Generated.PropertyProviders"); unit.Namespaces.Add(@namespace); var @class = new CodeClassTypeDeclaration(CodeMemberModifiers.Public, GetProviderScriptName(type)); @class.BaseTypes.Add(Code.TypeRef(typeof(SerializedPropertyProvider <>).MakeGenericType(type))); var serializedPropertyProviderAttribute = new CodeAttributeDeclaration(Code.TypeRef(typeof(RegisterSerializedPropertyProviderAttribute), true), new[] { new CodeAttributeArgument(new CodeTypeOfExpression(new CodeTypeReference(type, true))) }); @class.CustomAttributes.Add(serializedPropertyProviderAttribute); @namespace.Types.Add(@class); using (var stringWriter = new StringWriter()) { CodeGenerator.GenerateCodeFromCompileUnit(unit, new TextCodeWriter(stringWriter), new CodeGeneratorOptions(indentString: "\t")); return(stringWriter.ToString()); } }
public static void GenerateStubScript(string scriptPath, IEnumerable <object> stubs) { Ensure.That(nameof(stubs)).IsNotNull(stubs); var stubWriters = stubs.Select(s => AotStubWriterProvider.instance.GetDecorator(s)).ToHashSet(); var unit = new CodeCompileUnit(); unit.StartDirectives.Add(new CodePragmaWarningDirective(CodePragmaWarningSetting.Disable, new[] { 219 })); // Disable unused variable warning var @namespace = new CodeNamespace("Ludiq.Generated.Aot"); unit.Namespaces.Add(@namespace); var @class = new CodeClassTypeDeclaration(CodeMemberModifiers.Public, "AotStubs"); @class.CustomAttributes.Add(new CodeAttributeDeclaration(Code.TypeRef(typeof(PreserveAttribute)))); @namespace.Types.Add(@class); var usedMethodNames = new HashSet <string>(); foreach (var stubWriter in stubWriters.OrderBy(sw => sw.stubMethodComment)) { if (stubWriter.skip) { continue; } var methodName = stubWriter.stubMethodName; var i = 0; while (usedMethodNames.Contains(methodName)) { methodName = stubWriter.stubMethodName + "_" + i++; } usedMethodNames.Add(methodName); var method = new CodeMethodMember(CodeMemberModifiers.Public | CodeMemberModifiers.Static, Code.TypeRef(typeof(void)), methodName, Enumerable.Empty <CodeParameterDeclaration>(), stubWriter.GetStubStatements().ToArray()); method.CustomAttributes.Add(new CodeAttributeDeclaration(Code.TypeRef(typeof(PreserveAttribute), true))); method.Comments.Add(new CodeComment(stubWriter.stubMethodComment)); @class.Members.Add(method); } PathUtility.CreateDirectoryIfNeeded(LudiqCore.Paths.transientGenerated); VersionControlUtility.Unlock(scriptPath); if (File.Exists(scriptPath)) { File.Delete(scriptPath); } using (var scriptWriter = new StreamWriter(scriptPath)) { CodeGenerator.GenerateCodeFromCompileUnit(unit, new TextCodeWriter(scriptWriter), new CodeGeneratorOptions(indentString: "\t")); } }