/// <summary> /// When a name is absent, deconstruct a given tuple, otherwise create virtual member references /// </summary> private Ust HandleTupleStatement(VariableDeclarationSyntax node) { List <AssignmentExpression> variables = node.Variables.Select(v => (AssignmentExpression)VisitAndReturnNullIfError(v)).ToList(); var typeNode = (TupleTypeSyntax)node.Type; var textSpan = node.GetTextSpan(); for (int i = 0; i < typeNode.Elements.Count; i++) { TupleElementSyntax typeElement = typeNode.Elements[i]; if (typeElement.Identifier == null) { continue; } var initValues = node.Variables.Select(v => { var tuple = v.Initializer?.Value as TupleExpressionSyntax; if (tuple == null) { return(null); } return((Expression)base.Visit(tuple.Arguments.ElementAtOrDefault(i))); }).ToList(); variables = CreateVirtualMemberRefs(variables, typeElement, i, initValues, typeNode.Elements[i].GetTextSpan()); } var declaration = new VariableDeclarationExpression(null, variables, textSpan); return(new ExpressionStatement(declaration)); }
public override UstNode VisitVariableDeclaration(VariableDeclarationSyntax node) { var typeToken = ConvertType(base.Visit(node.Type)); AssignmentExpression[] vars = node .Variables.Select(v => (AssignmentExpression)VisitAndReturnNullIfError(v)) .ToArray(); var result = new VariableDeclarationExpression(typeToken, vars, node.GetTextSpan(), FileNode); return(result); }