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()); } } }
private void CheckUsingDeclares() { var imports = usingDeclares_.Where(i => !i.IsFromCode).ToList(); if (imports.Count > 0) { imports.Sort((x, y) => x.Prefix.CompareTo(y.Prefix)); foreach (var import in imports) { AddImport(new LuaIdentifierNameSyntax(import.NewPrefix), new LuaIdentifierNameSyntax(import.Prefix)); } } var usingDeclares = usingDeclares_.Where(i => i.IsFromCode).ToList(); if (usingDeclares.Count > 0) { usingDeclares.Sort((x, y) => x.Prefix.CompareTo(y.Prefix)); foreach (var usingDeclare in usingDeclares) { AddImport(new LuaIdentifierNameSyntax(usingDeclare.NewPrefix), null); } var global = LuaIdentifierNameSyntax.Global; LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax(); functionExpression.AddParameter(global); foreach (var usingDeclare in usingDeclares) { if (usingDeclare.Prefix != usingDeclare.NewPrefix) { LuaAssignmentExpressionSyntax assignment = new LuaAssignmentExpressionSyntax(new LuaIdentifierNameSyntax(usingDeclare.NewPrefix), new LuaIdentifierNameSyntax(usingDeclare.Prefix)); functionExpression.Body.Statements.Add(new LuaExpressionStatementSyntax(assignment)); } else { LuaMemberAccessExpressionSyntax right = new LuaMemberAccessExpressionSyntax(global, new LuaIdentifierNameSyntax(usingDeclare.Prefix)); LuaAssignmentExpressionSyntax assignment = new LuaAssignmentExpressionSyntax(new LuaIdentifierNameSyntax(usingDeclare.NewPrefix), right); functionExpression.Body.Statements.Add(new LuaExpressionStatementSyntax(assignment)); } } LuaInvocationExpressionSyntax invocationExpression = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.UsingDeclare, functionExpression); importAreaStatements.Statements.Add(new LuaExpressionStatementSyntax(invocationExpression)); } int index = Statements.FindIndex(i => i is LuaNamespaceDeclarationSyntax); if (index != -1) { Statements.Insert(index, importAreaStatements); } }
public LuaArrayTypeAdapterExpressionSyntax(LuaInvocationExpressionSyntax invocationExpression, LuaArrayRankSpecifierSyntax rankSpecifier) { if (invocationExpression == null) { throw new ArgumentNullException(nameof(invocationExpression)); } if (rankSpecifier == null) { throw new ArgumentNullException(nameof(rankSpecifier)); } InvocationExpression = invocationExpression; RankSpecifier = rankSpecifier; }
internal bool IsUsingDeclareConflict(LuaInvocationExpressionSyntax generic) { if (generic.Expression is LuaIdentifierNameSyntax identifier) { int pos = identifier.ValueText.IndexOf('.'); if (pos != -1) { string prefix = identifier.ValueText.Substring(0, pos); return(UsingDeclares.Exists(i => i.NewPrefix == prefix)); } } return(false); }
public LuaForInStatementSyntax(LuaIdentifierNameSyntax identifier, LuaExpressionSyntax expression) { if (identifier == null) { throw new ArgumentNullException(nameof(identifier)); } if (expression == null) { throw new ArgumentNullException(nameof(expression)); } Identifier = identifier; Expression = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.Each, expression); }
internal void AddImport(LuaInvocationExpressionSyntax invocationExpression, string name, List <string> argumentTypeNames, bool isFromCode) { if (!genericUsingDeclares_.Exists(i => i.NewName == name)) { genericUsingDeclares_.Add(new GenericUsingDeclare() { InvocationExpression = invocationExpression, NewName = name, ArgumentTypeNames = argumentTypeNames, IsFromCode = isFromCode, }); } }
protected void UpdateIdentifiers(LuaIdentifierNameSyntax name, LuaIdentifierNameSyntax target, LuaIdentifierNameSyntax memberName, LuaIdentifierNameSyntax parameter = null) { LuaMemberAccessExpressionSyntax memberAccess = new LuaMemberAccessExpressionSyntax(target, memberName); LuaInvocationExpressionSyntax invoke = new LuaInvocationExpressionSyntax(memberAccess); invoke.AddArgument(new LuaStringLiteralExpressionSyntax(name)); invoke.AddArgument(function_); if (parameter != null) { function_.AddParameter(parameter); } Statement = new LuaExpressionStatementSyntax(invoke); }
internal (bool success, bool hasAdd) AddGenericImport(LuaInvocationExpressionSyntax invocationExpression, string name, List <string> argumentTypeNames, bool isFromCode) { if (genericUsingDeclares_.Exists(i => i.NewName == name)) { return(true, false); } genericUsingDeclares_.Add(new GenericUsingDeclare() { InvocationExpression = invocationExpression, ArgumentTypeNames = argumentTypeNames, NewName = name, IsFromCode = isFromCode }); return(true, true); }
internal bool AddGenericImport(LuaInvocationExpressionSyntax invocationExpression, string name, List <string> argumentTypeNames, bool isFromCode, out GenericUsingDeclare genericUsingDeclare) { if (genericUsingDeclares_.Exists(i => i.NewName == name)) { genericUsingDeclare = null; return(true); } genericUsingDeclare = new GenericUsingDeclare() { InvocationExpression = invocationExpression, ArgumentTypeNames = argumentTypeNames, NewName = name, IsFromCode = isFromCode }; genericUsingDeclares_.Add(genericUsingDeclare); return(true); }
public LuaForInStatementSyntax(LuaIdentifierNameSyntax identifier, LuaExpressionSyntax expression, bool isAsync = false) { if (identifier == null) { throw new ArgumentNullException(nameof(identifier)); } if (expression == null) { throw new ArgumentNullException(nameof(expression)); } Identifier = identifier; if (isAsync) { Expression = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.AsyncEach, LuaIdentifierNameSyntax.Async, expression); } else { Expression = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.Each, expression); } }
private void AddPropertyOrEvent(bool isProperty, LuaIdentifierNameSyntax name, LuaIdentifierNameSyntax innerName, LuaExpressionSyntax value, bool isImmutable, bool isStatic, bool isPrivate) { LuaIdentifierNameSyntax initMethodIdentifier; LuaPropertyOrEventIdentifierNameSyntax get, set; if (isProperty) { initMethodIdentifier = LuaIdentifierNameSyntax.Property; get = new LuaPropertyOrEventIdentifierNameSyntax(true, true, name); set = new LuaPropertyOrEventIdentifierNameSyntax(true, false, name); } else { initMethodIdentifier = LuaIdentifierNameSyntax.Event; get = new LuaPropertyOrEventIdentifierNameSyntax(false, true, name); set = new LuaPropertyOrEventIdentifierNameSyntax(false, false, name); } local_.Variables.Add(get); local_.Variables.Add(set); LuaMultipleAssignmentExpressionSyntax assignment = new LuaMultipleAssignmentExpressionSyntax(); assignment.Lefts.Add(get); assignment.Lefts.Add(set); LuaInvocationExpressionSyntax invocation = new LuaInvocationExpressionSyntax(initMethodIdentifier); invocation.AddArgument(new LuaStringLiteralExpressionSyntax(innerName)); assignment.Rights.Add(invocation); methodList_.Statements.Add(new LuaExpressionStatementSyntax(assignment)); if (value != null) { if (isStatic) { if (isImmutable) { AddResultTable(name, value); } else { LuaAssignmentExpressionSyntax thisAssignment = new LuaAssignmentExpressionSyntax(name, value); staticLazyStatements_.Add(new LuaExpressionStatementSyntax(thisAssignment)); } } else { if (isImmutable) { AddResultTable(name, value); } else { AddInitFiled(name, value); } } } if (!isPrivate) { AddResultTable(get); AddResultTable(set); } }
private void CheckUsingDeclares() { var imports = UsingDeclares.Where(i => !i.IsFromCode).ToList(); if (imports.Count > 0) { imports.Sort(); foreach (var import in imports) { AddImport(import.NewPrefix, import.Prefix); } } var genericImports = GenericUsingDeclares.Where(i => !i.IsFromCode).ToList(); if (genericImports.Count > 0) { genericImports.Sort(); foreach (var import in genericImports) { AddImport(import.NewName, import.InvocationExpression); } } var usingDeclares = UsingDeclares.Where(i => i.IsFromCode).ToList(); var genericDeclares = GenericUsingDeclares.Where(i => i.IsFromCode).ToList(); if (usingDeclares.Count > 0 || genericDeclares.Count > 0) { usingDeclares.Sort(); genericDeclares.Sort(); foreach (var usingDeclare in usingDeclares) { AddImport(usingDeclare.NewPrefix, null); } foreach (var usingDeclare in genericDeclares) { AddImport(usingDeclare.NewName, null); } var global = LuaIdentifierNameSyntax.Global; var functionExpression = new LuaFunctionExpressionSyntax(); functionExpression.AddParameter(global); foreach (var usingDeclare in usingDeclares) { LuaIdentifierNameSyntax newPrefixIdentifier = usingDeclare.NewPrefix; if (usingDeclare.Prefix != usingDeclare.NewPrefix) { functionExpression.Body.AddStatement(newPrefixIdentifier.Assignment(usingDeclare.Prefix)); } else { functionExpression.Body.AddStatement(newPrefixIdentifier.Assignment(global.MemberAccess(usingDeclare.Prefix))); } } foreach (var usingDeclare in genericDeclares) { functionExpression.Body.AddStatement(((LuaIdentifierNameSyntax)usingDeclare.NewName).Assignment(usingDeclare.InvocationExpression)); } var invocationExpression = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.Import, functionExpression); importAreaStatements.Statements.Add(invocationExpression); } int index = Statements.FindIndex(i => i is LuaNamespaceDeclarationSyntax); if (index != -1) { Statements.Insert(index, importAreaStatements); } }
private void AddPropertyOrEvent(bool isProperty, LuaIdentifierNameSyntax name, LuaIdentifierNameSyntax innerName, LuaExpressionSyntax value, bool isImmutable, bool isStatic, bool isPrivate, LuaExpressionSyntax typeExpression, List <LuaStatementSyntax> statements) { LuaPropertyOrEventIdentifierNameSyntax get, set; if (isProperty) { get = new LuaPropertyOrEventIdentifierNameSyntax(true, true, name); set = new LuaPropertyOrEventIdentifierNameSyntax(true, false, name); } else { get = new LuaPropertyOrEventIdentifierNameSyntax(false, true, name); set = new LuaPropertyOrEventIdentifierNameSyntax(false, false, name); } local_.Variables.Add(get); local_.Variables.Add(set); if (!isStatic) { LuaIdentifierNameSyntax initMethodIdentifier = isProperty ? LuaIdentifierNameSyntax.Property : LuaIdentifierNameSyntax.Event; LuaMultipleAssignmentExpressionSyntax assignment = new LuaMultipleAssignmentExpressionSyntax(); assignment.Lefts.Add(get); assignment.Lefts.Add(set); LuaInvocationExpressionSyntax invocation = new LuaInvocationExpressionSyntax(initMethodIdentifier); invocation.AddArgument(new LuaStringLiteralExpressionSyntax(innerName)); assignment.Rights.Add(invocation); methodList_.Statements.Add(assignment.ToStatement()); } else { var memberAccess = new LuaMemberAccessExpressionSyntax(typeExpression, innerName); var getFunction = new LuaFunctionExpressionSyntax(); var setFunction = new LuaFunctionExpressionSyntax(); if (isProperty) { getFunction.AddStatement(new LuaReturnStatementSyntax(memberAccess)); setFunction.AddParameter(LuaIdentifierNameSyntax.Value); var assignment = new LuaAssignmentExpressionSyntax(memberAccess, LuaIdentifierNameSyntax.Value); setFunction.AddStatement(assignment.ToStatement()); } else { getFunction.AddParameter(LuaIdentifierNameSyntax.Value); var getAssignment = new LuaAssignmentExpressionSyntax(memberAccess, new LuaBinaryExpressionSyntax(memberAccess, Tokens.Plus, LuaIdentifierNameSyntax.Value)); getFunction.AddStatement(getAssignment.ToStatement()); setFunction.AddParameter(LuaIdentifierNameSyntax.Value); var setAssignment = new LuaAssignmentExpressionSyntax(memberAccess, new LuaBinaryExpressionSyntax(memberAccess, Tokens.Sub, LuaIdentifierNameSyntax.Value)); setFunction.AddStatement(setAssignment.ToStatement()); } methodList_.Statements.Add(new LuaAssignmentExpressionSyntax(get, getFunction).ToStatement()); methodList_.Statements.Add(new LuaAssignmentExpressionSyntax(set, setFunction).ToStatement()); } if (value != null) { if (isStatic) { if (isImmutable) { AddResultTable(innerName, value); } else { if (statements != null) { staticInitStatements_.AddRange(statements); } LuaAssignmentExpressionSyntax assignment = new LuaAssignmentExpressionSyntax(new LuaMemberAccessExpressionSyntax(LuaIdentifierNameSyntax.This, innerName), value); staticInitStatements_.Add(new LuaExpressionStatementSyntax(assignment)); } } else { if (isImmutable) { AddResultTable(innerName, value); } else { if (statements != null) { initStatements_.AddRange(statements); } AddInitFiled(innerName, value); } } } if (!isPrivate) { AddResultTable(get); AddResultTable(set); } }
private (LuaPropertyOrEventIdentifierNameSyntax, LuaPropertyOrEventIdentifierNameSyntax) AddPropertyOrEvent(bool isProperty, LuaIdentifierNameSyntax name, LuaIdentifierNameSyntax innerName, LuaExpressionSyntax value, bool isImmutable, bool isStatic, bool isPrivate, LuaExpressionSyntax typeExpression, List <LuaStatementSyntax> statements, bool isGetOnly = false) { LuaPropertyOrEventIdentifierNameSyntax get, set; if (isProperty) { get = new LuaPropertyOrEventIdentifierNameSyntax(true, true, name); set = isGetOnly ? null : new LuaPropertyOrEventIdentifierNameSyntax(true, false, name); } else { get = new LuaPropertyOrEventIdentifierNameSyntax(false, true, name); set = new LuaPropertyOrEventIdentifierNameSyntax(false, false, name); } local_.Variables.Add(get); if (set != null) { local_.Variables.Add(set); } if (!isStatic) { var initMethodIdentifier = isProperty ? LuaIdentifierNameSyntax.Property : LuaIdentifierNameSyntax.Event; var assignment = new LuaMultipleAssignmentExpressionSyntax(); assignment.Lefts.Add(get); if (set != null) { assignment.Lefts.Add(set); } var invocation = new LuaInvocationExpressionSyntax(initMethodIdentifier, new LuaStringLiteralExpressionSyntax(innerName)); if (set == null) { invocation.AddArgument(LuaIdentifierNameSyntax.True); } assignment.Rights.Add(invocation); methodList_.Statements.Add(assignment); } else { var memberAccess = typeExpression.MemberAccess(innerName); var getFunction = new LuaFunctionExpressionSyntax(); var setFunction = new LuaFunctionExpressionSyntax(); if (isProperty) { getFunction.AddStatement(new LuaReturnStatementSyntax(memberAccess)); setFunction.AddParameter(LuaIdentifierNameSyntax.Value); setFunction.AddStatement(memberAccess.Assignment(LuaIdentifierNameSyntax.Value)); } else { getFunction.AddParameter(LuaIdentifierNameSyntax.Value); var getAssignment = memberAccess.Assignment(memberAccess.Binary(Tokens.Plus, LuaIdentifierNameSyntax.Value)); getFunction.AddStatement(getAssignment); setFunction.AddParameter(LuaIdentifierNameSyntax.Value); var setAssignment = memberAccess.Assignment(memberAccess.Binary(Tokens.Sub, LuaIdentifierNameSyntax.Value)); setFunction.AddStatement(setAssignment); } methodList_.Statements.Add(get.Assignment(getFunction)); if (set != null) { methodList_.Statements.Add(set.Assignment(setFunction)); } } if (value != null) { if (isStatic) { if (isImmutable) { AddResultTable(innerName, value); } else { if (statements != null) { staticInitStatements_.AddRange(statements); } staticInitStatements_.Add(LuaIdentifierNameSyntax.This.MemberAccess(innerName).Assignment(value)); } } else { if (isImmutable) { AddResultTable(innerName, value); } else { if (statements != null) { initStatements_.AddRange(statements); } AddInitFiled(innerName, value); } } } if (!isPrivate) { AddResultTable(get); if (set != null) { AddResultTable(set); } } return(get, set); }
internal void AddImport(LuaInvocationExpressionSyntax invocationExpression, string name, List <string> argumentTypeNames, bool isFromCode) { GenericUsingDeclare.AddImportTo(genericUsingDeclares_, invocationExpression, name, argumentTypeNames, isFromCode); }
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().Function.Body.Statements.InsertRange(0, initStatements_); } else { var init = LuaIdentifierNameSyntax.Init; AddInitFunction(body, init, GetInitFunction(), false); foreach (var ctor in ctors_) { if (!ctor.Function.IsInvokeThisCtor) { var invocationInit = new LuaInvocationExpressionSyntax(init, LuaIdentifierNameSyntax.This); ctor.Function.Body.Statements.Insert(0, invocationInit); } } } } if (ctors_.Count == 1) { var ctor = ctors_.First(); if (ctor.Function.Body.Statements.Count > 0) { if (ctor.Document != null) { body.AddStatement(ctor.Document); } AddInitFunction(body, LuaIdentifierNameSyntax.Ctor, ctor.Function); } } else { LuaTableExpression ctrosTable = new LuaTableExpression(); int index = 1; foreach (var ctor in ctors_) { if (ctor.Document != null) { body.AddStatement(ctor.Document); } LuaIdentifierNameSyntax nameIdentifier = GetCtorNameString(index); AddInitFunction(body, nameIdentifier, ctor.Function, false); ctrosTable.Add(nameIdentifier); ++index; } AddResultTable(LuaIdentifierNameSyntax.Ctor, ctrosTable); } } else { if (hasInit) { AddInitFunction(body, LuaIdentifierNameSyntax.Ctor, GetInitFunction()); } } }
private void CheckUsingDeclares() { var imports = usingDeclares_.Where(i => !i.IsFromCode).ToList(); if (imports.Count > 0) { imports.Sort(); foreach (var import in imports) { AddImport(import.NewPrefix, import.Prefix); } } var genericImports = genericUsingDeclares_.Where(i => !i.IsFromCode).ToList(); if (genericImports.Count > 0) { genericImports.Sort(); foreach (var import in genericImports) { AddImport(import.NewName, import.InvocationExpression); } } var usingDeclares = usingDeclares_.Where(i => i.IsFromCode).ToList(); var genericDeclares = genericUsingDeclares_.Where(i => i.IsFromCode).ToList(); if (usingDeclares.Count > 0 || genericDeclares.Count > 0) { usingDeclares.Sort(); genericDeclares.Sort(); foreach (var usingDeclare in usingDeclares) { AddImport(usingDeclare.NewPrefix, null); } foreach (var usingDeclare in genericDeclares) { AddImport(usingDeclare.NewName, null); } var global = LuaIdentifierNameSyntax.Global; var functionExpression = new LuaFunctionExpressionSyntax(); functionExpression.AddParameter(global); foreach (var usingDeclare in usingDeclares) { if (usingDeclare.Prefix != usingDeclare.NewPrefix) { var assignment = new LuaAssignmentExpressionSyntax(usingDeclare.NewPrefix, usingDeclare.Prefix); functionExpression.Body.Statements.Add(new LuaExpressionStatementSyntax(assignment)); } else { var right = new LuaMemberAccessExpressionSyntax(global, usingDeclare.Prefix); var assignment = new LuaAssignmentExpressionSyntax(usingDeclare.NewPrefix, right); functionExpression.Body.Statements.Add(new LuaExpressionStatementSyntax(assignment)); } } foreach (var usingDeclare in genericDeclares) { var assignment = new LuaAssignmentExpressionSyntax(usingDeclare.NewName, usingDeclare.InvocationExpression); functionExpression.Body.Statements.Add(new LuaExpressionStatementSyntax(assignment)); } var invocationExpression = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.UsingDeclare, functionExpression); importAreaStatements.Statements.Add(new LuaExpressionStatementSyntax(invocationExpression)); } int index = Statements.FindIndex(i => i is LuaNamespaceDeclarationSyntax); if (index != -1) { Statements.Insert(index, importAreaStatements); } }