internal void StoreStringObject(List<JintItem> Object, string Value) { if (Value.Length == 0) return; string ExistingValue = GetStringObject(Object); if (ExistingValue.Equals(Value)) return; if (ExistingValue.Length > 0) { int RemovalIndex = -1; for (int i = 0; i < InterestingStringHolders[ExistingValue].Count; i++) { ItemChecker IC = new ItemChecker(this); if (IC.DoItemsMatch(InterestingStringHolders[ExistingValue][i], Object).NeutralReasons.Count > 0) RemovalIndex = i; } if (RemovalIndex >= 0) InterestingStringHolders[ExistingValue].RemoveAt(RemovalIndex); } if (InterestingStringHolders.ContainsKey(Value)) InterestingStringHolders[Value].Add(Object); else InterestingStringHolders.Add(Value, new List<List<JintItem>>() { Object }); }
internal string GetStringObject(List<JintItem> Object) { bool FirstCheck = true; ItemChecker IC = new ItemChecker(this); int AddedAt = 0; foreach (List<JintItem> StrItem in SentForStringConversion) { if (ItemChecker.IsSimilar(Object, StrItem)) { FirstCheck = false; break; } } if (FirstCheck) { SentForStringConversion.Add(Object); AddedAt = SentForStringConversion.Count - 1; } foreach (string Key in InterestingStringHolders.Keys) { foreach (List<JintItem> Item in InterestingStringHolders[Key]) { if (FirstCheck) { if (IC.DoItemsMatch(Item, Object).NeutralReasons.Count > 0) { SentForStringConversion.RemoveAt(AddedAt); return Key; } } else { if (ItemChecker.IsSimilar(Item, Object)) return Key; } } } if (FirstCheck) SentForStringConversion.RemoveAt(AddedAt); return ""; }
internal void RemoveStringObject(List<JintItem> Object) { foreach (string Key in InterestingStringHolders.Keys) { List<int> RemoveIndexes = new List<int>(); int Index = -1; foreach (List<JintItem> Item in InterestingStringHolders[Key]) { Index++; ItemChecker IC = new ItemChecker(this); if (IC.DoItemsMatch(Item, Object).NeutralReasons.Count > 0) RemoveIndexes.Add(Index); } for (int i = 0; i < RemoveIndexes.Count; i++ ) { InterestingStringHolders[Key].RemoveAt(RemoveIndexes[i] - i); } } }
List<JintItem> GetMappedItem(List<JintItem> LeftItem, List<JintItem> RightItem, List<JintItem> List) { List<JintItem> EmptyResult = new List<JintItem>(); if (RightItem.Count == 0 || LeftItem.Count == 0 || List.Count == 0) return EmptyResult; ItemChecker IC = new ItemChecker(this); if (IC.DoItemsMatch(List, RightItem, false).NeutralReasons.Count == 0) return EmptyResult; int RightMatchStopIndex = -1; if (RightItem[0].State == JintState.Identifier && LeftItem[0].State == JintState.Identifier && (List[0].State == JintState.Identifier || List[0].State == JintState.MethodCallName)) { if (RightItem[0].Value.Equals(List[0].Value)) RightMatchStopIndex++; else return EmptyResult; for (int i = 1; i < RightItem.Count; i++) { if ((RightItem[i].State == JintState.Property || RightItem[i].State == JintState.StringIndex) && (List.Count > i) && (List[i].State == JintState.Property || List[i].State == JintState.StringIndex || List[i].State == JintState.MethodCallName)) { if (RightItem[i].Value.Equals(List[i].Value)) RightMatchStopIndex++; else break; } else break; } } else { return EmptyResult; } if (RightMatchStopIndex < RightItem.Count -1) return EmptyResult; List<JintItem> ResultItem = new List<JintItem>(LeftItem); for (int i = RightMatchStopIndex + 1; i < List.Count; i++) { if (List[i].State == JintState.MethodCallArgument) { if (i > 0 && ResultItem.Count > 0) { if (ResultItem[ResultItem.Count - 1].State == JintState.Identifier || ResultItem[ResultItem.Count - 1].State == JintState.Property) ResultItem[ResultItem.Count - 1].State = JintState.MethodCallName; } } ResultItem.Add(List[i]); } return ResultItem; }