public static bool PrecedenceCouldChange(this VBasic.VisualBasicSyntaxNode node) { bool parentIsBinaryExpression = node is VBSyntax.BinaryExpressionSyntax; bool parentIsLambda = node.Parent is VBSyntax.LambdaExpressionSyntax; bool parentIsNonArgumentExpression = node.Parent is VBSyntax.ExpressionSyntax && node.Parent is not VBSyntax.ArgumentSyntax; bool parentIsParenthesis = node.Parent is VBSyntax.ParenthesizedExpressionSyntax; bool parentIsMemberAccessExpression = node.Parent is VBSyntax.MemberAccessExpressionSyntax; return(parentIsMemberAccessExpression || parentIsNonArgumentExpression && !parentIsBinaryExpression && !parentIsLambda && !parentIsParenthesis); }
private async Task <SyntaxList <StatementSyntax> > AddLocalVariablesAsync(VBasic.VisualBasicSyntaxNode node, VBasic.SyntaxKind exitableType = default, bool isBreakableInCs = false) { _additionalLocals.PushScope(exitableType, isBreakableInCs); try { var convertedStatements = await _wrappedVisitor.Visit(node); var withLocals = await _additionalLocals.CreateLocalsAsync(node, convertedStatements, _generatedNames, _semanticModel); var allStatements = _additionalLocals.CreateStatements(node, withLocals, _generatedNames, _semanticModel); if (isBreakableInCs && exitableType == VBasic.SyntaxKind.TryKeyword) { var doOnce = SyntaxFactory.DoStatement(SyntaxFactory.Block(allStatements), CommonConversions.Literal(false)); allStatements = SyntaxFactory.SingletonList <StatementSyntax>(doOnce); } return(allStatements); } finally { _additionalLocals.PopScope(); } }
public static CSSyntax.ExpressionSyntax ParenthesizeIfPrecedenceCouldChange(this VBasic.VisualBasicSyntaxNode node, CSSyntax.ExpressionSyntax expression) { return(PrecedenceCouldChange(node) ? SyntaxFactory.ParenthesizedExpression(expression) : expression); }
private static List <int> GetScopeStarts(VBasic.VisualBasicSyntaxNode node) { return(node.GetAncestorOrThis <VBSyntax.StatementSyntax>().DescendantNodesAndSelf() .OfType <VBSyntax.StatementSyntax>().Select(n => n.SpanStart).ToList()); }
public static string GetUniqueVariableNameInScope(SemanticModel semanticModel, HashSet <string> generatedNames, VBasic.VisualBasicSyntaxNode node, string variableNameBase) { // Need to check not just the symbols this node has access to, but whether there are any nested blocks which have access to this node and contain a conflicting name var scopeStarts = GetScopeStarts(node); return(GenerateUniqueVariableNameInScope(semanticModel, generatedNames, variableNameBase, scopeStarts)); }