Example #1
0
 internal void Render(LuaTableInitializerExpression node)
 {
     Write(node.OpenBraceToken);
     if (node.Items.Count > 0)
     {
         WriteNewLine();
         AddIndent();
         bool isFirst = true;
         foreach (LuaSyntaxNode itemNode in node.Items)
         {
             if (isFirst)
             {
                 isFirst = false;
             }
             else
             {
                 WriteComma();
                 WriteNewLine();
             }
             itemNode.Render(this);
         }
         Outdent();
         WriteNewLine();
     }
     Write(node.CloseBraceToken);
 }
Example #2
0
        private void AddStructCloneMethodItem(LuaTableInitializerExpression table, LuaIdentifierNameSyntax name, ITypeSymbol typeSymbol)
        {
            LuaExpressionSyntax memberAccess = new LuaMemberAccessExpressionSyntax(LuaIdentifierNameSyntax.This, name);

            CheckValueTypeClone(typeSymbol, ref memberAccess);
            table.Items.Add(new LuaKeyValueTableItemSyntax(new LuaTableLiteralKeySyntax(name), memberAccess));
        }
        private LuaExpressionSyntax CreateQueryAnonymousType(LuaIdentifierNameSyntax key1, LuaExpressionSyntax value1, LuaIdentifierNameSyntax key2, LuaExpressionSyntax value2)
        {
            LuaTableInitializerExpression table = new LuaTableInitializerExpression();

            table.Items.Add(new LuaKeyValueTableItemSyntax(new LuaTableLiteralKeySyntax(key1), value1));
            table.Items.Add(new LuaKeyValueTableItemSyntax(new LuaTableLiteralKeySyntax(key2), value2));
            return(table);
        }
        public override LuaSyntaxNode VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
        {
            var arrayType = (LuaArrayTypeAdapterExpressionSyntax)node.Type.Accept(this);

            if (node.Initializer != null && node.Initializer.Expressions.Count > 0)
            {
                if (arrayType.IsSimapleArray)
                {
                    return(new LuaInvocationExpressionSyntax(arrayType, node.Initializer.Expressions.Select(i => (LuaExpressionSyntax)i.Accept(this))));
                }
                else
                {
                    LuaTableInitializerExpression rankSpecifier        = new LuaTableInitializerExpression();
                    LuaInvocationExpressionSyntax invocationExpression = new LuaInvocationExpressionSyntax(arrayType, rankSpecifier);
                    FillMultiArrayInitializer(node.Initializer, rankSpecifier, invocationExpression, true);
                    return(invocationExpression);
                }
            }
            else
            {
                if (arrayType.IsSimapleArray)
                {
                    var size = arrayType.RankSpecifier.Sizes[0];
                    if (size == null)
                    {
                        return(BuildEmptyArray(arrayType.BaseType));
                    }

                    var constSize = size as LuaLiteralExpressionSyntax;
                    if (constSize != null && constSize.Text == 0.ToString())
                    {
                        return(BuildEmptyArray(arrayType.BaseType));
                    }

                    LuaMemberAccessExpressionSyntax memberAccess = new LuaMemberAccessExpressionSyntax(arrayType, LuaIdentifierNameSyntax.New, true);
                    return(new LuaInvocationExpressionSyntax(memberAccess, size));
                }
                else
                {
                    LuaTableInitializerExpression rankSpecifier = new LuaTableInitializerExpression();
                    foreach (var size in arrayType.RankSpecifier.Sizes)
                    {
                        if (size != null)
                        {
                            rankSpecifier.Items.Add(new LuaSingleTableItemSyntax(size));
                        }
                        else
                        {
                            rankSpecifier.Items.Add(new LuaSingleTableItemSyntax(new LuaIdentifierNameSyntax(0)));
                        }
                    }
                    return(new LuaInvocationExpressionSyntax(arrayType, rankSpecifier));
                }
            }
        }
Example #5
0
        private void ExportManifestFile(List <string> modules, string outFolder)
        {
            const string kDir          = "dir";
            const string kDirInitCode  = "dir = (dir and #dir > 0) and (dir .. '.') or \"\"";
            const string kRequire      = "require";
            const string kLoadCode     = "local load = function(module) return require(dir .. module) end";
            const string kLoad         = "load";
            const string kInit         = "System.init";
            const string kManifestFile = "manifest.lua";

            if (modules.Count > 0)
            {
                modules.Sort();
                var types = GetExportTypes();
                if (types.Count > 0)
                {
                    LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax();
                    functionExpression.AddParameter(new LuaIdentifierNameSyntax(kDir));
                    functionExpression.AddStatement(new LuaIdentifierNameSyntax(kDirInitCode));

                    LuaIdentifierNameSyntax requireIdentifier = new LuaIdentifierNameSyntax(kRequire);
                    functionExpression.AddStatement(new LuaLocalVariableDeclaratorSyntax(requireIdentifier, requireIdentifier));

                    functionExpression.AddStatement(new LuaIdentifierNameSyntax(kLoadCode));
                    functionExpression.AddStatement(LuaBlankLinesStatement.One);

                    LuaIdentifierNameSyntax loadIdentifier = new LuaIdentifierNameSyntax(kLoad);
                    foreach (string module in modules)
                    {
                        var argument   = new LuaStringLiteralExpressionSyntax(new LuaIdentifierNameSyntax(module));
                        var invocation = new LuaInvocationExpressionSyntax(loadIdentifier, argument);
                        functionExpression.AddStatement(invocation);
                    }
                    functionExpression.AddStatement(LuaBlankLinesStatement.One);

                    LuaTableInitializerExpression typeTable = new LuaTableInitializerExpression();
                    foreach (var type in types)
                    {
                        LuaIdentifierNameSyntax typeName = XmlMetaProvider.GetTypeShortName(type);
                        typeTable.Items.Add(new LuaSingleTableItemSyntax(new LuaStringLiteralExpressionSyntax(typeName)));
                    }

                    LuaInvocationExpressionSyntax initInvocation = new LuaInvocationExpressionSyntax(new LuaIdentifierNameSyntax(kInit), typeTable);
                    FillManifestInitConf(initInvocation);
                    functionExpression.AddStatement(initInvocation);

                    LuaCompilationUnitSyntax luaCompilationUnit = new LuaCompilationUnitSyntax();
                    luaCompilationUnit.Statements.Add(new LuaReturnStatementSyntax(functionExpression));

                    string outFile = Path.Combine(outFolder, kManifestFile);
                    Write(luaCompilationUnit, outFile);
                }
            }
        }
        public override LuaSyntaxNode VisitAnonymousObjectCreationExpression(AnonymousObjectCreationExpressionSyntax node)
        {
            LuaTableInitializerExpression table = new LuaTableInitializerExpression();

            foreach (var initializer in node.Initializers)
            {
                var item = (LuaKeyValueTableItemSyntax)initializer.Accept(this);
                table.Items.Add(item);
            }
            return(new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.AnonymousType, table));
        }
Example #7
0
        private List <LuaIdentifierNameSyntax> AddStructCloneMethod(INamedTypeSymbol symbol, LuaStructDeclarationSyntax declaration, LuaExpressionSyntax typeName)
        {
            List <LuaIdentifierNameSyntax> filelds            = new List <LuaIdentifierNameSyntax>();
            LuaFunctionExpressionSyntax    functionExpression = new LuaFunctionExpressionSyntax();

            functionExpression.AddParameter(LuaIdentifierNameSyntax.This);
            LuaTableInitializerExpression cloneTable = new LuaTableInitializerExpression();

            foreach (var member in symbol.GetMembers())
            {
                if (!member.IsStatic && member.Kind != SymbolKind.Method)
                {
                    switch (member.Kind)
                    {
                    case SymbolKind.Field: {
                        IFieldSymbol            memberSymbol = (IFieldSymbol)member;
                        LuaIdentifierNameSyntax name         = new LuaIdentifierNameSyntax(member.Name);
                        AddStructCloneMethodItem(cloneTable, name, memberSymbol.Type);
                        filelds.Add(name);
                        break;
                    }

                    case SymbolKind.Property: {
                        IPropertySymbol memberSymbol = (IPropertySymbol)member;
                        if (IsPropertyField(memberSymbol))
                        {
                            LuaIdentifierNameSyntax name = new LuaIdentifierNameSyntax(member.Name);
                            AddStructCloneMethodItem(cloneTable, name, memberSymbol.Type);
                            filelds.Add(name);
                        }
                        break;
                    }

                    case SymbolKind.Event: {
                        IEventSymbol memberSymbol = (IEventSymbol)member;
                        if (IsEventFiled(memberSymbol))
                        {
                            LuaIdentifierNameSyntax name = new LuaIdentifierNameSyntax(member.Name);
                            AddStructCloneMethodItem(cloneTable, name, null);
                            filelds.Add(name);
                        }
                        break;
                    }
                    }
                }
            }
            functionExpression.AddStatement(new LuaReturnStatementSyntax(new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.setmetatable, cloneTable, typeName)));
            declaration.AddMethod(LuaIdentifierNameSyntax.Clone, functionExpression, false);
            return(filelds);
        }
Example #8
0
        private void FillManifestInitConf(LuaInvocationExpressionSyntax invocation)
        {
            LuaTableInitializerExpression confTable = new LuaTableInitializerExpression();

            if (mainEntryPoint_ != null)
            {
                LuaIdentifierNameSyntax methodName = new LuaIdentifierNameSyntax(mainEntryPoint_.Name);
                var methodTypeName = XmlMetaProvider.GetTypeName(mainEntryPoint_.ContainingType, null);
                var quote          = new LuaIdentifierNameSyntax(LuaSyntaxNode.Tokens.Quote);

                LuaCodeTemplateExpressionSyntax codeTemplate = new LuaCodeTemplateExpressionSyntax();
                codeTemplate.Expressions.Add(quote);
                codeTemplate.Expressions.Add(new LuaMemberAccessExpressionSyntax(methodTypeName, methodName));
                codeTemplate.Expressions.Add(quote);

                confTable.Items.Add(new LuaKeyValueTableItemSyntax(new LuaTableLiteralKeySyntax(methodName), codeTemplate));
            }
            if (confTable.Items.Count > 0)
            {
                invocation.AddArgument(confTable);
            }
        }
        private void FillMultiArrayInitializer(InitializerExpressionSyntax initializer, LuaTableInitializerExpression rankSpecifier, LuaInvocationExpressionSyntax invocation, bool isFirst)
        {
            if (isFirst)
            {
                rankSpecifier.Items.Add(new LuaSingleTableItemSyntax(new LuaIdentifierNameSyntax(initializer.Expressions.Count)));
            }

            int index = 0;

            foreach (var expression in initializer.Expressions)
            {
                if (expression.IsKind(SyntaxKind.ArrayInitializerExpression))
                {
                    FillMultiArrayInitializer((InitializerExpressionSyntax)expression, rankSpecifier, invocation, index == 0);
                }
                else
                {
                    var item = (LuaExpressionSyntax)expression.Accept(this);
                    invocation.AddArgument(item);
                }
                ++index;
            }
        }