private string ExectueFormat(string text) { StringBuilder output = new StringBuilder(); InitParser(); var pt = Parser.Parse(text); if (Parser.Context.HasErrors) { throw new Exception("Cannot formet code due to syntax error"); } tokenMap = new Dictionary <SourceLocation, LuaTokenInfo>(); var indentState = new LuaIndentState(text); Traverse(indentState, pt.Root, 0); var depthTable = indentState.BuildDepthTable(pt.Root); InitParser(); Parser.Scanner.VsSetSource(text, 0); bool lastLineHasToken = false; int lastLine = 0; Token lastToken = null; Token lastLastToken = null; StringBuilder lastLineBuilder = new StringBuilder(); List <string> lineCache = new List <string>(); while (true) { int s = 0; Token token = Parser.Scanner.VsReadToken(ref s); if (token == null) { break; } SourceLocation sl = new SourceLocation(token.Location.Position, token.Location.Line - 1, token.Location.Column); LuaTokenInfo tokenInfo = null; if (tokenMap.ContainsKey(sl)) { tokenInfo = tokenMap[sl]; } LuaTokenInfo lastTokenInfo = null; if (lastToken != null) { SourceLocation lastSl = new SourceLocation(lastToken.Location.Position, lastToken.Location.Line - 1, lastToken.Location.Column); if (tokenMap.ContainsKey(lastSl)) { lastTokenInfo = tokenMap[lastSl]; } } if (sl.Line != lastLine) { if (!lastLineHasToken) { using (StringReader sr = new StringReader(lastLineBuilder.ToString())) { while (true) { string cacheLine = sr.ReadLine(); if (cacheLine == null) { break; } lineCache.Add(cacheLine); } } } else { Write(output, depthTable, lastLine, lastLineBuilder, lineCache); lineCache.Clear(); } for (int i = lastLine + lineCache.Count + 1; i < sl.Line; i++) { lineCache.Add(""); } lastLineHasToken = false; lastLine = sl.Line; lastLineBuilder.Clear(); lastToken = null; lastLastToken = null; } if (tokenInfo != null) { lastLineHasToken = true; } AppendSpace(lastLineBuilder, lastToken, lastTokenInfo, token); lastLineBuilder.Append(token.Text); lastLastToken = lastToken; lastToken = token; } Write(output, depthTable, lastLine, lastLineBuilder, lineCache); return(output.ToString()); }
private void AppendSpace(StringBuilder lastLineBuilder, Token lastToken, LuaTokenInfo lastTokenInfo, Token token) { LuaTokenType lastTokenType = LuaTokenType.None; if (lastToken != null) { lastTokenType = GetTokenType(lastToken); } LuaTokenType tokenType = GetTokenType(token); if (lastTokenType == LuaTokenType.None) { // don't append space } else if (lastTokenType == LuaTokenType.LeftBracket) { // don't append space } else if (lastTokenType == LuaTokenType.RightBracket) { if (tokenType == LuaTokenType.Keyword) { AppendSpace(lastLineBuilder); } else if (tokenType == LuaTokenType.Operator) { if (token.Text == "." || token.Text == ":") { } else { AppendSpace(lastLineBuilder); } } // don't append space } else if (lastTokenType == LuaTokenType.Delimiter) { AppendSpace(lastLineBuilder); } else if (lastTokenType == LuaTokenType.Identifier) { if (tokenType == LuaTokenType.LeftBracket) { ; } else if (tokenType == LuaTokenType.RightBracket) { ; } else if (tokenType == LuaTokenType.Delimiter) { } else if (token.Text == "." || token.Text == ":") { } else { AppendSpace(lastLineBuilder); } } else if (lastTokenType == LuaTokenType.Keyword) { if (tokenType == LuaTokenType.LeftBracket) { if (lastToken.Text != "function") { AppendSpace(lastLineBuilder); } } else if (tokenType == LuaTokenType.RightBracket) { if (lastToken.Text != "end") { AppendSpace(lastLineBuilder); } } else if (tokenType == LuaTokenType.Delimiter) { } else if (token.Text == "." || token.Text == ":") { } else { AppendSpace(lastLineBuilder); } } else if (lastTokenType == LuaTokenType.Operator) { if (lastToken.Text == "#" || lastToken.Text == "." || lastToken.Text == ":") { // don't append sapce } else if (lastTokenInfo.IsUnOp == true && lastToken.Text != "not") { // don't append space } else { AppendSpace(lastLineBuilder); } } else { throw new Exception("error token type"); } }