visual studio addin for lua

visual studio addin for lua

Discuss Lua based Spring scripts (LuaUI widgets, mission scripts, gaia scripts, mod-rules scripts, scripted keybindings, etc...)

Moderator: Moderators

Post Reply
wdsprly
Posts: 1
Joined: 12 Mar 2014, 09:14

visual studio addin for lua

Post by wdsprly »

hi,guys!
i have wrote a visual studio addin for lua,which allow you written lua in vs2012/2013.
you can find it at http://visualstudiogallery.msdn.microso ... c7af8ba80f,
or just search 'babelua' at vs extension manager.
github:https://github.com/liyang1221/BabeLua
i hope it will make you working faster and better.
if you have any problem or suggest,please contact me.
:-)
User avatar
PicassoCT
Journeywar Developer & Mapper
Posts: 10454
Joined: 24 Jan 2006, 21:12

Re: visual studio addin for lua

Post by PicassoCT »

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;
          }
     }
}
Post Reply

Return to “Lua Scripts”