private void TryAddStructDefaultMethod(INamedTypeSymbol symbol, LuaStructDeclarationSyntax declaration) {
   if (declaration.IsInitStatementExists) {
     LuaIdentifierNameSyntax className = new LuaIdentifierNameSyntax(symbol.Name);
     var thisIdentifier = LuaIdentifierNameSyntax.This;
     LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax();
     functionExpression.AddParameter(className);
     var invocation = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.setmetatable, LuaTableInitializerExpression.Empty, className);
     LuaLocalVariableDeclaratorSyntax local = new LuaLocalVariableDeclaratorSyntax(thisIdentifier, invocation);
     functionExpression.AddStatement(local);
     functionExpression.AddStatement(new LuaExpressionStatementSyntax(new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.Init, thisIdentifier)));
     functionExpression.AddStatement(new LuaReturnStatementSyntax(thisIdentifier));
     declaration.AddMethod(LuaIdentifierNameSyntax.Default, functionExpression, false);
   }
 }
Пример #2
0
        private void AddStructEqualsObjMethod(INamedTypeSymbol symbol, LuaStructDeclarationSyntax declaration, LuaExpressionSyntax typeName, List <LuaIdentifierNameSyntax> fields)
        {
            var thisIdentifier = LuaIdentifierNameSyntax.This;
            LuaIdentifierNameSyntax     obj = LuaIdentifierNameSyntax.Obj;
            LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax();

            functionExpression.AddParameter(thisIdentifier);
            functionExpression.AddParameter(obj);

            var left = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.getmetatable, obj);
            LuaIfStatementSyntax ifStatement = new LuaIfStatementSyntax(new LuaBinaryExpressionSyntax(left, LuaSyntaxNode.Tokens.NotEquals, typeName));

            ifStatement.Body.Statements.Add(new LuaReturnStatementSyntax(LuaIdentifierNameSyntax.False));
            functionExpression.AddStatement(ifStatement);

            if (fields.Count > 0)
            {
                var equalsStatic = LuaIdentifierNameSyntax.EqualsStatic;
                LuaLocalVariableDeclaratorSyntax variableDeclarator = new LuaLocalVariableDeclaratorSyntax(equalsStatic, LuaIdentifierNameSyntax.SystemObjectEqualsStatic);
                functionExpression.AddStatement(variableDeclarator);
                LuaExpressionSyntax expression = null;
                foreach (LuaIdentifierNameSyntax field in fields)
                {
                    LuaMemberAccessExpressionSyntax argument1  = new LuaMemberAccessExpressionSyntax(thisIdentifier, field);
                    LuaMemberAccessExpressionSyntax argument2  = new LuaMemberAccessExpressionSyntax(obj, field);
                    LuaInvocationExpressionSyntax   invocation = new LuaInvocationExpressionSyntax(equalsStatic, argument1, argument2);
                    if (expression == null)
                    {
                        expression = invocation;
                    }
                    else
                    {
                        expression = new LuaBinaryExpressionSyntax(expression, LuaSyntaxNode.Tokens.And, invocation);
                    }
                }
                Contract.Assert(expression != null);
                functionExpression.AddStatement(new LuaReturnStatementSyntax(expression));
            }
            declaration.AddMethod(LuaIdentifierNameSyntax.EqualsObj, functionExpression, false);
        }
Пример #3
0
 internal void Render(LuaLocalVariableDeclaratorSyntax node)
 {
     node.Declarator.Render(this);
     WriteNewLine();
 }