// Token: 0x060021BE RID: 8638 RVA: 0x000A86EC File Offset: 0x000A68EC private ArrayList TokenizeAttributes(string args, int lineNumber, int linePosition, Type extensionType) { if (extensionType == typeof(MarkupExtensionParser.UnknownMarkupExtension)) { return(null); } int num = 0; ParameterInfo[] array = this.FindLongestConstructor(extensionType, out num); Dictionary <string, SpecialBracketCharacters> dictionary = this._parserContext.InitBracketCharacterCacheForType(extensionType); Stack <char> stack = new Stack <char>(); int num2 = 0; bool flag = array != null && num > 0; bool flag2 = false; ArrayList arrayList = null; int length = args.Length; bool flag3 = false; bool flag4 = false; bool flag5 = false; bool flag6 = false; char c = '\''; int num3 = 0; StringBuilder stringBuilder = null; SpecialBracketCharacters specialBracketCharacters = null; if (flag && dictionary != null) { string text = (num > 0) ? array[num2].Name : null; if (!string.IsNullOrEmpty(text)) { specialBracketCharacters = this.GetBracketCharacterForProperty(text, dictionary); } } int num4 = 0; while (num4 < length && !flag6) { if (!flag4 && args[num4] == '\\') { flag4 = true; } else { if (!flag5 && !char.IsWhiteSpace(args[num4])) { flag5 = true; } if (flag3 || num3 > 0 || flag5) { if (stringBuilder == null) { stringBuilder = new StringBuilder(length); arrayList = new ArrayList(1); } if (flag4) { stringBuilder.Append('\\'); stringBuilder.Append(args[num4]); flag4 = false; } else if (flag3 || num3 > 0) { if (flag3 && args[num4] == c) { flag3 = false; flag5 = false; MarkupExtensionParser.AddToTokenList(arrayList, stringBuilder, false); } else { if (num3 > 0 && args[num4] == '}') { num3--; } else if (args[num4] == '{') { num3++; } stringBuilder.Append(args[num4]); } } else if (flag2) { stringBuilder.Append(args[num4]); if (specialBracketCharacters.StartsEscapeSequence(args[num4])) { stack.Push(args[num4]); } else if (specialBracketCharacters.EndsEscapeSequence(args[num4])) { if (specialBracketCharacters.Match(stack.Peek(), args[num4])) { stack.Pop(); } else { this.ThrowException("ParserMarkupExtensionInvalidClosingBracketCharacers", args[num4].ToString(), lineNumber, linePosition); } } if (stack.Count == 0) { flag2 = false; } } else { char c2 = args[num4]; if (c2 <= ',') { if (c2 == '"' || c2 == '\'') { if (stringBuilder.Length != 0) { this.ThrowException("ParserMarkupExtensionNoQuotesInName", args, lineNumber, linePosition); } flag3 = true; c = args[num4]; goto IL_441; } if (c2 != ',') { goto IL_405; } } else if (c2 != '=') { if (c2 == '{') { num3++; stringBuilder.Append(args[num4]); goto IL_441; } if (c2 != '}') { goto IL_405; } flag6 = true; if (stringBuilder == null) { goto IL_441; } if (stringBuilder.Length > 0) { MarkupExtensionParser.AddToTokenList(arrayList, stringBuilder, true); goto IL_441; } if (arrayList.Count > 0 && arrayList[arrayList.Count - 1] is char) { this.ThrowException("ParserMarkupExtensionBadDelimiter", args, lineNumber, linePosition); goto IL_441; } goto IL_441; } if (flag && args[num4] == ',') { flag = (++num2 < num); if (flag) { string text = array[num2].Name; specialBracketCharacters = this.GetBracketCharacterForProperty(text, dictionary); } } if (stringBuilder != null && stringBuilder.Length > 0) { MarkupExtensionParser.AddToTokenList(arrayList, stringBuilder, true); if (stack.Count != 0) { this.ThrowException("ParserMarkupExtensionMalformedBracketCharacers", stack.Peek().ToString(), lineNumber, linePosition); } } else if (arrayList.Count == 0) { this.ThrowException("ParserMarkupExtensionDelimiterBeforeFirstAttribute", args, lineNumber, linePosition); } else if (arrayList[arrayList.Count - 1] is char) { this.ThrowException("ParserMarkupExtensionBadDelimiter", args, lineNumber, linePosition); } if (args[num4] == '=') { flag = false; string text = (string)arrayList[arrayList.Count - 1]; specialBracketCharacters = this.GetBracketCharacterForProperty(text, dictionary); } arrayList.Add(args[num4]); flag5 = false; goto IL_441; IL_405: if (specialBracketCharacters != null && specialBracketCharacters.StartsEscapeSequence(args[num4])) { stack.Clear(); stack.Push(args[num4]); flag2 = true; } stringBuilder.Append(args[num4]); } } } IL_441: num4++; } if (!flag6) { this.ThrowException("ParserMarkupExtensionNoEndCurlie", "}", lineNumber, linePosition); } else if (num4 < length) { this.ThrowException("ParserMarkupExtensionTrailingGarbage", "}", args.Substring(num4, length - num4), lineNumber, linePosition); } return(arrayList); }