public static List <EditSpan> ReformatCode(IVsTextLines pBuffer, TextSpan span, int tabSize) { string filePath = FilePathUtilities.GetFilePath(pBuffer); // Return dynamic scanner based on file extension List <EditSpan> changeList = new List <EditSpan>(); int nbLines; pBuffer.GetLineCount(out nbLines); string codeToFormat; int lastLine; int lastLineIndex; pBuffer.GetLastLineIndex(out lastLine, out lastLineIndex); pBuffer.GetLineText(0, 0, lastLine, lastLineIndex, out codeToFormat); NShaderScanner shaderScanner = NShaderScannerFactory.GetShaderScanner(filePath); Scanner lexer = shaderScanner.Lexer; lexer.SetSource(codeToFormat, 0); int spanStart; int spanEnd; pBuffer.GetPositionOfLineIndex(span.iStartLine, span.iStartIndex, out spanStart); pBuffer.GetPositionOfLineIndex(span.iEndLine, span.iEndIndex, out spanEnd); int state = 0; int start, end; ShaderToken token = (ShaderToken)lexer.GetNext(ref state, out start, out end); List <int> brackets = new List <int>(); List <int> delimiters = new List <int>(); // !EOL and !EOF int level = 0; int startCopy = 0; int levelParenthesis = 0; while (token != ShaderToken.EOF) { switch (token) { case ShaderToken.LEFT_PARENTHESIS: levelParenthesis++; break; case ShaderToken.RIGHT_PARENTHESIS: levelParenthesis--; if (levelParenthesis < 0) { levelParenthesis = 0; } break; case ShaderToken.LEFT_BRACKET: level++; if (codeToFormat[start] == '{' && start >= spanStart && end <= spanEnd) { Match match = matchBraceStart.Match(codeToFormat, start); StringBuilder codeFormatted = new StringBuilder(); codeFormatted.Append("{\r\n"); int levelToIndentNext = level; if (match.Groups.Count == 2) { string matchStr = match.Groups[1].Value; levelToIndentNext--; } for (int i = 0; i < levelToIndentNext; i++) { for (int j = 0; j < tabSize; j++) { codeFormatted.Append(' '); } } if (match.Groups.Count == 2) { codeFormatted.Append("}\r\n"); } TextSpan editTextSpan = new TextSpan(); pBuffer.GetLineIndexOfPosition(start, out editTextSpan.iStartLine, out editTextSpan.iStartIndex); pBuffer.GetLineIndexOfPosition(startCopy + match.Index + match.Length, out editTextSpan.iEndLine, out editTextSpan.iEndIndex); changeList.Add(new EditSpan(editTextSpan, codeFormatted.ToString())); } break; case ShaderToken.RIGHT_BRACKET: level--; if (level < 0) { level = 0; } brackets.Add(start); break; case ShaderToken.DELIMITER: if (codeToFormat[start] == ';' && start >= spanStart && end <= spanEnd && levelParenthesis == 0) { Match match = matchEndOfStatement.Match(codeToFormat, start); StringBuilder codeFormatted = new StringBuilder(); codeFormatted.Append(";\r\n"); int levelToIndentNext = level; bool isBracketFound = (match.Groups.Count == 2 && match.Groups[1].Value == "}"); if (isBracketFound) { string matchStr = match.Groups[1].Value; levelToIndentNext--; } for (int i = 0; i < levelToIndentNext; i++) { for (int j = 0; j < tabSize; j++) { codeFormatted.Append(' '); } } if (isBracketFound) { codeFormatted.Append("}\r\n"); } TextSpan editTextSpan = new TextSpan(); pBuffer.GetLineIndexOfPosition(start, out editTextSpan.iStartLine, out editTextSpan.iStartIndex); pBuffer.GetLineIndexOfPosition(startCopy + match.Index + match.Length, out editTextSpan.iEndLine, out editTextSpan.iEndIndex); changeList.Add(new EditSpan(editTextSpan, codeFormatted.ToString())); } break; } token = (ShaderToken)lexer.GetNext(ref state, out start, out end); } return(changeList); }
public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state) { int start, end; ShaderToken token = (ShaderToken)lex.GetNext(ref state, out start, out end); // !EOL and !EOF if (token != ShaderToken.EOF) { tokenInfo.StartIndex = start; tokenInfo.EndIndex = end; switch (token) { case ShaderToken.KEYWORD: case ShaderToken.TYPE: case ShaderToken.KEYWORD_FX: tokenInfo.Color = TokenColor.Keyword; tokenInfo.Type = TokenType.Keyword; break; case ShaderToken.COMMENT: tokenInfo.Color = TokenColor.Comment; tokenInfo.Type = TokenType.Comment; break; case ShaderToken.COMMENT_LINE: tokenInfo.Color = TokenColor.Comment; tokenInfo.Type = TokenType.LineComment; break; case ShaderToken.NUMBER: case ShaderToken.FLOAT: tokenInfo.Color = TokenColor.Number; tokenInfo.Type = TokenType.Literal; break; case ShaderToken.STRING_LITERAL: tokenInfo.Color = TokenColor.String; tokenInfo.Type = TokenType.Literal; break; case ShaderToken.INTRINSIC: // hugly. TODO generate a NShaderTokenColor to keep tracks of 6-7-8 TokenColors tokenInfo.Color = (TokenColor)6; tokenInfo.Type = TokenType.Identifier; break; case ShaderToken.KEYWORD_SPECIAL: tokenInfo.Color = (TokenColor)7; tokenInfo.Type = TokenType.Identifier; break; case ShaderToken.PREPROCESSOR: tokenInfo.Color = (TokenColor)8; tokenInfo.Type = TokenType.Keyword; break; default: tokenInfo.Color = TokenColor.Text; tokenInfo.Type = TokenType.Text; break; } return(true); } return(false); }
public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state) { int start, end; ShaderToken token = (ShaderToken)lex.GetNext(ref state, out start, out end); // !EOL and !EOF if (token != ShaderToken.EOF) { tokenInfo.StartIndex = start; tokenInfo.EndIndex = end; switch (token) { case ShaderToken.KEYWORD: case ShaderToken.KEYWORD_FX: tokenInfo.Color = TokenColor.Keyword; tokenInfo.Type = TokenType.Keyword; break; case ShaderToken.COMMENT: tokenInfo.Color = TokenColor.Comment; tokenInfo.Type = TokenType.Comment; break; case ShaderToken.COMMENT_LINE: tokenInfo.Color = TokenColor.Comment; tokenInfo.Type = TokenType.LineComment; break; case ShaderToken.NUMBER: case ShaderToken.FLOAT: tokenInfo.Color = TokenColor.Number; tokenInfo.Type = TokenType.Literal; break; case ShaderToken.STRING_LITERAL: tokenInfo.Color = TokenColor.String; tokenInfo.Type = TokenType.Literal; break; case ShaderToken.TYPE: tokenInfo.Color = (TokenColor)NShaderLanguageService.ColorID.Type; tokenInfo.Type = TokenType.Identifier; break; case ShaderToken.INTRINSIC: tokenInfo.Color = (TokenColor)NShaderLanguageService.ColorID.Intrinsic; tokenInfo.Type = TokenType.Identifier; break; case ShaderToken.KEYWORD_SPECIAL: tokenInfo.Color = (TokenColor)NShaderLanguageService.ColorID.Special; tokenInfo.Type = TokenType.Identifier; break; case ShaderToken.PREPROCESSOR: tokenInfo.Color = (TokenColor)NShaderLanguageService.ColorID.Preprocessor; tokenInfo.Type = TokenType.Keyword; break; case ShaderToken.UNITY_STRUCTURE: tokenInfo.Color = (TokenColor)NShaderLanguageService.ColorID.Unity_Structure; tokenInfo.Type = TokenType.Identifier; break; case ShaderToken.UNITY_TYPE: tokenInfo.Color = (TokenColor)NShaderLanguageService.ColorID.Unity_Type; tokenInfo.Type = TokenType.Keyword; break; case ShaderToken.UNITY_VALUE: tokenInfo.Color = (TokenColor)NShaderLanguageService.ColorID.Unity_Value; tokenInfo.Type = TokenType.Identifier; break; case ShaderToken.UNITY_FIXED: tokenInfo.Color = (TokenColor)NShaderLanguageService.ColorID.Unity_Fixed; tokenInfo.Type = TokenType.Keyword; break; default: tokenInfo.Color = TokenColor.Text; tokenInfo.Type = TokenType.Text; break; } return(true); } return(false); }