/// <summary>
        /// Evaluate expression that contains a list of assignment.
        /// </summary>
        /// <param name="declaration"></param>
        /// <param name="state"></param>
        private VariableState VisitVariableDeclaration(VariableDeclaratorSyntax declaration, ExecutionState state)
        {
            VariableState lastState = new VariableState(declaration, VariableTaint.UNKNOWN);

            foreach (var variable in declaration.Names)
            {
                var identifier  = variable.Identifier;
                var initializer = declaration.Initializer;
                if (initializer is EqualsValueSyntax)
                {
                    EqualsValueSyntax equalsClause = initializer;

                    VariableState varState = VisitExpression(equalsClause.Value, state);
                    //varState.SetType(lastState.type);
                    state.AddNewValue(ResolveIdentifier(identifier), varState);
                    lastState = varState;
                }
                if (declaration.AsClause is AsNewClauseSyntax)
                {
                    var           newClause = (AsNewClauseSyntax)declaration.AsClause;
                    VariableState varState  = VisitExpression(newClause.NewExpression, state);
                    state.AddNewValue(ResolveIdentifier(identifier), varState);
                    lastState = varState;
                }
            }

            return(lastState);
        }
        public override SyntaxNode GetDefaultValueForAnOptionalParameter(SyntaxNode declNode, int paramIndex)
        {
            if (declNode == null)
            {
                return(null);
            }

            var methodDecl = (MethodBlockBaseSyntax)declNode;

            ParameterListSyntax paramList = methodDecl.BlockStatement.ParameterList;

            if (paramIndex >= paramList.Parameters.Count)
            {
                return(null);
            }

            EqualsValueSyntax equalsValueNode = paramList.Parameters[paramIndex].Default;

            if (equalsValueNode != null)
            {
                return(equalsValueNode.Value);
            }

            return(null);
        }
        private VariableState VisitVariableDeclaration(VariableDeclaratorSyntax declaration, ExecutionState state)
        {
            VariableState lastState = new VariableState(declaration, VariableTaint.UNKNOWN);

            var identifier  = declaration.GetFirstToken();
            var initializer = declaration.Initializer;

            if (initializer is EqualsValueSyntax)
            {
                EqualsValueSyntax equalsClause = initializer;

                VariableState varState = VisitExpression(equalsClause.Value, state);
                state.AddNewValue(ResolveIdentifier(identifier), varState);
                lastState = varState;
            }

            return(lastState);
        }
示例#4
0
        private VariableDeclaratorSyntax ConvertToVariableDeclarator(CSS.PropertyDeclarationSyntax des)
        {
            var        id  = GetVbPropertyBackingFieldName(des);
            var        ids = SyntaxFactory.SingletonSeparatedList(SyntaxFactory.ModifiedIdentifier(id));
            TypeSyntax typeSyntax;

            if (des.Type.IsVar)
            {
                var typeSymbol = ModelExtensions.GetSymbolInfo(_semanticModel, des.Type).ExtractBestMatch <ITypeSymbol>();
                typeSyntax = typeSymbol?.ToVbSyntax(_semanticModel, des.Type);
            }
            else
            {
                typeSyntax = (TypeSyntax)des.Type.Accept(_nodesVisitor);
            }

            var simpleAsClauseSyntax = typeSyntax != null?SyntaxFactory.SimpleAsClause(typeSyntax) : null;   //Gracefully degrade when no type information available

            EqualsValueSyntax equalsValueSyntax = null;

            return(SyntaxFactory.VariableDeclarator(ids, simpleAsClauseSyntax, equalsValueSyntax));
        }
            public override VisualBasicSyntaxNode VisitParameter(CSS.ParameterSyntax node)
            {
                var id = SyntaxFactory.Identifier(node.Identifier.ValueText, SyntaxFacts.IsKeywordKind(node.Identifier.Kind()), node.Identifier.GetIdentifierText(), TypeCharacter.None);
                EqualsValueSyntax @default = null;

                if (node.Default != null)
                {
                    @default = SyntaxFactory.EqualsValue((ExpressionSyntax)node.Default?.Value.Accept(this));
                }
                AttributeListSyntax[] newAttributes;
                var modifiers = ConvertModifiers(node.Modifiers, TokenContext.Member);

                if (modifiers.Count == 0)
                {
                    modifiers     = SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.ByValKeyword));
                    newAttributes = new AttributeListSyntax[0];
                }
                else if (node.Modifiers.Any(m => m.IsKind(CS.SyntaxKind.OutKeyword)))
                {
                    newAttributes = new[] {
                        SyntaxFactory.AttributeList(
                            SyntaxFactory.SingletonSeparatedList(
                                SyntaxFactory.Attribute(SyntaxFactory.ParseTypeName("Out"))
                                )
                            )
                    };
                }
                else
                {
                    newAttributes = new AttributeListSyntax[0];
                }
                return(SyntaxFactory.Parameter(
                           SyntaxFactory.List(newAttributes.Concat(node.AttributeLists.Select(a => (AttributeListSyntax)a.Accept(this)))),
                           modifiers,
                           SyntaxFactory.ModifiedIdentifier(id),
                           SyntaxFactory.SimpleAsClause((TypeSyntax)node.Type.Accept(this)),
                           @default
                           ));
            }
示例#6
0
 private ImmutableArray <SymbolDisplayPart> GetInitializerParts(
     ImmutableArray <SymbolDisplayPart> .Builder parts, EqualsValueSyntax equalsValue)
 {
     // TODO: use Microsoft.CodeAnalysis.Classification.Classifier to get parts from equalsValue
     return(parts.TryMoveToImmutable());
 }
示例#7
0
        protected override async Task <ImmutableArray <SymbolDisplayPart> > GetInitializerPartsAsync(ISymbol symbol)
        {
            object            evaluatedValue = null;
            EqualsValueSyntax initializer    = null;

            switch (symbol)
            {
            case IFieldSymbol field:
                evaluatedValue = field.ConstantValue;
                var fieldDeclarator = await symbol.GetDeclarationAsync <VariableDeclaratorSyntax>(CancellationToken);

                if (fieldDeclarator is null)
                {
                    var enumMemberDeclaration = await symbol.GetDeclarationAsync <EnumMemberDeclarationSyntax>(CancellationToken);

                    if (!(enumMemberDeclaration is null))
                    {
                        initializer = enumMemberDeclaration.Initializer;
                    }
                }
                else
                {
                    initializer = fieldDeclarator.Initializer;
                }
                break;

            case ILocalSymbol local:
                evaluatedValue = local.ConstantValue;
                var localDeclarator = await symbol.GetDeclarationAsync <VariableDeclaratorSyntax>(CancellationToken);

                if (!(localDeclarator is null))
                {
                    initializer = localDeclarator.Initializer;
                }
                break;

            case IParameterSymbol parameter:
                evaluatedValue = parameter.ExplicitDefaultValue;
                var parameterSyntax = await symbol.GetDeclarationAsync <ParameterSyntax>(CancellationToken);

                if (!(parameterSyntax is null))
                {
                    initializer = parameterSyntax.Default;
                }
                break;
            }

            var builder = ImmutableArray.CreateBuilder <SymbolDisplayPart>();

            if (!(evaluatedValue is null))
            {
                if (evaluatedValue is string str)
                {
                    builder.Add(new SymbolDisplayPart(SymbolDisplayPartKind.StringLiteral, null, $"\"{str}\""));
                }
                else if (evaluatedValue.IsNumber())
                {
                    builder.Add(new SymbolDisplayPart(SymbolDisplayPartKind.NumericLiteral, null, evaluatedValue.ToString()));
                }
            }

            if (initializer is null)
            {
                return(builder.TryMoveToImmutable());
            }
            return(GetInitializerParts(builder, initializer));
        }