internal static string AddOutputLineNumbers(string script) { var parser = new TextServices.ScriptParser(); parser.Lex(script); var tokens = parser.GetTokens(); // Replace method calls: Output() --> Output(<linenumber>) var methodCalls = tokens.FindMethodCall("Output", 0); // Find all parameter-less calls to "Output" methodCalls.AddRange(tokens.FindMethodCall("Output", 1)); // Find all single-parameter calls to "Output"; var sb = new StringBuilder(); var pos = 0; foreach (var call in methodCalls) { sb.Append(script.Substring(pos, call.StopToken.StartIndex - pos)); if (call.ParamCount > 0) { sb.Append(","); } sb.Append(call.StartToken.Line); pos = call.StopToken.StartIndex; } sb.Append(script.Substring(pos)); return(sb.ToString()); }
internal static string ReplaceGlobalMethodCalls(string script) { var parser = new TextServices.ScriptParser(); parser.Lex(script); var tokens = parser.GetTokens(); // Replace method calls: Output() --> Output(<linenumber>) var methodCalls = tokens.FindMethodCall(); var sb = new StringBuilder(); var pos = 0; foreach (var call in methodCalls.Where(t => ScriptMethods.ContainsKey(t.StartToken.Text))) { if (call.StartToken.TokenIndex == 0 || tokens[call.StartToken.TokenIndex - 1].Type != CSharpLexer.DOT) { var method = ScriptMethods[call.StartToken.Text]; // Global method called directly: sb.Append(script.Substring(pos, call.StartToken.StartIndex - pos)); sb.Append(method.DeclaringType.FullName); sb.Append("."); pos = call.StartToken.StartIndex; } } sb.Append(script.Substring(pos)); return(sb.ToString()); }
internal static string AddOutputLineNumbers(string script) { var parser = new TextServices.ScriptParser(); parser.Lex(script); var tokens = parser.GetTokens(); // Replace method calls: Output() --> Output(<linenumber>) var methodCalls = tokens.FindMethodCall("Output", 0); // Find all parameter-less calls to "Output" methodCalls.AddRange(tokens.FindMethodCall("Output", 1)); // Find all single-parameter calls to "Output"; methodCalls.AddRange(tokens.FindMethodCall("Info", 1)); // Find all single-parameter calls to "Info"; methodCalls.AddRange(tokens.FindMethodCall("Warning", 1)); // Find all single-parameter calls to "Warning"; methodCalls.AddRange(tokens.FindMethodCall("Error", 1)); // Find all single-parameter calls to "Error"; // Build map of Custom Actions: var lines = script.Split('\n').ToList(); var customActionsMap = new List <int>(); for (int i = 0; i < lines.Count; i++) { if (lines[i].StartsWith(CUSTOMACTIONS_CODEINDICATOR)) { customActionsMap.Add(i + 1); } } var sb = new StringBuilder(); var pos = 0; foreach (var call in methodCalls.OrderBy(n => n.StartToken.StartIndex)) { int actionOffset = customActionsMap.LastOrDefault(c => c < call.StopToken.Line); sb.Append(script.Substring(pos, call.StopToken.StartIndex - pos)); if (call.ParamCount > 0) { sb.Append(","); } sb.Append(call.StartToken.Line - actionOffset); pos = call.StopToken.StartIndex; } sb.Append(script.Substring(pos)); return(sb.ToString()); }
private static string AddOutputLineNumbers(string script) { var parser = new TextServices.ScriptParser(); parser.Lex(script); var tokens = parser.GetTokens(); // Replace method calls: Output() --> Output(<linenumber>) var methodCalls = tokens.FindMethodCall("Output", 0); // Find all parameter-less calls to "Output" var sb = new StringBuilder(); var pos = 0; foreach (var call in methodCalls) { sb.Append(script.Substring(pos, call.StopIndex + 1 - pos)); sb.Append("(" + (call.Line) + ")"); pos = tokens[call.TokenIndex + 2].StartIndex + 1; } sb.Append(script.Substring(pos)); return(sb.ToString()); }