Esempio n. 1
0
        private static void Verify <T>(string script, T variant,
                                       Func <T, string> getName,
                                       Func <T, bool> isValid = null,
                                       Func <T, ISet <Ability> > getAbilities = null)
        {
            try
            {
                var serializedVariant = script == null ? variant : CSScriptLoaderHelpers.Load <T>(script);
                var name = getName(variant);
                if (name != getName(serializedVariant) ||
                    (isValid != null && !isValid(serializedVariant)))
                {
                    throw new InvalidOperationException("Invalid");
                }

                var abilities = getAbilities?.Invoke(serializedVariant);
                if (abilities != null)
                {
                    foreach (var ability in abilities)
                    {
                        Validate(ability, name);
                    }
                }
            }
            catch (Exception)
            {
                Console.WriteLine(script);
                throw;
            }
        }
Esempio n. 2
0
        private static void Serialize <T>(CSScriptLoaderBase <T> loader, Func <T, T> transform = null)
            where T : class, ILoadable
        {
            Console.WriteLine("Serializing " + typeof(T).Name + " instances...");

            var directory = Path.Combine(AppContext.BaseDirectory, "New", loader.RelativePath);

            Directory.CreateDirectory(directory);
            foreach (var item in loader.GetAll())
            {
                try
                {
                    var itemToSerialize = transform != null?transform(item) : item;

                    string script = null;
                    if (SerializeToScript)
                    {
                        script = CSScriptSerializer.Serialize(itemToSerialize);
                        File.WriteAllText(
                            Path.Combine(
                                loader.RelativePath,
                                CSScriptLoaderHelpers.GetScriptFilename(itemToSerialize.Name)),
                            script);
                    }
                    else
                    {
                        var code = CSClassSerializer.Serialize(
                            itemToSerialize, itemToSerialize.Name, loader.DataType.Namespace, loader.DataType.Name);
                        File.WriteAllText(
                            Path.Combine(directory, CSScriptLoaderHelpers.GetClassFilename(itemToSerialize.Name)),
                            code);
                    }

                    Verify(script, (dynamic)item);
                }
                catch (Exception e)
                {
                    throw new Exception("Failed to serialize " + item.Name, e);
                }
            }
        }
        public static string Serialize(object obj, string targetPropertyName, string targetNamespace,
                                       string targetClassName)
        {
            var expression = CompilationUnit()
                             .WithUsings(List(CSScriptLoaderHelpers.Namespaces.Select(n => UsingDirective(ParseName(n)))))
                             .WithMembers(
                SingletonList <MemberDeclarationSyntax>(
                    NamespaceDeclaration(ParseName(targetNamespace))
                    .WithMembers(
                        SingletonList <MemberDeclarationSyntax>(ClassDeclaration(targetClassName)
                                                                .WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword),
                                                                                         Token(SyntaxKind.StaticKeyword),
                                                                                         Token(SyntaxKind.PartialKeyword)))
                                                                .WithMembers(SingletonList <MemberDeclarationSyntax>(
                                                                                 FieldDeclaration(
                                                                                     VariableDeclaration(GetTypeSyntax(obj.GetType()))
                                                                                     .WithVariables(SingletonSeparatedList(
                                                                                                        VariableDeclarator(Identifier(
                                                                                                                               CSScriptLoaderHelpers.GenerateIdentifier(
                                                                                                                                   targetPropertyName)))
                                                                                                        .WithInitializer(
                                                                                                            EqualsValueClause(GetCreationExpression(obj))))))
                                                                                 .WithModifiers(
                                                                                     TokenList(Token(SyntaxKind.PublicKeyword),
                                                                                               Token(SyntaxKind.StaticKeyword),
                                                                                               Token(SyntaxKind.ReadOnlyKeyword)))))))));

            using (var workspace = new AdhocWorkspace())
            {
                return(Formatter.Format(
                           expression,
                           workspace,
                           workspace.Options)
                       .ToFullString());
            }
        }