you know.. the problem is that lua always calls some big moma object for functions and stuff..so even having syntactic correctness check, what is needed is a check wethere the type returned by moma is right..
http://springrts.com/wiki/Lua_SyncedRead
So what is needed is a API to Mock Converter, so you can have a non-binary attached test run.
something like this:
Code: Select all
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace LuaApiCodeGenerator
{
class Program
{
//Thats one dead parrot
//Beautifull bird, excellent plumage
//Exept that he is dead, he is lying around
//No, no he is not dead, he is
#region PAINING FOR THE FIELDS
const string inPut = "D:\\ApiDoc.txt";
const string outPut = "D:\\GeneratedCode.txt";
const string SPRINGNAMESPACE = "Spring.";
const string ARGUMENTOPENER = "(";
const string ARGUMENTCLOSER = ")";
const string RETURNTYPEOPENER = "->";
#endregion PAINING FOR THE FIELDS
static void Write2File(string[] Array, string OutFilepath)
{
StreamWriter FileWriter = new StreamWriter(OutFilepath);
foreach( string v in Array)
{
FileWriter.WriteLine(v);
}
FileWriter.Close();
}
static List<string> ReadFromFile(string InFilepath)
{
List<string> yourAWizzard = new List<string>();
using (System.IO.StreamReader file = new System.IO.StreamReader(InFilepath))
{
while (!file.EndOfStream)
{
try
{
yourAWizzard.Add(file.ReadLine());
}
catch (Exception E)
{
Console.WriteLine("Phailed to parse errors!");
}
}
}
return yourAWizzard;
}
public class Value
{
public Value(){}
public object Data {get;set;}
public string TypeName{get;set;}
public string VarName { get; set; }
}
public static string FunctionOfOldenTimes = String.Empty;
static bool ContainsFunctionHead(string s, string currentFunctionname)
{
bool Turn = s.Contains(SPRINGNAMESPACE) && !currentFunctionname.Equals(FunctionOfOldenTimes);
FunctionOfOldenTimes = currentFunctionname;
return Turn;
}
static void Main(string[] args)
{
//Read in the API-Doc
List<string> TheAPI = ReadFromFile(inPut);
string Functionhead = String.Empty;
List<Value> Arguments = new List<Value>();
List<Value> ReturnedValues = new List<Value>();
int i = 0;
while (i < TheAPI.Count())
{
if (ContainsFunctionHead(TheAPI[i], Functionhead))
{
//Store and start a new parsing round
LuaMockUpCodeGenerate(Functionhead, Arguments, ReturnedValues);
//Reset
Functionhead = ExtractFunctionHead(TheAPI[i]);
Arguments = new List<Value>();
ReturnedValues = new List<Value>();
}
Arguments.AddRange(ExtractValues(TheAPI[i]));
ReturnedValues.AddRange(ExtractReturnValues(TheAPI[i]));
i++;
}
}
private static void LuaMockUpCodeGenerate(string Functionhead, List<Value> Arguments, List<Value> ReturnedValues)
{
string AppendIx = String.Format("Spring.{0}= function {0}(self,..)\n", Functionhead);
//TypeCheck(Var, FunctionShortName, SubstitueValue)
foreach (var Value in Arguments)
{
AppendIx = AppendIx + String.Format("TypeCheck(Var={ \n Var={0}, Name={1},Type={2}},{3},{4})\n", Value.Data, Value.VarName, Value.TypeName, Functionhead);
}
AppendIx += "\n return ";
foreach (var Value in ReturnedValues)
{
AppendIx = AppendIx + String.Format("{0},", GetSubstituteValue(Value.TypeName));
}
AppendIx += "\n end\n ";
}
private static string GetSubstituteValue(string p)
{
switch (p){
case("number"):{return "42";}
case("boolean"):{return "true";}
case("function"):{return "function T(v) print(v) end";}
case("table"):{return "{[1]=\"Test\", test=42, 1, 2, 3, x=8,y=8,z=8, unitid=12314}";}
default:{return "nil";}
}
}
private static Value GetTable(string tableString)
{
var splitit = tableString.Trim('{').TrimEnd('}').Split(new char[] { ',' });
List<Value> returnTable= new List<Value>();
foreach (var V in splitit)
{
var vtab = V.Trim().Split(' ');
if (vtab.Length == 2)
{
returnTable.Add(new Value()
{
TypeName=GetType(vtab[0]),
VarName=vtab[1].Trim(),
Data= GetSubstituteValue(GetType(vtab[0]))
});
}
}
return new Value(){Data=returnTable.ToArray(),TypeName="table",VarName="placeholder"};
}
private static List<Value> ExtractReturnValues(string p)
{
List<Value> ReturnList= new List<Value>();;
if (p.Contains('{') && p.Contains('}'))
{
ReturnList.Add(GetTable(p.Substring(p.IndexOf("{"),p.IndexOf("}"))));
var temp=p.Substring(p.LastIndexOf("}"),p.Length-p.LastIndexOf("}"));
p=p.Substring(0,p.IndexOf("{"))+temp;
}
var split = p.Split(new char[] { ',' });
foreach (var it in split)
{
var subSplit = it.Trim().Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);
if (subSplit.Length == 2)
{
var Val =new Value();
Val.TypeName=GetType(subSplit[0].Trim());
Val.VarName=subSplit[1].Trim();
Val.Data=GetSubstituteValue(Val.TypeName);
ReturnList.Add(Val);
}
}
return ReturnList;
}
private static List<Value> ExtractValues(string p)
{
List<Value> ListOfFist = new List<Value>();
var split = p.Replace("[", "").Replace("]", "").Split(new char[] { ',' }); ;
foreach (var item in split)
{
var subsplit = item.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (!subsplit.Contains("Spring.") && !subsplit.Contains(") ->"))
{
if (subsplit.Any() && subsplit.Length == 2)
{
var Val = new Value();
Val.TypeName = GetType(subsplit[0]);
Val.VarName = subsplit[1].Trim();
Val.Data = GetSubstituteValue(Val.TypeName);
ListOfFist.Add(Val);
}
}
}
return ListOfFist;
}
private static string GetType(string p)
{
p=p.Trim().ToLower();
switch(p)
{
case("number"):{return "number";}
case("boolean"):{return "boolean";}
case("function"):{return "function";}
case("table"):{return "table";}
default:{return "number";}
}
}
private static string ExtractFunctionHead(string p)
{
p = p.Substring(p.IndexOf("Spring."), p.Length).Replace("Spring.", "#").TrimStart('#');
p = p.Substring(0, p.IndexOf(" "));
return "Spring." + p;
}
}
}