public ExpressionResult Resolve() { if (_analyzedInvocation.ArgumentList.Arguments.Any()) { var replacingInVariableResolution = _expressionResolverInstance.GetStringValueOfExpression(_document, _nextExpressionSyntax.Expression, _nodes, _semanticModel); var stringToReplaceResolution = _expressionResolverInstance.GetStringValueOfExpression(_document, _analyzedInvocation.ArgumentList.Arguments[0].Expression, _nodes, _semanticModel); var stringToReplaceWithResolution = _expressionResolverInstance.GetStringValueOfExpression(_document, _analyzedInvocation.ArgumentList.Arguments[1].Expression, _nodes, _semanticModel); if (replacingInVariableResolution.IsSolved && stringToReplaceResolution.IsSolved && stringToReplaceWithResolution.IsSolved) { return(new ExpressionResult { CanBeUsedAsQuery = false, ExpressionText = _analyzedInvocation.ToString(), IsSolved = true, TextResult = replacingInVariableResolution.TextResult.Replace(stringToReplaceResolution.TextResult, stringToReplaceWithResolution.TextResult) }); } return(new ExpressionResult { CanBeUsedAsQuery = false, ExpressionText = _analyzedInvocation.ToString(), IsSolved = false, UnresolvableReason = "Unable to resolve all variables needed.", }); } return(new ExpressionResult { CanBeUsedAsQuery = false, ExpressionText = _analyzedInvocation.ToString(), IsSolved = false, UnresolvableReason = "No argument provided to method.", }); }
public ExpressionResult Resolve(Document document, ExpressionSyntax expressionSyntax, IEnumerable <SyntaxNode> nodes, SemanticModel semanticModel, ExpressionResolver expressionResolverInstance) { using (MiniProfiler.Current.Step(nameof(AddStrategy))) { var binaryExpressionNode = expressionSyntax as BinaryExpressionSyntax; var leftExpression = binaryExpressionNode.Left; var rightExpression = binaryExpressionNode.Right; var leftExpressionValue = expressionResolverInstance.GetStringValueOfExpression(document, leftExpression, nodes, semanticModel); var rightExpressionValue = expressionResolverInstance.GetStringValueOfExpression(document, rightExpression, nodes, semanticModel); if (leftExpressionValue.IsSolved && rightExpressionValue.IsSolved) { return(new ExpressionResult { IsSolved = true, CanBeUsedAsQuery = false, ExpressionText = expressionSyntax.ToString(), TextResult = leftExpressionValue.TextResult + rightExpressionValue.TextResult, }); } var result = new ExpressionResult { IsSolved = false, ExpressionText = expressionSyntax.ToString(), }; if (!leftExpressionValue.IsSolved) { result.TextResult += leftExpressionValue.TextResult; result.CanBeUsedAsQuery = leftExpressionValue.CanBeUsedAsQuery; result.UnresolvableReason = leftExpressionValue.UnresolvableReason; result.UnresolvedPart = leftExpressionValue.UnresolvedPart; result.UnresolvedValue = leftExpressionValue.UnresolvedValue; result.UnresolvedFormat = "{0}" + rightExpressionValue.TextResult; } if (!rightExpressionValue.IsSolved) { result.TextResult += rightExpressionValue.TextResult; result.CanBeUsedAsQuery = rightExpressionValue.CanBeUsedAsQuery; result.UnresolvableReason = rightExpressionValue.UnresolvableReason; result.UnresolvedPart = rightExpressionValue.UnresolvedPart; result.UnresolvedValue = rightExpressionValue.UnresolvedValue; result.UnresolvedFormat = leftExpressionValue.TextResult + "{0}"; } if (!rightExpressionValue.IsSolved && !leftExpressionValue.IsSolved) { result.CanBeUsedAsQuery = false; result.UnresolvableReason = $"{leftExpressionValue.UnresolvableReason}{rightExpressionValue.UnresolvableReason}"; } return(result); } }
public ExpressionResult Resolve(Document document, ExpressionSyntax expressionSyntax, IEnumerable <SyntaxNode> nodes, SemanticModel semanticModel, ExpressionResolver expressionResolverInstance) { using (MiniProfiler.Current.Step(nameof(InterpolatedStringStrategy))) { var interpolatedNode = expressionSyntax as InterpolatedStringExpressionSyntax; List <ExpressionResult> expressionResolverResults = new List <ExpressionResult>(); foreach (var content in interpolatedNode.Contents) { if (content is InterpolationSyntax) { var expression = (content as InterpolationSyntax).Expression; expressionResolverResults.Add(expressionResolverInstance.GetStringValueOfExpression(document, expression, nodes, semanticModel)); } if (content is InterpolatedStringTextSyntax) { expressionResolverResults.Add(new ExpressionResult { IsSolved = true, CanBeUsedAsQuery = false, ExpressionText = interpolatedNode.ToString(), TextResult = (content as InterpolatedStringTextSyntax).TextToken.Text, }); } } if (expressionResolverResults.Any(e => !e.IsSolved && e.CanBeUsedAsQuery)) { return(new ExpressionResult { CanBeUsedAsQuery = !(expressionResolverResults.Count(e => !e.IsSolved && e.CanBeUsedAsQuery) > 1),//Atm, only allow for 1 variable ExpressionText = interpolatedNode.ToString(), IsSolved = false, TextResult = string.Join("", expressionResolverResults.Select(e => e.TextResult)), UnresolvableReason = expressionResolverResults.First(e => !e.IsSolved).TextResult, UnresolvedPart = expressionResolverResults.First(e => !e.IsSolved).UnresolvedPart, UnresolvedValue = expressionResolverResults.First(e => !e.IsSolved).UnresolvedValue, UnresolvedFormat = string.Join("", expressionResolverResults.Select(e => e.IsSolved ? e.TextResult : "{0}")), }); } return(new ExpressionResult { CanBeUsedAsQuery = false, ExpressionText = string.Join("", expressionResolverResults.Select(e => e.TextResult)), IsSolved = true, TextResult = string.Join("", expressionResolverResults.Select(e => e.TextResult)), }); } }
public ExpressionResult Resolve() { string format = ""; if (_expressionSyntax.ArgumentList.Arguments[0].Expression is LiteralExpressionSyntax) { format = (_expressionSyntax.ArgumentList.Arguments[0].Expression as LiteralExpressionSyntax).Token.ValueText; } List <string> parameters = new List <string>(); List <ExpressionResult> expressionResolverResults = new List <ExpressionResult>(); foreach (var parameter in _expressionSyntax.ArgumentList.Arguments.Skip(1)) { expressionResolverResults.Add(_expressionResolverInstance.GetStringValueOfExpression(_document, parameter.Expression, _nodes, _semanticModel)); } if (expressionResolverResults.Any(e => !e.IsSolved && e.CanBeUsedAsQuery)) { return(new ExpressionResult { CanBeUsedAsQuery = !(expressionResolverResults.Count(e => !e.IsSolved && e.CanBeUsedAsQuery) > 1),//Atm, only allow for 1 variable ExpressionText = _expressionSyntax.ToString(), IsSolved = false, TextResult = string.Format(format, expressionResolverResults.Select(e => e.TextResult).ToArray()), UnresolvableReason = expressionResolverResults.First(e => !e.IsSolved).TextResult, UnresolvedPart = expressionResolverResults.First(e => !e.IsSolved).UnresolvedPart, UnresolvedValue = expressionResolverResults.First(e => !e.IsSolved).UnresolvedValue, UnresolvedFormat = string.Join("", expressionResolverResults.Select(e => e.IsSolved ? e.TextResult : "{0}")), }); } return(new ExpressionResult { CanBeUsedAsQuery = false, ExpressionText = _expressionSyntax.ToString(), IsSolved = true, TextResult = string.Format(format, expressionResolverResults.Select(e => e.TextResult).ToArray()), }); }
public ExpressionResult Resolve(Document document, ExpressionSyntax expressionSyntax, IEnumerable <SyntaxNode> nodes, SemanticModel semanticModel, ExpressionResolver expressionResolverInstance) { using (MiniProfiler.Current.Step(nameof(IdentifierStrategy))) { var identifierNameSyntax = expressionSyntax as IdentifierNameSyntax; var descendantTest = identifierNameSyntax.DescendantNodesAndSelf(); var variableDeclaration = nodes.OfType <VariableDeclarationSyntax>().SelectMany(e => e.Variables.Where(x => x.Identifier.Text == identifierNameSyntax.Identifier.Text)).FirstOrDefault(); if (variableDeclaration == null)//If no Variable of matching name was found, than look in properties. { var property = nodes.OfType <PropertyDeclarationSyntax>().FirstOrDefault(e => e.Identifier.ValueText == identifierNameSyntax.Identifier.ValueText); if (property?.ExpressionBody != null) { return(expressionResolverInstance.GetStringValueOfExpression(document, property.ExpressionBody.Expression, nodes, semanticModel)); } if (property?.AccessorList != null) { var getter = property.AccessorList.Accessors.FirstOrDefault(e => e.IsKind(SyntaxKind.GetAccessorDeclaration)); var getterBody = getter.Body; if (getterBody == null) { return(new ExpressionResult { IsSolved = false, UnresolvableReason = "Getter Body is null", TextResult = "", }); } var firstReturnStatement = getterBody.Statements.FirstOrDefault(e => e.IsKind(SyntaxKind.ReturnStatement)) as ReturnStatementSyntax; return(expressionResolverInstance.GetStringValueOfExpression(document, firstReturnStatement.Expression, nodes, semanticModel)); } } if (variableDeclaration?.Initializer != null) { return(expressionResolverInstance.GetStringValueOfExpression(document, variableDeclaration.Initializer.Value, nodes, semanticModel)); } //Field/variable is in other document than currently analyzed if (identifierNameSyntax.SyntaxTree.FilePath != expressionSyntax.SyntaxTree.FilePath) { return(expressionResolverInstance.GetStringValueOfExpression(null, identifierNameSyntax, identifierNameSyntax.SyntaxTree.GetRoot().DescendantNodes(), null)); } //Field/variable could still be in other document, but expression is not saying this. Unsafe if (semanticModel != null) { var symbol = semanticModel.GetSymbolInfo(identifierNameSyntax); if (symbol.Symbol != null) { if (symbol.Symbol.Locations.Count() == 1 && identifierNameSyntax.SyntaxTree.FilePath != symbol.Symbol.Locations[0].SourceTree.FilePath) { return(expressionResolverInstance.GetStringValueOfExpression(null, identifierNameSyntax, symbol.Symbol.Locations[0].SourceTree.GetRoot().DescendantNodes(), null)); } } } var assigmentsInDocument = nodes.OfType <AssignmentExpressionSyntax>(); var assigmentExpressions = assigmentsInDocument .Where(e => (e.Left as IdentifierNameSyntax)?.Identifier.Text == identifierNameSyntax.Identifier.Text).Select(e => e.Right) .Concat( assigmentsInDocument .Where(e => (e.Right as IdentifierNameSyntax)?.Identifier.Text == identifierNameSyntax.Identifier.Text).Select(e => e.Left) ); foreach (var expression in assigmentExpressions) { var expressionResult = expressionResolverInstance.GetStringValueOfExpression(document, expression, nodes, semanticModel); if (expressionResult.IsSolved || expressionResult.CanBeUsedAsQuery) { return(expressionResult); } } return(new ExpressionResult { IsSolved = false, UnresolvableReason = "Unable to find identifier initializer in document.", TextResult = "", }); } }