Skip to content

Commit

Permalink
add export ctor, field, property meta data
Browse files Browse the repository at this point in the history
  • Loading branch information
yanghuan committed Jan 18, 2019
1 parent 734c458 commit aa7ae25
Show file tree
Hide file tree
Showing 10 changed files with 265 additions and 100 deletions.
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ indent_style = space
indent_size = 2
insert_final_newline = true
charset = utf-8
end_of_line = lf
#end_of_line = lf

###############################
# C# Coding Conventions #
Expand Down
2 changes: 1 addition & 1 deletion CSharp.lua.Launcher/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class Program {
-i : indent number, default is 2
-a : attributes need to export, use ';' to separate, if ""-a"" only, all attributes whill be exported
-f : export some class metadatas to reflection.lua, could change in the future
-fs : all metadatas need to export
-fs : all metadatas need to export, under development, not yet available
";
public static void Main(string[] args) {
if (args.Length > 0) {
Expand Down
2 changes: 2 additions & 0 deletions CSharp.lua/LuaAst/LuaIdentifierNameSyntax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ public class LuaIdentifierNameSyntax : LuaExpressionSyntax {
public static readonly LuaIdentifierNameSyntax Global = "global";
public static readonly LuaIdentifierNameSyntax Metadata = "__metadata__";
public static readonly LuaIdentifierNameSyntax Attributes = "attributes";
public static readonly LuaIdentifierNameSyntax Fields = "fields";
public static readonly LuaIdentifierNameSyntax Properties = "properties";
public static readonly LuaIdentifierNameSyntax Methods = "methods";
public static readonly LuaIdentifierNameSyntax setmetatable = "setmetatable";
public static readonly LuaIdentifierNameSyntax Clone = "__clone__";
Expand Down
8 changes: 8 additions & 0 deletions CSharp.lua/LuaAst/LuaStatementSyntax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,14 @@ public bool HasAttribute(AttributeFlags type) {
return attr_.HasFlag(type);
}

private void UnAttribute(AttributeFlags type) {
attr_ &= ~type;
}

public void UnIgnore() {
UnAttribute(AttributeFlags.Ignore);
}

internal override void Render(LuaRenderer renderer) {
renderer.Render(this);
}
Expand Down
7 changes: 6 additions & 1 deletion CSharp.lua/LuaAst/LuaSyntaxNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,15 @@ public class Keyword {
public const string While = "while";
}

public static string SpecailWord(string s) {
private static string SpecailWord(string s) {
return "__" + s + "__";
}

public static string GetCtorNameString(int ctorIndex) {
Contract.Assert(ctorIndex > 0);
return SpecailWord(Tokens.Ctor + ctorIndex);
}

public static string[] TempIdentifiers = {
"default", "extern", "ref", "out", "try",
"case", "void", "byte", "char", "uint",
Expand Down
97 changes: 70 additions & 27 deletions CSharp.lua/LuaAst/LuaTypeDeclarationSyntax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ public sealed class LuaSpeaicalGenericType {
public bool IsLazy;
}

public sealed class LuaConstructorDeclaration {
public LuaConstructorAdapterExpressionSyntax Function;
public LuaDocumentStatement Document;
}

public abstract class LuaTypeDeclarationSyntax : LuaWrapFunctionStatementSynatx {
public bool IsPartialMark { get; set; }
public bool IsClassUsed { get; set; }
Expand All @@ -38,17 +43,19 @@ public abstract class LuaTypeDeclarationSyntax : LuaWrapFunctionStatementSynatx
private LuaTableExpression resultTable_ = new LuaTableExpression();

private List<LuaStatementSyntax> staticInitStatements_ = new List<LuaStatementSyntax>();
private List<LuaStatementSyntax> staticcCtorStatements_ = new List<LuaStatementSyntax>();
private List<LuaIdentifierNameSyntax> staticAssignmentNames_ = new List<LuaIdentifierNameSyntax>();
private LuaConstructorDeclaration staticCtor_;

private List<LuaStatementSyntax> initStatements_ = new List<LuaStatementSyntax>();
private List<LuaConstructorAdapterExpressionSyntax> ctors_ = new List<LuaConstructorAdapterExpressionSyntax>();
private List<LuaConstructorDeclaration> ctors_ = new List<LuaConstructorDeclaration>();

private List<LuaParameterSyntax> typeParameters_ = new List<LuaParameterSyntax>();
private List<GenericUsingDeclare> genericUsingDeclares_ = new List<GenericUsingDeclare>();

private LuaTableExpression metadata_;
private LuaTableExpression attributes_;
private LuaTableExpression metaProperties_;
private LuaTableExpression metaFields_;
private LuaTableExpression metaMethods_;
private LuaDocumentStatement document_ = new LuaDocumentStatement();
public bool IsIgnoreExport => document_.HasIgnoreAttribute;
Expand Down Expand Up @@ -96,6 +103,14 @@ internal void AddFieldAttributes(LuaIdentifierNameSyntax name, List<LuaExpressio
}
}

internal void AddFieldMetaData(LuaTableExpression data) {
AddMetadata(ref metaFields_, LuaIdentifierNameSyntax.Fields, new LuaSingleTableItemSyntax(data));
}

internal void AddPropertyMetaData(LuaTableExpression data) {
AddMetadata(ref metaProperties_, LuaIdentifierNameSyntax.Properties, new LuaSingleTableItemSyntax(data));
}

internal void AddMethodMetaData(LuaTableExpression data) {
AddMetadata(ref metaMethods_, LuaIdentifierNameSyntax.Methods, new LuaSingleTableItemSyntax(data));
}
Expand Down Expand Up @@ -247,7 +262,7 @@ public void AddField(LuaIdentifierNameSyntax name, LuaExpressionSyntax value, bo
}
}

private void AddPropertyOrEvent(bool isProperty, LuaIdentifierNameSyntax name, LuaIdentifierNameSyntax innerName, LuaExpressionSyntax value, bool isImmutable, bool isStatic, bool isPrivate, LuaExpressionSyntax typeExpression, List<LuaStatementSyntax> statements) {
private (LuaPropertyOrEventIdentifierNameSyntax, LuaPropertyOrEventIdentifierNameSyntax) 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);
Expand Down Expand Up @@ -316,24 +331,31 @@ private void AddPropertyOrEvent(bool isProperty, LuaIdentifierNameSyntax name, L
AddResultTable(get);
AddResultTable(set);
}

return (get, set);
}

public void AddProperty(LuaIdentifierNameSyntax name, LuaIdentifierNameSyntax innerName, LuaExpressionSyntax value, bool isImmutable, bool isStatic, bool isPrivate, LuaExpressionSyntax typeExpression, List<LuaStatementSyntax> statements) {
AddPropertyOrEvent(true, name, innerName, value, isImmutable, isStatic, isPrivate, typeExpression, statements);
public (LuaPropertyOrEventIdentifierNameSyntax, LuaPropertyOrEventIdentifierNameSyntax) AddProperty(LuaIdentifierNameSyntax name, LuaIdentifierNameSyntax innerName, LuaExpressionSyntax value, bool isImmutable, bool isStatic, bool isPrivate, LuaExpressionSyntax typeExpression, List<LuaStatementSyntax> statements) {
return AddPropertyOrEvent(true, name, innerName, value, isImmutable, isStatic, isPrivate, typeExpression, statements);
}

public void AddEvent(LuaIdentifierNameSyntax name, LuaIdentifierNameSyntax innerName, LuaExpressionSyntax value, bool isImmutable, bool isStatic, bool isPrivate, LuaExpressionSyntax typeExpression, List<LuaStatementSyntax> statements) {
AddPropertyOrEvent(false, name, innerName, value, isImmutable, isStatic, isPrivate, typeExpression, statements);
}

public void SetStaticCtor(LuaConstructorAdapterExpressionSyntax function) {
Contract.Assert(staticcCtorStatements_.Count == 0);
staticcCtorStatements_.AddRange(function.Body.Statements);
public void SetStaticCtor(LuaConstructorAdapterExpressionSyntax function, LuaDocumentStatement document) {
Contract.Assert(staticCtor_ == null);
staticCtor_ = new LuaConstructorDeclaration() {
Function = function,
Document = document,
};
}

public void SetStaticCtorEmpty() {
Contract.Assert(staticcCtorStatements_.Count == 0);
staticcCtorStatements_.Add(Empty);
Contract.Assert(staticCtor_ == null);
var ctor = new LuaConstructorAdapterExpressionSyntax();
ctor.AddStatement(Empty);
staticCtor_ = new LuaConstructorDeclaration() { Function = ctor };
}

public bool IsNoneCtros {
Expand All @@ -348,11 +370,17 @@ public bool IsInitStatementExists {
}
}

public void AddCtor(LuaConstructorAdapterExpressionSyntax function, bool isZeroParameters) {
public void AddCtor(LuaConstructorAdapterExpressionSyntax function, bool isZeroParameters, LuaDocumentStatement document = null) {
if (isZeroParameters) {
ctors_.Insert(0, function);
ctors_.Insert(0, new LuaConstructorDeclaration() {
Function = function,
Document = document,
});
} else {
ctors_.Add(function);
ctors_.Add(new LuaConstructorDeclaration() {
Function = function,
Document = document,
});
}
}

Expand All @@ -379,12 +407,17 @@ private void AddStaticAssignmentNames(LuaBlockSyntax body) {
private void CheckStaticCtorFunction(LuaBlockSyntax body) {
List<LuaStatementSyntax> statements = new List<LuaStatementSyntax>();
statements.AddRange(staticInitStatements_);
statements.AddRange(staticcCtorStatements_);
if (staticCtor_ != null) {
statements.AddRange(staticCtor_.Function.Body.Statements);
}
if (statements.Count > 0) {
LuaFunctionExpressionSyntax staticCtor = new LuaFunctionExpressionSyntax();
staticCtor.AddParameter(LuaIdentifierNameSyntax.This);
staticCtor.Body.Statements.AddRange(statements);
AddStaticAssignmentNames(staticCtor.Body);
if (staticCtor_ != null && staticCtor_.Document != null) {
body.AddStatement(staticCtor_.Document);
}
AddInitFunction(body, LuaIdentifierNameSyntax.StaticCtor, staticCtor);
}
}
Expand All @@ -403,31 +436,36 @@ private void CheckCtorsFunction(LuaBlockSyntax body) {
if (hasCtors) {
if (hasInit) {
if (ctors_.Count == 1) {
ctors_.First().Body.Statements.InsertRange(0, initStatements_);
ctors_.First().Function.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 (!ctor.Function.IsInvokeThisCtor) {
var invocationInit = new LuaInvocationExpressionSyntax(initIdentifier, LuaIdentifierNameSyntax.This);
ctor.Function.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);
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_) {
string name = SpecailWord(Tokens.Ctor + index);
LuaIdentifierNameSyntax nameIdentifier = name;
AddInitFunction(body, nameIdentifier, ctor, false);
if (ctor.Document != null) {
body.AddStatement(ctor.Document);
}
LuaIdentifierNameSyntax nameIdentifier = GetCtorNameString(index);
AddInitFunction(body, nameIdentifier, ctor.Function, false);
ctrosTable.Add(nameIdentifier);
++index;
}
Expand All @@ -446,12 +484,17 @@ private static string MetaDataName(LuaTableItemSyntax item) {
return name.Text;
}

private static void SortMetaData(LuaTableExpression metaData) {
if (metaData != null) {
metaData.Items.Sort((x, y) => MetaDataName(x).CompareTo(MetaDataName(y)));
}
}

private void CheckMetadata() {
if (metadata_ != null) {
if (metaMethods_ != null) {
metaMethods_.Items.Sort((x, y) => MetaDataName(x).CompareTo(MetaDataName(y)));
}

SortMetaData(metaFields_);
SortMetaData(metaProperties_);
SortMetaData(metaMethods_);
LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax();
functionExpression.AddParameter(LuaIdentifierNameSyntax.Global);
functionExpression.AddParameter(LuaSyntaxNode.Tokens.Ref);
Expand Down
38 changes: 5 additions & 33 deletions CSharp.lua/LuaSyntaxNodeTransform.Helper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public sealed partial class LuaSyntaxNodeTransform {
private abstract class LuaSyntaxSearcher : CSharpSyntaxWalker {
private sealed class FoundException : Exception {
}

protected void Found() {
throw new FoundException();
}
Expand Down Expand Up @@ -182,26 +183,6 @@ private void CheckLocalSymbolName(ISymbol symbol, ref LuaIdentifierNameSyntax na
}
}

private int GetConstructorIndex(IMethodSymbol constructorSymbol) {
if (constructorSymbol.ContainingType.IsFromCode()) {
var typeSymbol = (INamedTypeSymbol)constructorSymbol.ReceiverType;
var ctors = typeSymbol.Constructors.Where(i => !i.IsStatic).ToList();
if (ctors.Count > 1) {
int firstCtorIndex = ctors.IndexOf(i => i.Parameters.IsEmpty);
if (firstCtorIndex != -1 && firstCtorIndex != 0) {
var firstCtor = ctors[firstCtorIndex];
ctors.Remove(firstCtor);
ctors.Insert(0, firstCtor);
}
int index = ctors.IndexOf(constructorSymbol);
Contract.Assert(index != -1);
int ctroCounter = index + 1;
return ctroCounter;
}
}
return 0;
}

private sealed class ContinueSearcher : LuaSyntaxSearcher {
public override void VisitContinueStatement(ContinueStatementSyntax node) {
Found();
Expand Down Expand Up @@ -714,7 +695,7 @@ public override LuaSyntaxNode VisitNameEquals(NameEqualsSyntax node) {
}

private LuaInvocationExpressionSyntax BuildObjectCreationInvocation(IMethodSymbol symbol, LuaExpressionSyntax expression) {
int constructorIndex = GetConstructorIndex(symbol);
int constructorIndex = symbol.GetConstructorIndex();
if (constructorIndex > 0) {
expression = new LuaMemberAccessExpressionSyntax(expression, LuaIdentifierNameSyntax.New, true);
}
Expand Down Expand Up @@ -804,10 +785,10 @@ private void TryAddStructDefaultMethod(INamedTypeSymbol symbol, LuaTypeDeclarati
if (declaration.IsInitStatementExists) {
LuaIdentifierNameSyntax className = symbol.Name;
var thisIdentifier = LuaIdentifierNameSyntax.This;
LuaFunctionExpressionSyntax functionExpression = new LuaFunctionExpressionSyntax();
var functionExpression = new LuaFunctionExpressionSyntax();
functionExpression.AddParameter(className);
var invocation = new LuaInvocationExpressionSyntax(LuaIdentifierNameSyntax.setmetatable, LuaTableExpression.Empty, className);
LuaLocalVariableDeclaratorSyntax local = new LuaLocalVariableDeclaratorSyntax(thisIdentifier, invocation);
var local = new LuaLocalVariableDeclaratorSyntax(thisIdentifier, invocation);
functionExpression.AddStatement(local);
functionExpression.AddStatement(new LuaExpressionStatementSyntax(new LuaInvocationExpressionSyntax(declaration.IsNoneCtros ? LuaIdentifierNameSyntax.Ctor : LuaIdentifierNameSyntax.Init, thisIdentifier)));
functionExpression.AddStatement(new LuaReturnStatementSyntax(thisIdentifier));
Expand Down Expand Up @@ -965,19 +946,10 @@ private LuaIdentifierNameSyntax AddInnerName(ISymbol symbol) {
return generator_.AddInnerName(symbol);
}

private void RemoveNilExpressionsAtTail(List<LuaExpressionSyntax> arguments) {
int pos = arguments.FindLastIndex(i => !i.IsNil());
int nilStartIndex = pos + 1;
int nilArgumentCount = arguments.Count - nilStartIndex;
if (nilArgumentCount > 0) {
arguments.RemoveRange(nilStartIndex, nilArgumentCount);
}
}

private void TryRemoveNilArgumentsAtTail(ISymbol symbol, List<LuaExpressionSyntax> arguments) {
if (arguments.Count > 0) {
if (symbol.IsFromCode() || symbol.ContainingType.GetMembers(symbol.Name).Length == 1) {
RemoveNilExpressionsAtTail(arguments);
arguments.RemoveNilAtTail();
}
}
}
Expand Down
Loading

0 comments on commit aa7ae25

Please sign in to comment.