internal void AddBaseTypes(IEnumerable <LuaExpressionSyntax> baseTypes, LuaSpeaicalGenericType genericArgument = null) { bool hasLazyGenericArgument = false; if (genericArgument != null) { if (genericArgument.IsLazy) { hasLazyGenericArgument = true; } else { AddResultTable(genericArgument.Name, genericArgument.Value); } } LuaTableInitializerExpression table = new LuaTableInitializerExpression(); table.Items.AddRange(baseTypes.Select(i => new LuaSingleTableItemSyntax(i))); LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax(); functionExpression.AddParameter(LuaIdentifierNameSyntax.Global); if (hasLazyGenericArgument) { functionExpression.AddParameter(LuaIdentifierNameSyntax.This); var assignment = new LuaAssignmentExpressionSyntax(new LuaMemberAccessExpressionSyntax(LuaIdentifierNameSyntax.This, genericArgument.Name), genericArgument.Value); functionExpression.AddStatement(assignment); } functionExpression.AddStatement(new LuaReturnStatementSyntax(table)); AddResultTable(LuaIdentifierNameSyntax.Inherits, functionExpression); }
private void CheckCtorsFunction(LuaBlockSyntax body) { bool hasInit = initStatements_.Count > 0; bool hasCtors = ctors_.Count > 0; if (hasCtors) { if (hasInit) { if (ctors_.Count == 1) { ctors_.First().Body.Statements.InsertRange(0, initStatements_); } else { var initIdentifier = LuaIdentifierNameSyntax.Init; AddInitFunction(body, initIdentifier, GetInitFunction(), false); foreach (var ctor in ctors_) { if (!ctor.IsInvokeThisCtor) { LuaInvocationExpressionSyntax invocationInit = new LuaInvocationExpressionSyntax(initIdentifier, LuaIdentifierNameSyntax.This); ctor.Body.Statements.Insert(0, new LuaExpressionStatementSyntax(invocationInit)); } } } } if (ctors_.Count == 1) { var ctor = ctors_.First(); if (ctor.Body.Statements.Count > 0) { AddInitFunction(body, LuaIdentifierNameSyntax.Ctor, ctor); } } else { LuaTableInitializerExpression ctrosTable = new LuaTableInitializerExpression(); int index = 1; foreach (var ctor in ctors_) { string name = SpecailWord(Tokens.Ctor + index); LuaIdentifierNameSyntax nameIdentifier = new LuaIdentifierNameSyntax(name); AddInitFunction(body, nameIdentifier, ctor, false); ctrosTable.Items.Add(new LuaSingleTableItemSyntax(nameIdentifier)); ++index; } AddResultTable(LuaIdentifierNameSyntax.Ctor, ctrosTable); } } else { if (hasInit) { AddInitFunction(body, LuaIdentifierNameSyntax.Ctor, GetInitFunction()); } } }
internal void AddBaseTypes(IEnumerable <LuaExpressionSyntax> baseTypes, LuaSpeaicalGenericType genericArgument, List <LuaIdentifierNameSyntax> baseCopyFields) { bool hasLazyGenericArgument = false; if (genericArgument != null) { if (genericArgument.IsLazy) { hasLazyGenericArgument = true; } else { AddResultTable(genericArgument.Name, genericArgument.Value); } } bool hasBaseCopyField = baseCopyFields != null && baseCopyFields.Count > 0; LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax(); functionExpression.AddParameter(LuaIdentifierNameSyntax.Global); if (hasLazyGenericArgument || hasBaseCopyField) { functionExpression.AddParameter(LuaIdentifierNameSyntax.This); } if (hasLazyGenericArgument) { var assignment = new LuaAssignmentExpressionSyntax(new LuaMemberAccessExpressionSyntax(LuaIdentifierNameSyntax.This, genericArgument.Name), genericArgument.Value); functionExpression.AddStatement(assignment); } LuaTableInitializerExpression table = new LuaTableInitializerExpression(); if (hasBaseCopyField) { var baseIdentifier = LuaIdentifierNameSyntax.Base; functionExpression.AddStatement(new LuaLocalVariableDeclaratorSyntax(baseIdentifier, baseTypes.First())); foreach (var field in baseCopyFields) { var left = new LuaMemberAccessExpressionSyntax(LuaIdentifierNameSyntax.This, field); var right = new LuaMemberAccessExpressionSyntax(baseIdentifier, field); functionExpression.AddStatement(new LuaAssignmentExpressionSyntax(left, right)); table.Items.Add(new LuaSingleTableItemSyntax(baseIdentifier)); table.Items.AddRange(baseTypes.Skip(1).Select(i => new LuaSingleTableItemSyntax(i))); } } else { table.Items.AddRange(baseTypes.Select(i => new LuaSingleTableItemSyntax(i))); } functionExpression.AddStatement(new LuaReturnStatementSyntax(table)); AddResultTable(LuaIdentifierNameSyntax.Inherits, functionExpression); }
internal void AddFieldAttributes(LuaIdentifierNameSyntax name, List <LuaExpressionSyntax> attributes) { if (attributes.Count > 0) { LuaTableInitializerExpression table = new LuaTableInitializerExpression(); table.Items.AddRange(attributes.Select(i => new LuaSingleTableItemSyntax(i))); LuaTableLiteralKeySyntax key = new LuaTableLiteralKeySyntax(name); LuaKeyValueTableItemSyntax item = new LuaKeyValueTableItemSyntax(key, table); attributes_.Items.Add(item); } }
private void CheckAttributes() { if (attributes_.Items.Count > 0) { LuaTableInitializerExpression metaDataTable = new LuaTableInitializerExpression(); metaDataTable.Items.Add(new LuaKeyValueTableItemSyntax(new LuaTableLiteralKeySyntax(LuaIdentifierNameSyntax.Attributes), attributes_)); LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax(); functionExpression.AddParameter(LuaIdentifierNameSyntax.Global); functionExpression.AddStatement(new LuaReturnStatementSyntax(metaDataTable)); AddResultTable(LuaIdentifierNameSyntax.Metadata, functionExpression); } }
internal void AddBaseTypes(IEnumerable <LuaExpressionSyntax> baseTypes) { var global = LuaIdentifierNameSyntax.Global; LuaTableInitializerExpression table = new LuaTableInitializerExpression(); foreach (var baseType in baseTypes) { LuaMemberAccessExpressionSyntax memberAccess = new LuaMemberAccessExpressionSyntax(global, baseType); table.Items.Add(new LuaSingleTableItemSyntax(memberAccess)); } LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax(); functionExpression.AddParameter(global); functionExpression.AddStatement(new LuaReturnStatementSyntax(table)); AddResultTable(LuaIdentifierNameSyntax.Inherits, functionExpression); }