private CasePatternSwitchLabelSyntax WrapInCasePatternSwitchLabelSyntax(VBSyntax.SelectBlockSyntax node, ExpressionSyntax cSharpSyntaxNode, bool treatAsBoolean = false) { var typeInfo = _semanticModel.GetTypeInfo(node.SelectStatement.Expression); DeclarationPatternSyntax patternMatch; if (typeInfo.ConvertedType.SpecialType == SpecialType.System_Boolean || treatAsBoolean) { patternMatch = SyntaxFactory.DeclarationPattern( SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.ObjectKeyword)), SyntaxFactory.DiscardDesignation()); } else { var varName = CommonConversions.ConvertIdentifier(SyntaxFactory.Identifier(GetUniqueVariableNameInScope(node, "case"))).ValueText; patternMatch = SyntaxFactory.DeclarationPattern( SyntaxFactory.ParseTypeName("var"), SyntaxFactory.SingleVariableDesignation(SyntaxFactory.Identifier(varName))); cSharpSyntaxNode = SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, SyntaxFactory.IdentifierName(varName), cSharpSyntaxNode); } var casePatternSwitchLabelSyntax = SyntaxFactory.CasePatternSwitchLabel(patternMatch, SyntaxFactory.WhenClause(cSharpSyntaxNode), SyntaxFactory.Token(SyntaxKind.ColonToken)); return(casePatternSwitchLabelSyntax); }
public override SyntaxList <StatementSyntax> VisitSelectBlock(VBSyntax.SelectBlockSyntax node) { var expr = (ExpressionSyntax)node.SelectStatement.Expression.Accept(_nodesVisitor); var exprWithoutTrivia = expr.WithoutTrivia().WithoutAnnotations(); var sections = new List <SwitchSectionSyntax>(); foreach (var block in node.CaseBlocks) { var labels = new List <SwitchLabelSyntax>(); foreach (var c in block.CaseStatement.Cases) { if (c is VBSyntax.SimpleCaseClauseSyntax s) { var expressionSyntax = (ExpressionSyntax)s.Value.Accept(_nodesVisitor); SwitchLabelSyntax caseSwitchLabelSyntax = SyntaxFactory.CaseSwitchLabel(expressionSyntax); if (!_semanticModel.GetConstantValue(s.Value).HasValue) { caseSwitchLabelSyntax = WrapInCasePatternSwitchLabelSyntax(expressionSyntax); } labels.Add(caseSwitchLabelSyntax); } else if (c is VBSyntax.ElseCaseClauseSyntax) { labels.Add(SyntaxFactory.DefaultSwitchLabel()); } else if (c is VBSyntax.RelationalCaseClauseSyntax relational) { var operatorKind = VBasic.VisualBasicExtensions.Kind(relational); var cSharpSyntaxNode = SyntaxFactory.BinaryExpression(operatorKind.ConvertToken(TokenContext.Local), exprWithoutTrivia, (ExpressionSyntax)relational.Value.Accept(_nodesVisitor)); labels.Add(WrapInCasePatternSwitchLabelSyntax(cSharpSyntaxNode)); } else if (c is VBSyntax.RangeCaseClauseSyntax range) { var lowerBoundCheck = SyntaxFactory.BinaryExpression(SyntaxKind.LessThanOrEqualExpression, (ExpressionSyntax)range.LowerBound.Accept(_nodesVisitor), exprWithoutTrivia); var upperBoundCheck = SyntaxFactory.BinaryExpression(SyntaxKind.LessThanOrEqualExpression, exprWithoutTrivia, (ExpressionSyntax)range.UpperBound.Accept(_nodesVisitor)); var withinBounds = SyntaxFactory.BinaryExpression(SyntaxKind.LogicalAndExpression, lowerBoundCheck, upperBoundCheck); labels.Add(WrapInCasePatternSwitchLabelSyntax(withinBounds)); } else { throw new NotSupportedException(c.Kind().ToString()); } } var csBlockStatements = block.Statements.SelectMany(s => s.Accept(CommentConvertingVisitor)).ToList(); if (csBlockStatements.LastOrDefault() ?.IsKind(SyntaxKind.ReturnStatement) != true) { csBlockStatements.Add(SyntaxFactory.BreakStatement()); } var list = SingleStatement(SyntaxFactory.Block(csBlockStatements)); sections.Add(SyntaxFactory.SwitchSection(SyntaxFactory.List(labels), list)); } var switchStatementSyntax = SyntaxFactory.SwitchStatement(expr, SyntaxFactory.List(sections)); return(SingleStatement(switchStatementSyntax)); }
public override SyntaxList <StatementSyntax> VisitSelectBlock(VBSyntax.SelectBlockSyntax node) { var expr = (ExpressionSyntax)node.SelectStatement.Expression.Accept(nodesVisitor); SwitchStatementSyntax switchStatement; if (ConvertToSwitch(expr, node.CaseBlocks, out switchStatement)) { return(SingleStatement(switchStatement)); } throw new NotSupportedException(); }
private static CodeItem MapSwitch(VisualBasicSyntax.SelectBlockSyntax statement, CodeViewUserControl control, SemanticModel semanticModel) { if (statement == null) { return(null); } var item = BaseMapper.MapBase <CodeClassItem>(statement, statement.SelectStatement.Expression.ToString(), control, semanticModel); item.Name = $"Select {item.Name}"; item.Kind = CodeItemKindEnum.Switch; item.Moniker = IconMapper.MapMoniker(item.Kind, item.Access); item.BorderBrush = ColorHelper.ToBrush(Colors.DarkGray); item.Tooltip = TooltipMapper.Map(item.Access, string.Empty, item.Name, item.Parameters); // Map switch cases foreach (var section in statement.CaseBlocks) { item.Members.Add(MapSwitchSection(section, control, semanticModel)); } return(item); }
public override SyntaxList <StatementSyntax> VisitSelectBlock(VBSyntax.SelectBlockSyntax node) => AddLocalVariables(node);
public override Task <SyntaxList <StatementSyntax> > VisitSelectBlock(VBSyntax.SelectBlockSyntax node) => AddLocalVariablesAsync(node, VBasic.SyntaxKind.SelectKeyword, true);