Exemple #1
0
        private void BuildStructMethods(INamedTypeSymbol symbol, LuaStructDeclarationSyntax declaration)
        {
            LuaExpressionSyntax typeName = AddStructDefaultMethod(symbol, declaration);
            var fileds = AddStructCloneMethod(symbol, declaration, typeName);

            AddStructEqualsObjMethod(symbol, declaration, typeName, fileds);
        }
Exemple #2
0
        private LuaExpressionSyntax AddStructDefaultMethod(INamedTypeSymbol symbol, LuaStructDeclarationSyntax declaration)
        {
            LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax();
            LuaExpressionSyntax         typeName           = GetTypeName(symbol);

            functionExpression.AddStatement(new LuaReturnStatementSyntax(new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.setmetatable, LuaTableInitializerExpression.Empty, typeName)));
            declaration.AddMethod(LuaIdentifierNameSyntax.Default, functionExpression, false);
            return(typeName);
        }
 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);
   }
 }
Exemple #4
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);
        }
Exemple #5
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);
        }