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); } }
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); }
internal void Render(LuaLocalVariableDeclaratorSyntax node) { node.Declarator.Render(this); WriteNewLine(); }