private void UpdateCleaner(TransparentIdentifierCleaner cleaner, VariableReference identifier, Dictionary <PropertyDefinition, Expression> propertyToValueMap) { Dictionary <MethodDefinition, VariableReference> methodDefToValue = new Dictionary <MethodDefinition, VariableReference>(); foreach (KeyValuePair <PropertyDefinition, Expression> pair in propertyToValueMap) { methodDefToValue.Add(pair.Key.GetMethod, ((VariableReferenceExpression)pair.Value).Variable); } cleaner.TransparentIdentifierToPropertyValueMap.Add(identifier, methodDefToValue); }
private void UpdateCleaner(TransparentIdentifierCleaner cleaner, VariableReference identifier, Dictionary<PropertyDefinition, Expression> propertyToValueMap) { Dictionary<MethodDefinition, VariableReference> methodDefToValue = new Dictionary<MethodDefinition,VariableReference>(); foreach (KeyValuePair<PropertyDefinition, Expression> pair in propertyToValueMap) { methodDefToValue.Add(pair.Key.GetMethod, ((VariableReferenceExpression)pair.Value).Variable); } cleaner.TransparentIdentifierToPropertyValueMap.Add(identifier, methodDefToValue); }
private LinqQueryExpression RemoveTransparentIdentifiers(LinqQueryExpression originalQuery) { LinqQueryExpression linqQuery = (LinqQueryExpression)originalQuery.Clone(); List <VariableReference> identifiers = new List <VariableReference>(); TransparentIdentifierCleaner cleaner = new TransparentIdentifierCleaner(); HashSet <VariableReference> transparentIdentifiers = new HashSet <VariableReference>(); for (int i = 0; i < linqQuery.Clauses.Count; i++) { linqQuery.Clauses[i] = (QueryClause)cleaner.Visit(linqQuery.Clauses[i]); QueryClause currentClause = linqQuery.Clauses[i]; if (currentClause.CodeNodeType == CodeNodeType.FromClause) { identifiers.Add(GetVariableReference((currentClause as FromClause).Identifier)); } else if (currentClause.CodeNodeType == CodeNodeType.JoinClause) { if (linqQuery.Clauses[i + 1].CodeNodeType != CodeNodeType.IntoClause) { identifiers.Add(GetVariableReference((currentClause as JoinClause).InnerIdentifier)); } else { identifiers.Add(((IntoClause)linqQuery.Clauses[i + 1]).Identifier.Variable); i++; } } else if (currentClause.CodeNodeType == CodeNodeType.SelectClause && i != linqQuery.Clauses.Count - 1) { VariableReference intoIdentifier = ((IntoClause)linqQuery.Clauses[i + 1]).Identifier.Variable; if (IsTransparentIdentifier(intoIdentifier)) { Dictionary <PropertyDefinition, Expression> propertyToValueMap = GetPropertyToValueMap((currentClause as SelectClause).Expression); if (propertyToValueMap == null) { return(originalQuery); } if (identifiers.Count == 2) { if (!RemoveIdentifier(propertyToValueMap, identifiers)) { return(originalQuery); } linqQuery.Clauses.RemoveAt(i); linqQuery.Clauses.RemoveAt(i); i--; } else if (identifiers.Count == 1) { LetClause letClause = GenerateLetClause(propertyToValueMap, identifiers[0]); if (letClause == null) { return(originalQuery); } linqQuery.Clauses[i] = letClause; linqQuery.Clauses.RemoveAt(i + 1); } else { return(originalQuery); } this.methodContext.VariablesToRename.Add(intoIdentifier.Resolve()); transparentIdentifiers.Add(intoIdentifier); identifiers.Clear(); identifiers.Add(intoIdentifier); UpdateCleaner(cleaner, intoIdentifier, propertyToValueMap); } } else if (currentClause.CodeNodeType == CodeNodeType.IntoClause) { identifiers.Clear(); identifiers.Add(((IntoClause)currentClause).Identifier.Variable); } } TransparentIdentifierFinder finder = new TransparentIdentifierFinder(transparentIdentifiers); if (finder.ContainsTransparentIdentifiers(linqQuery)) { return(originalQuery); } return(linqQuery); }
private LinqQueryExpression RemoveTransparentIdentifiers(LinqQueryExpression originalQuery) { LinqQueryExpression linqQuery = (LinqQueryExpression)originalQuery.Clone(); List<VariableReference> identifiers = new List<VariableReference>(); TransparentIdentifierCleaner cleaner = new TransparentIdentifierCleaner(); HashSet<VariableReference> transparentIdentifiers = new HashSet<VariableReference>(); for (int i = 0; i < linqQuery.Clauses.Count; i++) { linqQuery.Clauses[i] = (QueryClause)cleaner.Visit(linqQuery.Clauses[i]); QueryClause currentClause = linqQuery.Clauses[i]; if (currentClause.CodeNodeType == CodeNodeType.FromClause) { identifiers.Add(GetVariableReference((currentClause as FromClause).Identifier)); } else if (currentClause.CodeNodeType == CodeNodeType.JoinClause) { if (linqQuery.Clauses[i + 1].CodeNodeType != CodeNodeType.IntoClause) { identifiers.Add(GetVariableReference((currentClause as JoinClause).InnerIdentifier)); } else { identifiers.Add(((IntoClause)linqQuery.Clauses[i + 1]).Identifier.Variable); i++; } } else if (currentClause.CodeNodeType == CodeNodeType.SelectClause && i != linqQuery.Clauses.Count - 1) { VariableReference intoIdentifier = ((IntoClause)linqQuery.Clauses[i + 1]).Identifier.Variable; if (IsTransparentIdentifier(intoIdentifier)) { Dictionary<PropertyDefinition, Expression> propertyToValueMap = GetPropertyToValueMap((currentClause as SelectClause).Expression); if (propertyToValueMap == null) { return originalQuery; } if (identifiers.Count == 2) { if (!RemoveIdentifier(propertyToValueMap, identifiers)) { return originalQuery; } linqQuery.Clauses.RemoveAt(i); linqQuery.Clauses.RemoveAt(i); i--; } else if (identifiers.Count == 1) { LetClause letClause = GenerateLetClause(propertyToValueMap, identifiers[0]); if (letClause == null) { return originalQuery; } linqQuery.Clauses[i] = letClause; linqQuery.Clauses.RemoveAt(i + 1); } else { return originalQuery; } this.methodContext.VariablesToRename.Add(intoIdentifier.Resolve()); transparentIdentifiers.Add(intoIdentifier); identifiers.Clear(); identifiers.Add(intoIdentifier); UpdateCleaner(cleaner, intoIdentifier, propertyToValueMap); } } else if (currentClause.CodeNodeType == CodeNodeType.IntoClause) { identifiers.Clear(); identifiers.Add(((IntoClause)currentClause).Identifier.Variable); } } TransparentIdentifierFinder finder = new TransparentIdentifierFinder(transparentIdentifiers); if (finder.ContainsTransparentIdentifiers(linqQuery)) { return originalQuery; } return linqQuery; }