private StatementSyntax ParseDeclarationStatement()
        {
            var typedefKeyword = NextTokenIf(SyntaxKind.TypedefKeyword);

            var mods = new List<SyntaxToken>();
            var variables = new List<SyntaxNode>();
            ParseDeclarationModifiers(mods);
            var type = ParseType(false);

            if (typedefKeyword != null)
            {
                ParseTypeAliases(variables);
                var semi = Match(SyntaxKind.SemiToken);
                return new TypedefStatementSyntax(typedefKeyword, mods, type, new SeparatedSyntaxList<TypeAliasSyntax>(variables), semi);
            }

            if (type is TypeDefinitionSyntax && (Current.Kind == SyntaxKind.SemiToken || Current.Kind == SyntaxKind.EndOfFileToken))
            {
                var semi = Match(SyntaxKind.SemiToken);
                return new TypeDeclarationStatementSyntax(mods, (TypeDefinitionSyntax) type, semi);
            }
            else
            {
                ParseVariableDeclarators(type, variables, variableDeclarationsExpected: true);
                var semi = Match(SyntaxKind.SemiToken);
                var variableDeclaration = new VariableDeclarationSyntax(mods, type, new SeparatedSyntaxList<VariableDeclaratorSyntax>(variables));
                return new VariableDeclarationStatementSyntax(variableDeclaration, semi);
            }
        }
Exemple #2
0
 public static IEnumerable<ReplaceAction> GetSimplifications(VariableDeclarationSyntax declaration, ISemanticModel model, Assumptions assume, CancellationToken cancellationToken = default(CancellationToken))
 {
     if (declaration.Variables.Count != 1) yield break;
     var v = declaration.Variables.Single();
     if (v.Initializer == null) yield break;
     if (declaration.Type.IsVar) yield break;
     var declaredType = model.GetTypeInfo(declaration.Type);
     var valueType = model.GetTypeInfo(v.Initializer.Value);
     if (!declaredType.Equals(valueType)) yield break;
     yield return new ReplaceAction("Use 'var'", declaration.Type, Syntax.IdentifierName("var"));
 }
Exemple #3
0
        public static ForStatementSyntax ConvertWhileStatementToForStatement(
            WhileStatementSyntax whileStatement,
            VariableDeclarationSyntax declaration = default,
            SeparatedSyntaxList <ExpressionSyntax> initializers = default)
        {
            var incrementors = default(SeparatedSyntaxList <ExpressionSyntax>);

            StatementSyntax statement = whileStatement.Statement;

            if (statement is BlockSyntax block)
            {
                SyntaxList <StatementSyntax> statements = block.Statements;

                if (statements.Any())
                {
                    int startIndex = -1;
                    int i          = statements.Count - 1;

                    bool fContinue = statements.Last().IsKind(SyntaxKind.ContinueStatement);

                    if (fContinue)
                    {
                        i--;
                    }

                    while (i >= 0)
                    {
                        if (!(statements[i] is ExpressionStatementSyntax expressionStatement))
                        {
                            break;
                        }

                        ExpressionSyntax expression = expressionStatement.Expression;

                        if (expression == null ||
                            !CSharpFacts.IsIncrementOrDecrementExpression(expression.Kind()))
                        {
                            break;
                        }

                        startIndex = i;
                        i--;
                    }

                    if (startIndex >= 0)
                    {
                        int count = statements.Count - startIndex;

                        if (fContinue)
                        {
                            count--;
                        }

                        incrementors = statements
                                       .Skip(startIndex)
                                       .Take(count)
                                       .Cast <ExpressionStatementSyntax>()
                                       .Select(f => f.Expression)
                                       .ToSeparatedSyntaxList();

                        statement = block.WithStatements(statements.RemoveRange(startIndex, statements.Count - startIndex));
                    }
                    else if (fContinue)
                    {
                        statement = block.WithStatements(statements.RemoveAt(statements.Count - 1));
                    }
                }
            }

            ExpressionSyntax condition = whileStatement.Condition;

            if (condition.IsKind(SyntaxKind.TrueLiteralExpression))
            {
                condition = null;
            }

            return(ForStatement(
                       forKeyword: Token(SyntaxKind.ForKeyword).WithTriviaFrom(whileStatement.WhileKeyword),
                       openParenToken: Token(whileStatement.OpenParenToken.LeadingTrivia, SyntaxKind.OpenParenToken, default),
                       declaration: declaration,
                       initializers: initializers,
                       firstSemicolonToken: SemicolonToken(),
                       condition: condition,
                       secondSemicolonToken: SemicolonToken(),
                       incrementors: incrementors,
                       closeParenToken: Token(default, SyntaxKind.CloseParenToken, whileStatement.CloseParenToken.TrailingTrivia),
Exemple #4
0
 public override void VisitVariableDeclarationSyntax(VariableDeclarationSyntax syntax)
 {
     AddCodeFixIfSingleInterpolatedString(syntax.Value);
     base.VisitVariableDeclarationSyntax(syntax);
 }
 public static LocalDeclarationStatementSyntax LocalDeclarationStatement(
     SyntaxTokenList modifiers,
     VariableDeclarationSyntax declaration,
     SyntaxToken semicolonToken
     ) =>
Exemple #6
0
        public static TypeAnalysisFlags AnalyzeType(
            VariableDeclarationSyntax variableDeclaration,
            SemanticModel semanticModel,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            if (variableDeclaration == null)
            {
                throw new ArgumentNullException(nameof(variableDeclaration));
            }

            if (semanticModel == null)
            {
                throw new ArgumentNullException(nameof(semanticModel));
            }

            TypeSyntax type = variableDeclaration.Type;

            if (type != null)
            {
                SeparatedSyntaxList <VariableDeclaratorSyntax> variables = variableDeclaration.Variables;

                if (variables.Count > 0 &&
                    !variableDeclaration.IsParentKind(SyntaxKind.FieldDeclaration, SyntaxKind.EventFieldDeclaration))
                {
                    ExpressionSyntax expression = variables[0].Initializer?.Value;

                    if (expression != null)
                    {
                        ITypeSymbol typeSymbol = semanticModel.GetTypeSymbol(type, cancellationToken);

                        if (typeSymbol?.IsErrorType() == false)
                        {
                            TypeAnalysisFlags flags;

                            if (typeSymbol.IsDynamicType())
                            {
                                flags = TypeAnalysisFlags.Dynamic;
                            }
                            else
                            {
                                flags = TypeAnalysisFlags.ValidSymbol;

                                if (type.IsVar)
                                {
                                    flags |= TypeAnalysisFlags.Implicit;

                                    if (typeSymbol.SupportsExplicitDeclaration())
                                    {
                                        flags |= TypeAnalysisFlags.SupportsExplicit;
                                    }
                                }
                                else
                                {
                                    flags |= TypeAnalysisFlags.Explicit;

                                    if (variables.Count == 1 &&
                                        !IsLocalConstDeclaration(variableDeclaration) &&
                                        !expression.IsKind(SyntaxKind.NullLiteralExpression) &&
                                        typeSymbol.Equals(semanticModel.GetTypeSymbol(expression, cancellationToken)))
                                    {
                                        flags |= TypeAnalysisFlags.SupportsImplicit;
                                    }
                                }

                                if (IsTypeObvious(expression, semanticModel, cancellationToken))
                                {
                                    flags |= TypeAnalysisFlags.TypeObvious;
                                }
                            }

                            return(flags);
                        }
                    }
                }
            }

            return(TypeAnalysisFlags.None);
        }
 public override void VisitVariableDeclaration(VariableDeclarationSyntax node)
 {
     Visit(node.Initializer?.Value);
 }
Exemple #8
0
            public void Add(SyntaxTokenList modifiers, VariableDeclarationSyntax decl)
            {
                TypeExtraInfo tei = Chunk.AddTypeExtraInfo(this.Class);

                foreach (VariableDeclaratorSyntax vds in decl.Variables)
                {
                    TypeInfo ti = Chunk.Model.GetTypeInfo(decl.Type);
                    tei.AddField(modifiers, ti.ConvertedType, vds);
                }
            }
        internal SeparatedSyntaxList <VariableDeclaratorSyntax> RemodelVariableDeclaration(VariableDeclarationSyntax declaration)
        {
            var visualBasicSyntaxNode = declaration.Type.Accept(_nodesVisitor);
            var type = (TypeSyntax)visualBasicSyntaxNode;
            var declaratorsWithoutInitializers = new List <Microsoft.CodeAnalysis.CSharp.Syntax.VariableDeclaratorSyntax>();
            var declarators = new List <VariableDeclaratorSyntax>();

            foreach (var v in declaration.Variables)
            {
                if (v.Initializer == null)
                {
                    declaratorsWithoutInitializers.Add(v);
                }
                else
                {
                    declarators.Add(
                        SyntaxFactory.VariableDeclarator(
                            SyntaxFactory.SingletonSeparatedList(ExtractIdentifier(v)),
                            declaration.Type.IsVar ? null : SyntaxFactory.SimpleAsClause(type),
                            SyntaxFactory.EqualsValue((ExpressionSyntax)ConvertTopLevelExpression(v.Initializer.Value))
                            )
                        );
                }
            }

            if (declaratorsWithoutInitializers.Count > 0)
            {
                declarators.Insert(0, SyntaxFactory.VariableDeclarator(SyntaxFactory.SeparatedList(declaratorsWithoutInitializers.Select(ExtractIdentifier)), SyntaxFactory.SimpleAsClause(type), null));
            }

            return(SyntaxFactory.SeparatedList(declarators));
        }
Exemple #10
0
        private static bool TryComputeLocalsDistance(VariableDeclarationSyntax leftOpt, VariableDeclarationSyntax rightOpt, out double distance)
        {
            List <SyntaxToken> leftLocals  = null;
            List <SyntaxToken> rightLocals = null;

            if (leftOpt != null)
            {
                GetLocalNames(leftOpt, ref leftLocals);
            }

            if (rightOpt != null)
            {
                GetLocalNames(rightOpt, ref rightLocals);
            }

            if (leftLocals == null || rightLocals == null)
            {
                distance = 0;
                return(false);
            }

            distance = ComputeDistance(leftLocals, rightLocals);
            return(true);
        }
Exemple #11
0
 public static SingleLocalDeclarationStatementInfo SingleLocalDeclarationStatementInfo(
     VariableDeclarationSyntax variableDeclaration,
     bool allowMissing = false)
 {
     return(Syntax.SingleLocalDeclarationStatementInfo.Create(variableDeclaration, allowMissing));
 }
Exemple #12
0
        public static TypeAnalysisResult AnalyzeType(
            VariableDeclarationSyntax variableDeclaration,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            if (variableDeclaration.Type == null)
            {
                return(TypeAnalysisResult.None);
            }

            if (variableDeclaration.Variables.Count == 0)
            {
                return(TypeAnalysisResult.None);
            }

            if (variableDeclaration.Parent?.IsKind(SyntaxKind.FieldDeclaration) == true)
            {
                return(TypeAnalysisResult.None);
            }

            ExpressionSyntax expression = variableDeclaration.Variables[0].Initializer?.Value;

            if (expression == null)
            {
                return(TypeAnalysisResult.None);
            }

            ITypeSymbol typeSymbol = semanticModel.GetTypeInfo(variableDeclaration.Type, cancellationToken).Type;

            if (typeSymbol == null || typeSymbol.IsKind(SymbolKind.ErrorType))
            {
                return(TypeAnalysisResult.None);
            }

            if (typeSymbol.IsAnonymousType)
            {
                return(TypeAnalysisResult.None);
            }

            if (typeSymbol.IsKind(SymbolKind.NamedType))
            {
                if (((INamedTypeSymbol)typeSymbol).IsAnyTypeArgumentAnonymousType())
                {
                    return(TypeAnalysisResult.None);
                }
            }
            else if (!typeSymbol.IsKind(SymbolKind.ArrayType))
            {
                return(TypeAnalysisResult.None);
            }

            if (variableDeclaration.Variables.Count > 1)
            {
                if (variableDeclaration.Type.IsVar)
                {
                    return(TypeAnalysisResult.ImplicitButShouldBeExplicit);
                }
                else
                {
                    return(TypeAnalysisResult.None);
                }
            }

            if (IsImplicitTypeAllowed(typeSymbol, expression, semanticModel, cancellationToken))
            {
                if (variableDeclaration.Type.IsVar)
                {
                    return(TypeAnalysisResult.Implicit);
                }
                else
                {
                    return(TypeAnalysisResult.ExplicitButShouldBeImplicit);
                }
            }
            else
            {
                if (variableDeclaration.Type.IsVar)
                {
                    return(TypeAnalysisResult.ImplicitButShouldBeExplicit);
                }
                else
                {
                    return(TypeAnalysisResult.Explicit);
                }
            }
        }
 //
 // Summary:
 //     Called when the visitor visits a VariableDeclarationSyntax node.
 public virtual void VisitVariableDeclaration(VariableDeclarationSyntax node);
Exemple #14
0
        public static void AnalyzeUsingStatement(SyntaxNodeAnalysisContext context)
        {
            var usingStatement = (UsingStatementSyntax)context.Node;

            StatementSyntax statement = usingStatement.Statement;

            if (statement?.IsKind(SyntaxKind.Block) == true)
            {
                var block = (BlockSyntax)statement;

                StatementSyntax lastStatement = block.Statements.LastOrDefault();

                if (lastStatement?.IsKind(SyntaxKind.ExpressionStatement) == true)
                {
                    var expressionStatement = (ExpressionStatementSyntax)lastStatement;

                    ExpressionSyntax expression = expressionStatement.Expression;

                    if (expression?.IsKind(SyntaxKind.InvocationExpression) == true)
                    {
                        var invocation = (InvocationExpressionSyntax)expression;

                        ExpressionSyntax invocationExpression = invocation.Expression;

                        if (invocationExpression?.IsKind(SyntaxKind.SimpleMemberAccessExpression) == true)
                        {
                            var memberAccess = (MemberAccessExpressionSyntax)invocationExpression;

                            if (invocation.ArgumentList?.Arguments.Count == 0)
                            {
                                string methodName = memberAccess.Name?.Identifier.ValueText;

                                if (methodName == "Dispose" || methodName == "Close")
                                {
                                    ExpressionSyntax memberAccessExpression = memberAccess.Expression;

                                    if (memberAccessExpression != null)
                                    {
                                        ExpressionSyntax usingExpression = usingStatement.Expression;

                                        if (usingExpression != null)
                                        {
                                            if (SyntaxComparer.AreEquivalent(memberAccessExpression, usingExpression))
                                            {
                                                ReportDiagnostic(context, expressionStatement, methodName);
                                            }
                                        }
                                        else if (memberAccessExpression.IsKind(SyntaxKind.IdentifierName))
                                        {
                                            VariableDeclarationSyntax usingDeclaration = usingStatement.Declaration;

                                            if (usingDeclaration != null)
                                            {
                                                var identifierName = (IdentifierNameSyntax)memberAccessExpression;

                                                string name = identifierName.Identifier.ValueText;

                                                VariableDeclaratorSyntax declarator = usingDeclaration.Variables.LastOrDefault();

                                                if (declarator != null &&
                                                    declarator.Identifier.ValueText == name)
                                                {
                                                    ISymbol symbol = context.SemanticModel.GetDeclaredSymbol(declarator, context.CancellationToken);

                                                    if (symbol?.Equals(context.SemanticModel.GetSymbol(identifierName, context.CancellationToken)) == true)
                                                    {
                                                        ReportDiagnostic(context, expressionStatement, methodName);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
 public override void VisitVariableDeclarationSyntax(VariableDeclarationSyntax syntax)
 {
     this.activeLoopCapableTopLevelDeclaration = syntax;
     base.VisitVariableDeclarationSyntax(syntax);
     this.activeLoopCapableTopLevelDeclaration = null;
 }
 public BoundMultipleVariableDeclarations(VariableDeclarationSyntax syntax, ImmutableArray<BoundVariableDeclaration> variableDeclarations)
     : base(BoundNodeKind.MultipleVariableDeclarations, syntax)
 {
     VariableDeclarations = variableDeclarations;
 }
        public void VisitVariableDeclaration(VariableDeclarationSyntax node)
        {
            if (node == null)
                throw new ArgumentNullException("node");

            node.Validate();

            node.Type.Accept(this);

            _writer.WriteSpace();

            if (_writer.Configuration.Other.AlignMultiLineConstructs.MultipleDeclarations)
                _writer.SetAlignmentBreak(true);

            _writer.PushWrapStyle(_writer.Configuration.LineBreaksAndWrapping.LineWrapping.WrapMultipleDeclarations);

            bool hadOne = false;

            foreach (var variable in node.Variables)
            {
                if (hadOne)
                    _writer.WriteListSeparator();
                else
                    hadOne = true;

                variable.Accept(this);
            }

            _writer.PopWrapStyle();

            if (_writer.Configuration.Other.AlignMultiLineConstructs.MultipleDeclarations)
                _writer.SetAlignmentBreak(false);
        }
 public override void VisitVariableDeclaration(VariableDeclarationSyntax node)
 {
     base.VisitVariableDeclaration(node);
     foreach (var identifier in node.Variables.Select(a => a.Identifier.ValueText))
     {
         identifiers[identifier] = 1 + (identifiers.ContainsKey(identifier) ? identifiers[identifier] : 0);
     }
 }
 public override void VisitVariableDeclaration(VariableDeclarationSyntax node)
 {
     base.VisitVariableDeclaration(node);
 }
Exemple #20
0
 public override void VisitVariableDeclarationSyntax(VariableDeclarationSyntax syntax)
 => AssignTypeWithCaching(syntax, () => {
     return(VisitAndReturnType(syntax.Value));
 });
 private BoundMultipleVariableDeclarations BindVariableDeclaration(VariableDeclarationSyntax syntax, Symbol parent)
 {
     return BindVariableDeclaration(syntax, parent, (d, t) => new VariableSymbol(d, parent, t));
 }
        public static void ComputeRefactoring(
            RefactoringContext context,
            LocalDeclarationStatementSyntax localDeclaration,
            SemanticModel semanticModel)
        {
            if (semanticModel.GetEnclosingSymbol(localDeclaration.SpanStart, context.CancellationToken) is not IMethodSymbol methodSymbol)
                return;

            if (methodSymbol.IsImplicitlyDeclared)
                return;

            if (!methodSymbol.MethodKind.Is(MethodKind.Ordinary, MethodKind.LocalFunction))
                return;

            if (methodSymbol.PartialImplementationPart != null)
                methodSymbol = methodSymbol.PartialImplementationPart;

            SyntaxNode methodOrLocalFunction = methodSymbol.GetSyntax(context.CancellationToken);

            if (!methodOrLocalFunction.IsKind(SyntaxKind.MethodDeclaration, SyntaxKind.LocalFunctionStatement))
                return;

            VariableDeclarationSyntax declaration = localDeclaration.Declaration;

            if (declaration == null)
                return;

            VariableDeclaratorSyntax variable = declaration
                .Variables
                .FirstOrDefault(f => !f.IsMissing && f.Identifier.Span.Contains(context.Span));

            if (variable == null)
                return;

            TypeSyntax type = declaration.Type;

            if (type == null)
                return;

            if (type.IsVar)
            {
                ITypeSymbol typeSymbol = semanticModel.GetTypeSymbol(type, context.CancellationToken);

                if (typeSymbol?.SupportsExplicitDeclaration() == true)
                {
                    type = typeSymbol.ToTypeSyntax();
                }
                else
                {
                    return;
                }
            }

            context.RegisterRefactoring(
                $"Promote '{variable.Identifier.ValueText}' to parameter",
                ct =>
                {
                    return RefactorAsync(
                        context.Document,
                        methodOrLocalFunction,
                        localDeclaration,
                        type.WithoutTrivia().WithSimplifierAnnotation(),
                        variable,
                        ct);
                },
                RefactoringDescriptors.PromoteLocalVariableToParameter);
        }
Exemple #23
0
        private static void AnalyzeUsingStatement(SyntaxNodeAnalysisContext context)
        {
            var usingStatement = (UsingStatementSyntax)context.Node;

            StatementSyntax statement = usingStatement.Statement;

            if (statement?.Kind() != SyntaxKind.Block)
            {
                return;
            }

            var block = (BlockSyntax)statement;

            StatementSyntax lastStatement = block.Statements.LastOrDefault();

            if (lastStatement == null)
            {
                return;
            }

            if (lastStatement.SpanContainsDirectives())
            {
                return;
            }

            SimpleMemberInvocationStatementInfo info = SyntaxInfo.SimpleMemberInvocationStatementInfo(lastStatement);

            if (!info.Success)
            {
                return;
            }

            if (info.Arguments.Any())
            {
                return;
            }

            string methodName = info.NameText;

            if (methodName != "Dispose" && methodName != "Close")
            {
                return;
            }

            ExpressionSyntax usingExpression = usingStatement.Expression;

            if (usingExpression != null)
            {
                if (CSharpFactory.AreEquivalent(info.Expression, usingExpression))
                {
                    ReportDiagnostic(context, info.Statement, methodName);
                }
            }
            else
            {
                VariableDeclarationSyntax usingDeclaration = usingStatement.Declaration;

                if (usingDeclaration != null &&
                    info.Expression.Kind() == SyntaxKind.IdentifierName)
                {
                    var identifierName = (IdentifierNameSyntax)info.Expression;

                    VariableDeclaratorSyntax declarator = usingDeclaration.Variables.LastOrDefault();

                    if (declarator != null &&
                        declarator.Identifier.ValueText == identifierName.Identifier.ValueText)
                    {
                        ISymbol symbol = context.SemanticModel.GetDeclaredSymbol(declarator, context.CancellationToken);

                        if (SymbolEqualityComparer.Default.Equals(symbol, context.SemanticModel.GetSymbol(identifierName, context.CancellationToken)))
                        {
                            ReportDiagnostic(context, info.Statement, methodName);
                        }
                    }
                }
            }
        }
Exemple #24
0
        internal static async Task ComputeRefactoringAsync(RefactoringContext context, VariableDeclarationSyntax variableDeclaration)
        {
            SyntaxNode parent = variableDeclaration.Parent;

            if (parent?.IsKind(SyntaxKind.LocalDeclarationStatement) == true)
            {
                TypeSyntax type = variableDeclaration.Type;

                if (type != null)
                {
                    VariableDeclaratorSyntax variableDeclarator = variableDeclaration.Variables.SingleOrDefault(throwException: false);

                    ExpressionSyntax value = variableDeclarator?.Initializer?.Value;

                    if (value?.IsKind(SyntaxKind.NullLiteralExpression) == false &&
                        CanBeEqualToNull(value))
                    {
                        SyntaxToken identifier = variableDeclarator.Identifier;

                        if (context.Span.IsContainedInSpanOrBetweenSpans(identifier))
                        {
                            IdentifierNameSyntax identifierName = IdentifierName(identifier);

                            var localDeclaration = (StatementSyntax)parent;

                            if (!NullCheckExists(identifierName, localDeclaration))
                            {
                                SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false);

                                if (semanticModel
                                    .GetTypeSymbol(type, context.CancellationToken)?
                                    .IsReferenceType == true)
                                {
                                    RegisterRefactoring(context, identifierName, localDeclaration);
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #25
0
 public static FixedStatementSyntax FixedStatement(SyntaxToken fixedKeyword, SyntaxToken openParenToken, VariableDeclarationSyntax declaration, SyntaxToken closeParenToken, StatementSyntax statement)
 => FixedStatement(attributeLists: default, fixedKeyword, openParenToken, declaration, closeParenToken, statement);
Exemple #26
0
 public static ForStatementSyntax ForStatement(VariableDeclarationSyntax declaration, SeparatedSyntaxList <ExpressionSyntax> initializers, ExpressionSyntax condition, SeparatedSyntaxList <ExpressionSyntax> incrementors, StatementSyntax statement)
 => ForStatement(attributeLists: default, declaration, initializers, condition, incrementors, statement);
        private bool ParseVariableDeclarationStatementSyntax(VariableDeclarationStatementSyntax syntax, List <string> registers)
        {
            VariableDeclarationSyntax varDeclaration = syntax.Declaration;

            TypeSyntax type = varDeclaration.Type;

            foreach (VariableDeclaratorSyntax var in varDeclaration.Variables)
            {
                AnnotationFactory.BeginVar();
                AnnotationFactory.SetModifiers(varDeclaration.Modifiers);

                if (AnnotationFactory.IsGroupOpen())
                {
                    AnnotationFactory.SetType(type);
                    AnnotationFactory.SetAnnotations(var.Annotations?.Annotations ?? null);
                    InitializerSyntax initializer = var.Initializer;
                    if (varDeclaration.Variables[0].ArrayRankSpecifiers.Count > 0)
                    {
                        LiteralExpressionSyntax litExpressionSyntax = varDeclaration.Variables[0].ArrayRankSpecifiers[0].Dimension as LiteralExpressionSyntax;
                        AnnotationFactory.SetDimension((int)litExpressionSyntax.Token.Value);
                    }
                    if (initializer != null && initializer is EqualsValueClauseSyntax)
                    {
                        EqualsValueClauseSyntax evcSyntax = (EqualsValueClauseSyntax)initializer;
                        if (evcSyntax.Value is NumericConstructorInvocationExpressionSyntax)
                        {
                            NumericConstructorInvocationExpressionSyntax ncieSyntax = (NumericConstructorInvocationExpressionSyntax)evcSyntax.Value;
                            SeparatedSyntaxList <ExpressionSyntax>       arguments  = ncieSyntax.ArgumentList.Arguments;
                        }
                        else if (evcSyntax.Value is LiteralExpressionSyntax)
                        {
                        }
                    }

                    SyntaxToken name = var.Identifier;
                    AnnotationFactory.SetName(name.ValueText);
                    foreach (var qualifier in var.Qualifiers)
                    {
                        if (qualifier is RegisterLocation)
                        {
                            string register = ((RegisterLocation)qualifier).Register.ValueText;
                            if (registers.Contains(register))
                            {
                                MessageBox.Show($"Register: {register}\nDefined multiple times, ShaderBox can not decides which one needs to be binded.\n\nWill be resolved in a future release.", "Unsupported operation", MessageBoxButton.OK, MessageBoxImage.Error);
                                AnnotationFactory.DestroyGroup();
                                return(false);
                            }
                            AnnotationFactory.SetRegister(register);
                        }
                    }
                    if (string.IsNullOrWhiteSpace(AnnotationFactory.GetRegister()))
                    {
                        AnnotationFactory.DestroyGroup();
                    }
                    else
                    {
                        AnnotationFactory.EndVar();
                    }
                }
            }

            return(true);
        }
Exemple #28
0
 public override void VisitVariableDeclarationSyntax(VariableDeclarationSyntax syntax)
 {
     allowedFlags = FunctionFlags.RequiresInlining;
     base.VisitVariableDeclarationSyntax(syntax);
     allowedFlags = FunctionFlags.Default;
 }
Exemple #29
0
 private static IEnumerable <SyntaxToken> GetIdentifiers(VariableDeclarationSyntax declaration)
 {
     return(declaration.Variables
            .Select(v => v.Identifier)
            .ToImmutableArray());
 }
Exemple #30
0
        public static Task <Document> RefactorAsync(
            Document document,
            ForEachStatementSyntax forEachStatement,
            SemanticModel semanticModel,
            bool reverseLoop = false,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            string name = NameGenerator.Default.EnsureUniqueLocalName(
                DefaultNames.ForVariable,
                semanticModel,
                forEachStatement.Statement.SpanStart,
                cancellationToken: cancellationToken);

            SyntaxToken identifier = Identifier(name);

            if (name != DefaultNames.ForVariable)
            {
                identifier = identifier.WithRenameAnnotation();
            }

            ExpressionSyntax forEachExpression = forEachStatement.Expression;

            MemberAccessExpressionSyntax countOrLengthMemberAccess = SimpleMemberAccessExpression(
                forEachExpression.WithoutTrivia(),
                IdentifierName(CSharpUtility.GetCountOrLengthPropertyName(forEachExpression, semanticModel, cancellationToken)));

            VariableDeclarationSyntax    declaration = null;
            BinaryExpressionSyntax       condition   = null;
            PostfixUnaryExpressionSyntax incrementor = null;

            if (reverseLoop)
            {
                declaration = VariableDeclaration(
                    IntType(),
                    identifier,
                    EqualsValueClause(
                        SubtractExpression(
                            countOrLengthMemberAccess,
                            NumericLiteralExpression(1))));

                condition = GreaterThanOrEqualExpression(IdentifierName(name), NumericLiteralExpression(0));

                incrementor = PostDecrementExpression(IdentifierName(name));
            }
            else
            {
                declaration = VariableDeclaration(
                    IntType(),
                    identifier,
                    EqualsValueClause(NumericLiteralExpression(0)));

                condition = LessThanExpression(
                    IdentifierName(name),
                    countOrLengthMemberAccess);

                incrementor = PostIncrementExpression(IdentifierName(name));
            }

            StatementSyntax statement = forEachStatement.Statement.ReplaceNodes(
                GetVariableReferences(forEachStatement, semanticModel, cancellationToken),
                (node, rewrittenNode) =>
            {
                return(ElementAccessExpression(
                           forEachExpression.WithoutTrivia(),
                           BracketedArgumentList(SingletonSeparatedList(Argument(IdentifierName(name))))
                           ).WithTriviaFrom(node));
            });

            ForStatementSyntax forStatement = ForStatement(
                declaration: declaration,
                initializers: default(SeparatedSyntaxList <ExpressionSyntax>),
                condition: condition,
                incrementors: SingletonSeparatedList <ExpressionSyntax>(incrementor),
                statement: statement);

            forStatement = forStatement
                           .WithTriviaFrom(forEachStatement)
                           .WithFormatterAnnotation();

            return(document.ReplaceNodeAsync(forEachStatement, forStatement, cancellationToken));
        }
        private async Task <Document> MakeConstAsync(Document document, LocalDeclarationStatementSyntax localDeclaration, CancellationToken cancellationToken)
        {
            // Remove the leading trivia from the local declaration.
            SyntaxToken      firstToken    = localDeclaration.GetFirstToken();
            SyntaxTriviaList leadingTrivia = firstToken.LeadingTrivia;
            LocalDeclarationStatementSyntax trimmedLocal = localDeclaration.ReplaceToken(
                firstToken, firstToken.WithLeadingTrivia(SyntaxTriviaList.Empty));

            // Create a const token with the leading trivia.
            SyntaxToken constToken = SyntaxFactory.Token(leadingTrivia, SyntaxKind.ConstKeyword, SyntaxFactory.TriviaList(SyntaxFactory.ElasticMarker));

            // Insert the const token into the modifiers list, creating a new modifiers list.
            SyntaxTokenList newModifiers = trimmedLocal.Modifiers.Insert(0, constToken);

            // If the type of declaration is 'var', create a new type name for the
            // type inferred for 'var'.
            VariableDeclarationSyntax variableDeclaration = localDeclaration.Declaration;
            TypeSyntax variableTypeName = variableDeclaration.Type;

            if (variableTypeName.IsVar)
            {
                SemanticModel semanticModel = await document.GetSemanticModelAsync(cancellationToken);

                // Special case: Ensure that 'var' isn't actually an alias to another type
                // (e.g. using var = System.String).
                IAliasSymbol aliasInfo = semanticModel.GetAliasInfo(variableTypeName);
                if (aliasInfo == null)
                {
                    // Retrieve the type inferred for var.
                    ITypeSymbol type = semanticModel.GetTypeInfo(variableTypeName).ConvertedType;

                    // Special case: Ensure that 'var' isn't actually a type named 'var'.
                    if (type.Name != "var")
                    {
                        // Create a new TypeSyntax for the inferred type. Be careful
                        // to keep any leading and trailing trivia from the var keyword.
                        TypeSyntax typeName = SyntaxFactory.ParseTypeName(type.ToDisplayString())
                                              .WithLeadingTrivia(variableTypeName.GetLeadingTrivia())
                                              .WithTrailingTrivia(variableTypeName.GetTrailingTrivia());

                        // Add an annotation to simplify the type name.
                        TypeSyntax simplifiedTypeName = typeName.WithAdditionalAnnotations(Simplifier.Annotation);

                        // Replace the type in the variable declaration.
                        variableDeclaration = variableDeclaration.WithType(simplifiedTypeName);
                    }
                }
            }

            // Produce the new local declaration.
            LocalDeclarationStatementSyntax newLocal = trimmedLocal.WithModifiers(newModifiers)
                                                       .WithDeclaration(variableDeclaration);

            // Add an annotation to format the new local declaration.
            LocalDeclarationStatementSyntax formattedLocal = newLocal.WithAdditionalAnnotations(Formatter.Annotation);

            // Replace the old local declaration with the new local declaration.
            SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken);

            SyntaxNode newRoot = root.ReplaceNode(localDeclaration, formattedLocal);

            // Return document with transformed tree.
            return(document.WithSyntaxRoot(newRoot));
        }
Exemple #32
0
 public LocalDeclarationStatementSyntax Update(SyntaxTokenList modifiers, VariableDeclarationSyntax declaration, SyntaxToken semicolonToken)
 => Update(default(SyntaxToken), default(SyntaxToken), declaration, semicolonToken);
Exemple #33
0
        public void Flatten(VariableDeclarationSyntax node, List<FlatStatement> instructions)
        {
            /*
            public TypeSyntax Type { get; }
            public SeparatedSyntaxList<VariableDeclaratorSyntax> Variables { get; }
            /**/

            TypeInfo ti = Model.GetTypeInfo(node.Type);

            foreach (VariableDeclaratorSyntax vds in node.Variables)
            {
                Flatten(ti.Type, vds, instructions);
            }
        }
        internal static BoundStatement BindUsingStatementOrDeclarationFromParts(SyntaxNode syntax, SyntaxToken usingKeyword, SyntaxToken awaitKeyword, Binder originalBinder, UsingStatementBinder usingBinderOpt, DiagnosticBag diagnostics)
        {
            bool isUsingDeclaration = syntax.Kind() == SyntaxKind.LocalDeclarationStatement;
            bool isExpression       = !isUsingDeclaration && syntax.Kind() != SyntaxKind.VariableDeclaration;
            bool hasAwait           = awaitKeyword != default;

            Debug.Assert(isUsingDeclaration || usingBinderOpt != null);

            TypeSymbol disposableInterface = getDisposableInterface(hasAwait);

            Debug.Assert((object)disposableInterface != null);
            bool hasErrors = ReportUseSiteDiagnostics(disposableInterface, diagnostics, hasAwait ? awaitKeyword : usingKeyword);

            Conversion iDisposableConversion;
            ImmutableArray <BoundLocalDeclaration> declarationsOpt         = default;
            BoundMultipleLocalDeclarations         multipleDeclarationsOpt = null;
            BoundExpression expressionOpt      = null;
            TypeSymbol      declarationTypeOpt = null;
            MethodSymbol    disposeMethodOpt;
            TypeSymbol      awaitableTypeOpt;

            if (isExpression)
            {
                expressionOpt = usingBinderOpt.BindTargetExpression(diagnostics, originalBinder);
                hasErrors    |= !populateDisposableConversionOrDisposeMethod(fromExpression: true, out iDisposableConversion, out disposeMethodOpt, out awaitableTypeOpt);
            }
            else
            {
                VariableDeclarationSyntax declarationSyntax = isUsingDeclaration ? ((LocalDeclarationStatementSyntax)syntax).Declaration : (VariableDeclarationSyntax)syntax;
                originalBinder.BindForOrUsingOrFixedDeclarations(declarationSyntax, LocalDeclarationKind.UsingVariable, diagnostics, out declarationsOpt);

                Debug.Assert(!declarationsOpt.IsEmpty);
                multipleDeclarationsOpt = new BoundMultipleLocalDeclarations(declarationSyntax, declarationsOpt);
                declarationTypeOpt      = declarationsOpt[0].DeclaredTypeOpt.Type;

                if (declarationTypeOpt.IsDynamic())
                {
                    iDisposableConversion = Conversion.ImplicitDynamic;
                    disposeMethodOpt      = null;
                    awaitableTypeOpt      = null;
                }
                else
                {
                    hasErrors |= !populateDisposableConversionOrDisposeMethod(fromExpression: false, out iDisposableConversion, out disposeMethodOpt, out awaitableTypeOpt);
                }
            }

            BoundAwaitableInfo awaitOpt = null;

            if (hasAwait)
            {
                // even if we don't have a proper value to await, we'll still report bad usages of `await`
                originalBinder.ReportBadAwaitDiagnostics(syntax, awaitKeyword.GetLocation(), diagnostics, ref hasErrors);

                if (awaitableTypeOpt is null)
                {
                    awaitOpt = new BoundAwaitableInfo(syntax, awaitableInstancePlaceholder: null, isDynamic: true, getAwaiter: null, isCompleted: null, getResult: null)
                    {
                        WasCompilerGenerated = true
                    };
                }
                else
                {
                    hasErrors |= ReportUseSiteDiagnostics(awaitableTypeOpt, diagnostics, awaitKeyword);
                    var placeholder = new BoundAwaitableValuePlaceholder(syntax, valEscape: originalBinder.LocalScopeDepth, awaitableTypeOpt).MakeCompilerGenerated();
                    awaitOpt = originalBinder.BindAwaitInfo(placeholder, syntax, diagnostics, ref hasErrors);
                }
            }

            // This is not awesome, but its factored.
            // In the future it might be better to have a separate shared type that we add the info to, and have the callers create the appropriate bound nodes from it
            if (isUsingDeclaration)
            {
                return(new BoundUsingLocalDeclarations(syntax, disposeMethodOpt, iDisposableConversion, awaitOpt, declarationsOpt, hasErrors));
            }
            else
            {
                BoundStatement boundBody = originalBinder.BindPossibleEmbeddedStatement(usingBinderOpt._syntax.Statement, diagnostics);

                return(new BoundUsingStatement(
                           usingBinderOpt._syntax,
                           usingBinderOpt.Locals,
                           multipleDeclarationsOpt,
                           expressionOpt,
                           iDisposableConversion,
                           boundBody,
                           awaitOpt,
                           disposeMethodOpt,
                           hasErrors));
            }

            bool populateDisposableConversionOrDisposeMethod(bool fromExpression, out Conversion iDisposableConversion, out MethodSymbol disposeMethodOpt, out TypeSymbol awaitableTypeOpt)
            {
                HashSet <DiagnosticInfo> useSiteDiagnostics = null;

                iDisposableConversion = classifyConversion(fromExpression, disposableInterface, ref useSiteDiagnostics);
                disposeMethodOpt      = null;
                awaitableTypeOpt      = null;

                diagnostics.Add(syntax, useSiteDiagnostics);

                if (iDisposableConversion.IsImplicit)
                {
                    if (hasAwait)
                    {
                        awaitableTypeOpt = originalBinder.Compilation.GetWellKnownType(WellKnownType.System_Threading_Tasks_ValueTask);
                    }
                    return(true);
                }

                TypeSymbol type = fromExpression ? expressionOpt.Type : declarationTypeOpt;

                // If this is a ref struct, or we're in a valid asynchronous using, try binding via pattern.
                // We won't need to try and bind a second time if it fails, as async dispose can't be pattern based (ref structs are not allowed in async methods)
                if (type is object && (type.IsRefLikeType || hasAwait))
                {
                    BoundExpression receiver = fromExpression
                                               ? expressionOpt
                                               : new BoundLocal(syntax, declarationsOpt[0].LocalSymbol, null, type)
                    {
                        WasCompilerGenerated = true
                    };

                    DiagnosticBag patternDiagnostics = originalBinder.Compilation.IsFeatureEnabled(MessageID.IDS_FeatureUsingDeclarations)
                                                       ? diagnostics
                                                       : new DiagnosticBag();
                    disposeMethodOpt = originalBinder.TryFindDisposePatternMethod(receiver, syntax, hasAwait, patternDiagnostics);
                    if (disposeMethodOpt is object)
                    {
                        MessageID.IDS_FeatureUsingDeclarations.CheckFeatureAvailability(diagnostics, originalBinder.Compilation, syntax.Location);
                        if (hasAwait)
                        {
                            awaitableTypeOpt = disposeMethodOpt.ReturnType;
                        }
                        return(true);
                    }
                }

                if (type is null || !type.IsErrorType())
                {
                    // Retry with a different assumption about whether the `using` is async
                    TypeSymbol alternateInterface    = getDisposableInterface(!hasAwait);
                    HashSet <DiagnosticInfo> ignored = null;
                    Conversion alternateConversion   = classifyConversion(fromExpression, alternateInterface, ref ignored);

                    bool      wrongAsync = alternateConversion.IsImplicit;
                    ErrorCode errorCode  = wrongAsync
                        ? (hasAwait ? ErrorCode.ERR_NoConvToIAsyncDispWrongAsync : ErrorCode.ERR_NoConvToIDispWrongAsync)
                        : (hasAwait ? ErrorCode.ERR_NoConvToIAsyncDisp : ErrorCode.ERR_NoConvToIDisp);

                    Error(diagnostics, errorCode, syntax, declarationTypeOpt ?? expressionOpt.Display);
                }

                return(false);
            }

            Conversion classifyConversion(bool fromExpression, TypeSymbol targetInterface, ref HashSet <DiagnosticInfo> diag)
            {
                return(fromExpression ?
                       originalBinder.Conversions.ClassifyImplicitConversionFromExpression(expressionOpt, targetInterface, ref diag) :
                       originalBinder.Conversions.ClassifyImplicitConversionFromType(declarationTypeOpt, targetInterface, ref diag));
            }

            TypeSymbol getDisposableInterface(bool isAsync)
            {
                return(isAsync
                    ? originalBinder.Compilation.GetWellKnownType(WellKnownType.System_IAsyncDisposable)
                    : originalBinder.Compilation.GetSpecialType(SpecialType.System_IDisposable));
            }
        }
Exemple #35
0
        private static int FindLocalDeclarationStatementIndex(
            WhileStatementSyntax whileStatement,
            SyntaxList <StatementSyntax> statements,
            int startIndex,
            int count,
            bool mustBeReferencedInsideWhileStatement,
            SemanticModel semanticModel,
            CancellationToken cancellationToken = default)
        {
            int         result = -1;
            int         whileStatementIndex = -1;
            ITypeSymbol typeSymbol          = null;

            for (int i = count - 1; i >= startIndex; i--)
            {
                StatementSyntax statement = statements[i];

                if (!(statement is LocalDeclarationStatementSyntax localDeclaration))
                {
                    return(result);
                }

                VariableDeclarationSyntax declaration = localDeclaration.Declaration;

                foreach (VariableDeclaratorSyntax variable in declaration.Variables)
                {
                    var symbol = (ILocalSymbol)semanticModel.GetDeclaredSymbol(variable, cancellationToken);

                    if (symbol == null)
                    {
                        continue;
                    }

                    if (symbol.Type.IsErrorType())
                    {
                        continue;
                    }

                    if (typeSymbol == null)
                    {
                        typeSymbol = symbol.Type;
                    }
                    else if (!typeSymbol.Equals(symbol.Type))
                    {
                        return(result);
                    }

                    ContainsLocalOrParameterReferenceWalker walker = ContainsLocalOrParameterReferenceWalker.GetInstance(symbol, semanticModel, cancellationToken);

                    if (mustBeReferencedInsideWhileStatement)
                    {
                        walker.VisitWhileStatement(whileStatement);

                        if (!walker.Result)
                        {
                            ContainsLocalOrParameterReferenceWalker.Free(walker);
                            return(result);
                        }
                    }

                    walker.Result = false;

                    if (whileStatementIndex == -1)
                    {
                        whileStatementIndex = statements.IndexOf(whileStatement);
                    }

                    walker.VisitList(statements, whileStatementIndex + 1);

                    if (ContainsLocalOrParameterReferenceWalker.GetResultAndFree(walker))
                    {
                        return(result);
                    }

                    result = i;
                }
            }

            return(result);
        }
Exemple #36
0
 void VisitDeclareVairable(DB_Type type, DB_Member method, DB_StatementSyntax statement, VariableDeclarationSyntax Declaration)
 {
     foreach (var e in Declaration.Variables)
     {
         model.AddLocal(e.Identifier, model.Finder.FindType(Declaration.Type, model));
         model.VisitExp(this, type, method, statement, e.Initializer, null);
     }
 }
Exemple #37
0
        private BoundMultipleVariableDeclarations BindForStatementDeclaration(VariableDeclarationSyntax syntax, Symbol parent)
        {
            // When binding for loop declarations, allow redefinition of variables from enclosing scope. (X3078)
            // Use most recently declared variable. Add a warning to diagnostics.

            return BindVariableDeclaration(syntax, parent, (d, t) =>
            {
                List<Symbol> existingSymbols;
                if (_symbols.TryGetValue(d.Identifier.Text, out existingSymbols))
                {
                    existingSymbols.Remove(existingSymbols.Last());
                    if (!existingSymbols.Any())
                        _symbols.Remove(d.Identifier.Text);
                    Diagnostics.ReportLoopControlVariableConflict(d);
                }
                return new VariableSymbol(d, parent, t);
            });
        }
Exemple #38
0
 // 变量声明
 public virtual void VisitVariableDeclarationSyntax(VariableDeclarationSyntax value)
 {
     DefaultVisit(value);
 }
 public virtual void VisitVariableDeclaration(VariableDeclarationSyntax node)
 {
     DefaultVisit(node);
 }
 public override void VisitVariableDeclaration(VariableDeclarationSyntax node)
 {
     VisitNodeToBind(node.Initializer);
 }
Exemple #41
0
        public override void VisitVariableDeclaration(VariableDeclarationSyntax node)
        {
            var fieldInfo = node.Parent as FieldDeclarationSyntax;
            var modifiers = fieldInfo.Modifiers;

            bool bPublic = modifiers.Any(c => c.Kind == SyntaxKind.PublicKeyword);

            string initValue = DefaultValueEmitter.FromType(node.Type.PlainName);

            foreach (var variable in node.Variables)
            {
                var nodeName = variable.Identifier.GetText().ToLowerCamelCase();

                if (variable.Initializer != null)
                    initValue = EmitExpression(variable.Initializer.Value);
                    //base.VisitVariableDeclaration(node);

                if (bPublic)
                    _publicCode.WriteLine("    {0}: {1},", nodeName, initValue);
                else
                    _writer.WriteLine("  var {0} = {1};", nodeName, initValue);
            }

            //base.VisitVariableDeclaration(node);
        }
Exemple #42
0
 public LocalDeclarationSharpnode(VariableDeclarationSyntax stmt) : base(null)
 {
     Init(stmt);
 }
        private BoundMultipleVariableDeclarations BindVariableDeclaration(VariableDeclarationSyntax syntax, Symbol parent, Func<VariableDeclaratorSyntax, TypeSymbol, VariableSymbol> createSymbol)
        {
            var boundType = Bind(syntax.Type, x => BindType(x, parent));

            var boundDeclarations = new List<BoundVariableDeclaration>();
            foreach (var declarator in syntax.Variables)
            {
                boundDeclarations.Add(Bind(declarator, x => BindVariableDeclarator(x, boundType.TypeSymbol, createSymbol)));
            }

            return new BoundMultipleVariableDeclarations(boundDeclarations.ToImmutableArray());
        }
 protected abstract void CompileVariableDeclaration(VariableDeclarationSyntax declaration);