public static IEnumerable<MethodCall> Parse(string code) { foreach (var match in MethodCallRegex.Matches(code).OfType<Match>()) { var openBracketIndex = match.Groups["open"].Index; var parameters = new StringBuilder(); var innerStructures = new InnerStructures.InnerStructures(); int j; for (j = openBracketIndex; j < code.Length; j++) { innerStructures.Handle(code[j]); parameters.Append(code[j]); if (!innerStructures.IsInsideSomeStructure) break; } var parametersString = parameters.ToString(); var parametersStringWithoutSurroundingBrackets = parametersString.Substring(1, parametersString.Length - 2); var parametersCollection = parametersStringWithoutSurroundingBrackets.SplitByComma().ToArray(); var methodName = match.Groups["name"].Value; var originalText = code.SafeSubstring(match.Index, j - match.Index + 1); var methodCall = new MethodCall(methodName, parametersCollection, originalText); yield return methodCall; } }
private static void HandleIndexStyles(MethodCall[] methodCalls, Algo algo, ParsingErrors parsingErrors) { var setIndexStyleCalls = methodCalls.Where(call => call.MethodName == "SetIndexStyle"); var indexesStyles = new Dictionary<int, DrawingShapeStyle>(); foreach (var methodCall in setIndexStyleCalls) { int index; if (!int.TryParse(methodCall.Parameters[0], out index)) { parsingErrors.Add(ErrorType.NotSupportedWarning, "SetIndexStyle", "Can't cast to int: " + methodCall.Parameters[0]); continue; } var drawingShapeStyle = methodCall.Parameters[1].ToDrawingShapeStyle(); indexesStyles[index] = drawingShapeStyle; if (methodCall.Parameters.Length >= 4) { int width; if (int.TryParse(methodCall.Parameters[3], out width)) algo.Widths[index] = width; } } foreach (var keyValuePair in indexesStyles) { algo.Styles[keyValuePair.Key] = keyValuePair.Value; } }