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());
            }
        }
Ejemplo n.º 2
0
        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"));
            }
        }