示例#1
0
        public ResolveArrayArgument(ExcessContext ctx, SyntaxNode node, ArrayCreationExpressionSyntax arg)
        {
            ctx_  = ctx;
            node_ = node;

            args_.Add(SyntaxFactory.Argument(arg));
        }
示例#2
0
 public virtual void Visit(ArrayCreationExpressionSyntax arrayCreationExpressionSyntax)
 {
     Visit(arrayCreationExpressionSyntax.Type);
     foreach (var expressionSyntax in arrayCreationExpressionSyntax.Parameter)
     {
         Visit(expressionSyntax);
     }
 }
            private IEnumerable<TypeInferenceInfo> InferTypeInArrayCreationExpression(
                ArrayCreationExpressionSyntax arrayCreationExpression, SyntaxToken? previousToken = null)
            {
                if (previousToken.HasValue && previousToken.Value != arrayCreationExpression.NewKeyword)
                {
                    // Has to follow the 'new' keyword. 
                    return SpecializedCollections.EmptyEnumerable<TypeInferenceInfo>();
                }

                if (previousToken.HasValue && previousToken.Value.GetPreviousToken().Kind() == SyntaxKind.EqualsToken)
                {
                    // We parsed an array creation but the token before `new` is `=`.
                    // This could be a case like:
                    //
                    // int[] array;
                    // Program p = new |
                    // array[4] = 4;
                    //
                    // This is similar to the cases described in `InferTypeInObjectCreationExpression`.
                    // Again, all we have to do is back up to before `new`.

                    return InferTypes(previousToken.Value.SpanStart);
                }

                var outerTypes = InferTypes(arrayCreationExpression);
                return outerTypes.Where(o => o.InferredType is IArrayTypeSymbol);
            }
示例#4
0
 public ArrayCreationSharpnode(ArrayCreationExpressionSyntax syntax) : base(syntax)
 {
     this.LoadFrom(syntax.Initializer);
 }
示例#5
0
        private static void ReportRedundantArraySizeSpecifier(SyntaxNodeAnalysisContext context, ArrayCreationExpressionSyntax array)
        {
            if (array.Initializer == null ||
                array.Type == null)
            {
                return;
            }
            var rankSpecifier = array.Type.RankSpecifiers.FirstOrDefault();

            if (rankSpecifier == null ||
                rankSpecifier.Sizes.Any(s => s.IsKind(SyntaxKind.OmittedArraySizeExpression)))
            {
                return;
            }

            foreach (var size in rankSpecifier.Sizes)
            {
                context.ReportDiagnostic(Diagnostic.Create(Rule, size.GetLocation(),
                                                           ImmutableDictionary <string, string> .Empty.Add(DiagnosticTypeKey, RedundancyType.ArraySize.ToString()),
                                                           "array size specification"));
            }
        }
        public static void Go(OutputWriter writer, ArrayCreationExpressionSyntax array)
        {
            //TODO: does this info just get discarded ?
            //   if (array.Type.RankSpecifiers.Count > 1 || array.Type.RankSpecifiers.Single().Sizes.Count > 1)
            //     throw new Exception("Multi-dimensional arrays are not supported " + Utility.Descriptor(array));

            //  var rankExpression = array.Type.RankSpecifiers.FirstOrDefault().Sizes.Single();
//            IEnumerable<ExpressionSyntax> fullDimension =
//                array.Type.RankSpecifiers.Select(o => o.Sizes).SelectMany(j=>j);

            if (array.Initializer != null)
            {
                var aType = TypeProcessor.GetTypeInfo(array).Type as IArrayTypeSymbol;
                //                writer.Write("new ");
                //                writer.Write(TypeProcessor.ConvertType(array.Type.ElementType));
                //                writer.Write("[]{");

                //                var statement = " new (smGC) ";
                // writer.Write(" new ");
                var type = "";

                if (aType.Rank == 1) // Jagged
                {
                    var rCount = array.Type.RankSpecifiers.Count;

                    for (int i = 0; i < rCount; i++)
                    {
                        type += ("Array_T!(");

                        var typeInfo = TypeProcessor.GetTypeInfo(array.Type.ElementType);

                        if ((i + 1) == rCount)
                        {
                            var isPtr      = typeInfo.Type != null && typeInfo.Type.IsValueType; // ? "" : "";
                            var typeString = TypeProcessor.ConvertType(typeInfo.Type) + " ";

                            // Ideally Escape analysis should take care of this, but for now all value types are on heap and ref types on stack

                            //writer.Write(typeString);
                            type += typeString;
                        }
                    }
                    for (int i = 0; i < rCount; i++)
                    {
                        if ((i > 0) && rCount > 1)
                        {
                            type = type;
                        }
                        type += (")");
                    }
                }
                else
                {
                    type += "Array_T!(" + TypeProcessor.ConvertType(array.Type.ElementType)
                            /* + Enumerable.Range (0, aType.Rank-1).Select (l => "[]").Aggregate ((a, b) => a + b).ToString () */ +
                            ")";

//                  var typeInfo = TypeProcessor.GetTypeInfo (array.Type.ElementType);
                }
//              if (type.ConvertedType.TypeKind == Microsoft.CodeAnalysis.TypeKind.TypeParameter)
//                  writer.Write (" __TypeNew!(" + type + ")([");
//              else
                //{
                writer.Write("new  " + type);

                writer.Write("(");
                //}
                bool first = true;

                array.Initializer.WriteArrayInitializer(writer, array.Type);

                writer.Write(")");
            }
            else
            {
                // int.TryParse(rankExpression != null ? rankExpression.ToString() : "0", out sizeInteger);

                //  writer.Write(" new ");
                var typeStr = "";

                var rCount = array.Type.RankSpecifiers.Count;
                for (int i = 0; i < rCount; i++)
                {
                    typeStr += ("Array_T!(");

                    var type = TypeProcessor.GetTypeInfo(array.Type.ElementType);

                    if ((i + 1) == rCount)
                    {
//                    if (type.Type != null && (type.Type.IsValueType == false))
//                            typeStr += ("");
                        // Ideally Escape analysis should take care of this, but for now all value types are on heap and ref types on stack

                        typeStr += (TypeProcessor.ConvertType(array.Type.ElementType));
                    }
                }
                for (int i = 0; i < rCount; i++)
                {
//                    if ((i > 0) && rCount > 1)
//                        typeStr+=("");
                    typeStr += (")");
                }

                writer.Write("new " + typeStr);
                writer.Write("(");

                array.Initializer.WriteArrayInitializer(writer, array.Type);

                writer.Write(")");

                //                writer.Write("new Array_T!(");
                //
                //
                //
                //                var symbol =Program.GetModel(array).GetDeclaredSymbol(array.Type.ElementType);
                //
                //                var lsymbol = symbol as ILocalSymbol;
                //
                //                if (lsymbol != null && (lsymbol.Type.IsValueType == false))
                //                    writer.Write(""); // Ideally Escape analysis should take care of this, but for now all value types are on heap and ref types on stack
                //
                //                writer.Write(TypeProcessor.ConvertType(array.Type.ElementType));
                //                                writer.Write(">("+fullDimension+")");

                // Core.Write(writer, array.Type.RankSpecifiers.Single().Sizes.Single());
                // writer.Write(")");

                //  if (array.Initializer != null)
                //    throw new Exception("Initalizers along with array sizes are not supported - please use a size or an initializer " + Utility.Descriptor(array));

                //                writer.Write("new ");
                //                writer.Write(TypeProcessor.ConvertType(array.Type.ElementType));
                //                writer.Write("[]{");
                //                Core.Write(writer, array.Type.RankSpecifiers.Single().Sizes.Single());
                //                writer.Write("}");
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="InvokationExpression"/> class.
 /// </summary>
 /// <param name="syntaxNode"></param>
 public ArrayCreationExpression(ArrayCreationExpressionSyntax syntaxNode)
     : this(syntaxNode, null)
 {
 }
 public ArrayCreationExpressionTranslation(ArrayCreationExpressionSyntax syntax, SyntaxTranslation parent) : base(syntax, parent)
 {
     Type = syntax.Type.Get<ArrayTypeTranslation>(this);
     Initializer = syntax.Initializer.Get<InitializerExpressionTranslation>(this);
 }
示例#9
0
 public ArrayCreationExpressionTranslation(ArrayCreationExpressionSyntax syntax, SyntaxTranslation parent) : base(syntax, parent)
 {
     Type        = syntax.Type.Get <ArrayTypeTranslation>(this);
     Initializer = syntax.Initializer.Get <InitializerExpressionTranslation>(this);
 }
示例#10
0
 public override SyntaxNode VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     node = (ArrayCreationExpressionSyntax)base.VisitArrayCreationExpression(node);
     Classes.Add(node);
     return(node);
 }
 public ArrayCreationStatementInterpreter(StatementInterpreterHandler statementInterpreterHandler, ArrayCreationExpressionSyntax arrayCreationExpressionSyntax, Microsoft.CodeAnalysis.SemanticModel semanticModel)
 {
     this.statementInterpreterHandler   = statementInterpreterHandler;
     this.arrayCreationExpressionSyntax = arrayCreationExpressionSyntax;
     this.semanticModel = semanticModel;
 }
示例#12
0
 // new数组表达式
 public virtual void VisitArrayCreationExpressionSyntax(ArrayCreationExpressionSyntax value)
 {
     DefaultVisit(value);
 }
        public static void Go(OutputWriter writer, ArrayCreationExpressionSyntax array)
        {
            //TODO: does this info just get discarded ?
            //   if (array.Type.RankSpecifiers.Count > 1 || array.Type.RankSpecifiers.Single().Sizes.Count > 1)
            //     throw new Exception("Multi-dimensional arrays are not supported " + Utility.Descriptor(array));

            //  var rankExpression = array.Type.RankSpecifiers.FirstOrDefault().Sizes.Single();
//            IEnumerable<ExpressionSyntax> fullDimension =
//                array.Type.RankSpecifiers.Select(o => o.Sizes).SelectMany(j=>j);

            if (array.Initializer != null)
            {
                var aType = TypeProcessor.GetTypeInfo(array).Type as IArrayTypeSymbol;
                //                writer.Write("new ");
                //                writer.Write(TypeProcessor.ConvertType(array.Type.ElementType));
                //                writer.Write("[]{");

                //                var statement = " new (smGC) ";
                // writer.Write(" new ");
                var type = "";

                if (aType.Rank == 1) // Jagged
                {
                    var rCount = array.Type.RankSpecifiers.Count;

                    for (int i = 0; i < rCount; i++)
                    {
                        type += ("Array_T!(");

                        var typeInfo = TypeProcessor.GetTypeInfo(array.Type.ElementType);

                        if ((i + 1) == rCount)
                        {
                            var isPtr = typeInfo.Type != null && typeInfo.Type.IsValueType; // ? "" : "";
                            var typeString = TypeProcessor.ConvertType(typeInfo.Type) + " ";

                            // Ideally Escape analysis should take care of this, but for now all value types are on heap and ref types on stack

                            //writer.Write(typeString);
                            type += typeString;
                        }
                    }
                    for (int i = 0; i < rCount; i++)
                    {
                        if ((i > 0) && rCount > 1)
                            type = type;
                        type += (")");
                    }
                }
                else
                {
                    type += "Array_T!(" + TypeProcessor.ConvertType(array.Type.ElementType)
                        /* + Enumerable.Range (0, aType.Rank-1).Select (l => "[]").Aggregate ((a, b) => a + b).ToString () */ +
                    ")";

//                  var typeInfo = TypeProcessor.GetTypeInfo (array.Type.ElementType);
                }
//              if (type.ConvertedType.TypeKind == Microsoft.CodeAnalysis.TypeKind.TypeParameter)
//                  writer.Write (" __TypeNew!(" + type + ")([");
//              else
                //{
                writer.Write("new  " + type);

                writer.Write("(");
                //}
                bool first = true;

                array.Initializer.WriteArrayInitializer(writer, array.Type);

                writer.Write(")");
            }
            else
            {
                // int.TryParse(rankExpression != null ? rankExpression.ToString() : "0", out sizeInteger);

                //  writer.Write(" new ");
                var typeStr = "";

                var rCount = array.Type.RankSpecifiers.Count;
                for (int i = 0; i < rCount; i++)
                {
                    typeStr += ("Array_T!(");

                    var type = TypeProcessor.GetTypeInfo(array.Type.ElementType);

                    if ((i + 1) == rCount)
                    {
//                    if (type.Type != null && (type.Type.IsValueType == false))
//                            typeStr += ("");
                        // Ideally Escape analysis should take care of this, but for now all value types are on heap and ref types on stack

                        typeStr += (TypeProcessor.ConvertType(array.Type.ElementType));
                    }
                }
                for (int i = 0; i < rCount; i++)
                {
//                    if ((i > 0) && rCount > 1)
//                        typeStr+=("");
                    typeStr += (")");
                }

                writer.Write("new " + typeStr);
                writer.Write("(");

                array.Initializer.WriteArrayInitializer(writer, array.Type);

                writer.Write(")");

                //                writer.Write("new Array_T!(");
                //
                //              
                //
                //                var symbol =Program.GetModel(array).GetDeclaredSymbol(array.Type.ElementType);
                //
                //                var lsymbol = symbol as ILocalSymbol;
                //
                //                if (lsymbol != null && (lsymbol.Type.IsValueType == false))
                //                    writer.Write(""); // Ideally Escape analysis should take care of this, but for now all value types are on heap and ref types on stack
                //
                //                writer.Write(TypeProcessor.ConvertType(array.Type.ElementType));
                //                                writer.Write(">("+fullDimension+")");

                // Core.Write(writer, array.Type.RankSpecifiers.Single().Sizes.Single());
                // writer.Write(")");

                //  if (array.Initializer != null)
                //    throw new Exception("Initalizers along with array sizes are not supported - please use a size or an initializer " + Utility.Descriptor(array));

                //                writer.Write("new ");
                //                writer.Write(TypeProcessor.ConvertType(array.Type.ElementType));
                //                writer.Write("[]{");
                //                Core.Write(writer, array.Type.RankSpecifiers.Single().Sizes.Single());
                //                writer.Write("}");
            }
        }
示例#14
0
 /// <summary>
 /// Initializes a new instance of the <see cref="InvokationExpression"/> class.
 /// </summary>
 /// <param name="syntaxNode"></param>
 /// <param name="semanticModel"></param>
 public ArrayCreationExpression(ArrayCreationExpressionSyntax syntaxNode, SemanticModel semanticModel)
     : base(syntaxNode, semanticModel)
 {
 }
 private static bool AtLeastOneExactTypeMatch(SemanticModel semanticModel, ArrayCreationExpressionSyntax arrayCreation, IArrayTypeSymbol arrayType)
 {
     return arrayCreation.Initializer.Initializers.Any(initializer => arrayType.ElementType.Equals(semanticModel.GetTypeInfo(initializer).Type));
 }
示例#16
0
 public virtual void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node) => DefaultVisit(node);
示例#17
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="node"></param>
 public override sealed void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     this.OnNodeVisited(node);
     if (!this.traverseRootOnly) base.VisitArrayCreationExpression(node);
 }
示例#18
0
 private static bool AtLeastOneExactTypeMatch(SemanticModel semanticModel, ArrayCreationExpressionSyntax arrayCreation, IArrayTypeSymbol arrayType)
 {
     return(arrayCreation.Initializer.Initializers.Any(initializer => arrayType.ElementType.Equals(semanticModel.GetTypeInfo(initializer).Type)));
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="node"></param>
 public override sealed void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     this.OnNodeVisited(node, this.type.IsInstanceOfType(node));
     base.VisitArrayCreationExpression(node);
 }
示例#20
0
 public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     base.VisitArrayCreationExpression(node);
 }
示例#21
0
 public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax newArrayExpression)
 {
     Visit(newArrayExpression.Type);
     Visit(newArrayExpression.Initializer);
 }
 /// <inheritdoc />
 public override Expression VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     return(base.VisitArrayCreationExpression(node));
 }
示例#23
0
 public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     IsComplex = true;
     base.VisitArrayCreationExpression(node);
 }
 private bool CanBeReplaceWithEnumerableEmpty(ArrayCreationExpressionSyntax arrayCreation)
 {
     return(IsInitializationBlockEmpty(arrayCreation.Initializer));
 }
示例#25
0
        public FlatOperand Resolve(ArrayCreationExpressionSyntax node, TypeInfo result_type, FlatOperand into_lvalue, List<FlatStatement> instructions)
        {
            /*        // Summary:
            //     InitializerExpressionSyntax node representing the initializer of the array
            //     creation expression.
            public InitializerExpressionSyntax Initializer { get; }
            //
            // Summary:
            //     SyntaxToken representing the new keyword.
            public SyntaxToken NewKeyword { get; }
            //
            // Summary:
            //     ArrayTypeSyntax node representing the type of the array.
            public ArrayTypeSyntax Type { get; }
             */
            if (node.Initializer != null)
            {
                throw new NotImplementedException("new array with initializer");
            }

            /*
            // Summary:
            //     TypeSyntax node representing the type of the element of the array.
            public TypeSyntax ElementType { get; }
            //
            // Summary:
            //     SyntaxList of ArrayRankSpecifierSyntax nodes representing the list of rank
            //     specifiers for the array.
            public SyntaxList<ArrayRankSpecifierSyntax> RankSpecifiers { get; }
            /**/
            /*
            if (node.Type.RankSpecifiers.Count > 1)
            {
                throw new NotImplementedException("new array with multiple rank specifiers");
            }

            /*
            public int Rank { get; }
            public SeparatedSyntaxList<ExpressionSyntax> Sizes { get; }
             */

            // get total number of elements
            FlatOperand fop_total = null;

            foreach(ArrayRankSpecifierSyntax arss in node.Type.RankSpecifiers)
            {
                foreach(ExpressionSyntax es in arss.Sizes)
                {
                    if (fop_total != null)
                    {
                        FlatOperand fop_size = ResolveExpression(es, null, instructions);

                        FlatOperand fop_total_lvalue = AllocateRegister("");

                        FlatStatement.MUL(fop_total_lvalue, fop_total, fop_size);

                        fop_total = fop_total_lvalue.AsRValue(FlatValue.Int32(0));
                    }
                    else
                    {
                        fop_total = ResolveExpression(es, null, instructions);
                    }
                }
            }

            TypeInfo ti = Model.GetTypeInfo(node.Type.ElementType);
            FlatOperand fop_type = Resolve(ti.ConvertedType, null, instructions);

            if (into_lvalue == null)
            {
                FlatOperand register_fop = AllocateRegister("");
                into_lvalue = register_fop.GetLValue(this, instructions);
            }
            instructions.Add(FlatStatement.NEWARRAY(into_lvalue, fop_total, fop_type));

            return into_lvalue.AsRValue(FlatValue.FromType(result_type.ConvertedType));
        }
示例#26
0
        private static void ReportRedundantArrayTypeSpecifier(SyntaxNodeAnalysisContext context, ArrayCreationExpressionSyntax array)
        {
            if (array.Initializer == null ||
                !array.Initializer.Expressions.Any() ||
                array.Type == null)
            {
                return;
            }

            var rankSpecifier = array.Type.RankSpecifiers.FirstOrDefault();

            if (rankSpecifier == null ||
                rankSpecifier.Sizes.Any(s => !s.IsKind(SyntaxKind.OmittedArraySizeExpression)))
            {
                return;
            }

            var arrayType = context.SemanticModel.GetTypeInfo(array.Type).Type as IArrayTypeSymbol;

            if (arrayType == null)
            {
                return;
            }

            var canBeSimplified = array.Initializer.Expressions
                                  .Select(exp => context.SemanticModel.GetTypeInfo(exp).Type)
                                  .All(type => object.Equals(type, arrayType.ElementType));

            if (canBeSimplified)
            {
                var location = Location.Create(array.SyntaxTree, TextSpan.FromBounds(
                                                   array.Type.ElementType.SpanStart, array.Type.RankSpecifiers.Last().SpanStart));

                context.ReportDiagnostic(Diagnostic.Create(Rule, location,
                                                           ImmutableDictionary <string, string> .Empty.Add(DiagnosticTypeKey, RedundancyType.ArrayType.ToString()),
                                                           "array type"));
            }
        }
示例#27
0
        public void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
        {
            if (node == null)
                throw new ArgumentNullException("node");

            node.Validate();

            ExpressionStart(node);

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

            _writer.WriteKeyword(PrinterKeyword.New);
            _writer.WriteSpace();
            node.Type.Accept(this);

            if (node.Initializer != null)
            {
                _writer.PushBraceFormatting(_writer.Configuration.BracesLayout.ArrayAndObjectInitializer, false);

                node.Initializer.Accept(this);

                _writer.PopBraceFormatting();
            }

            if (_writer.Configuration.Other.AlignMultiLineConstructs.ArrayObjectCollectionInitializer)
                _writer.SetAlignmentBreak(false);

            ExpressionEnd(node);
        }
示例#28
0
 public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     throw new NotImplementedException();
 }
示例#29
0
 public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     Emit <ArrayCreationExpressionBlock, ArrayCreationExpressionSyntax>(node);
 }
示例#30
0
        public override SyntaxNode VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
        {
            _output.TrivialWrite('[');

            foreach (var rs in node.Type.RankSpecifiers)
                this.Visit(rs);

            int count = 0;
            if (node.Initializer != null)
            {
                foreach (var expr in node.Initializer.Expressions)
                {
                    this.VisitExpression(expr);
                    count++;
                    if (count != node.Initializer.Expressions.Count)
                        _output.TrivialWrite(", ");
                }
            }

            _output.TrivialWrite(']');

            return node;
        }
示例#31
0
 public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node) => base.VisitArrayCreationExpression(node);
 private static bool AllTypesAreConvertible(SemanticModel semanticModel, ArrayCreationExpressionSyntax arrayCreation, IArrayTypeSymbol arrayType)
 {
     return arrayCreation.Initializer.Initializers.All(initializer =>
     {
         var conversion = semanticModel.ClassifyConversion(initializer, arrayType.ElementType);
         return conversion.Exists && (conversion.IsIdentity || conversion.IsWidening);
     });
 }
示例#33
0
 private IEnumerable <string> Visit(ArrayCreationExpressionSyntax node)
 {
     return(node.Initializer.Expressions.Select(Visit).Where(v => v != null).SelectMany(v => v));
 }
示例#34
0
 public static string ArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     var output = "[ ";
     output += string.Join(", ", node.Initializer.Expressions.Select(SyntaxNode));
     return output + " ]";
 }
 private static bool CanBeReplaceWithEnumerableEmpty(ArrayCreationExpressionSyntax arrayCreation)
 => IsInitializationBlockEmpty(arrayCreation.Initializer);
        private static void AnalyzeRankSpecifiers(SyntaxNodeAnalysisContext context, ArrayCreationExpressionSyntax arrayCreation)
        {
            if (!arrayCreation.Type.RankSpecifiers.Any())
            {
                return;
            }

            foreach (var arrayRankSpecifierSyntax in arrayCreation.Type.RankSpecifiers)
            {
                var openBracketToken = arrayRankSpecifierSyntax.OpenBracketToken;
                if (openBracketToken.IsMissing ||
                    arrayRankSpecifierSyntax.IsMissing ||
                    !arrayRankSpecifierSyntax.Sizes.Any())
                {
                    return;
                }

                var firstSize = arrayRankSpecifierSyntax.Sizes[0];

                var firstSizeLineSpan = firstSize.GetLineSpan();
                if (!firstSizeLineSpan.IsValid)
                {
                    return;
                }

                var openBracketLineSpan = openBracketToken.GetLineSpan();
                if (!openBracketLineSpan.IsValid)
                {
                    return;
                }

                if (openBracketLineSpan.EndLinePosition.Line != firstSizeLineSpan.StartLinePosition.Line &&
                    openBracketLineSpan.EndLinePosition.Line != (firstSizeLineSpan.StartLinePosition.Line - 1))
                {
                    context.ReportDiagnostic(Diagnostic.Create(Descriptor, firstSize.GetLocation()));
                }
            }
        }
示例#37
0
        //public override void VisitAccessorDeclaration(AccessorDeclarationSyntax node)
        //{
        //    base.VisitAccessorDeclaration(node);
        //}

        //public override void VisitAccessorList(AccessorListSyntax node)
        //{
        //    base.VisitAccessorList(node);
        //}

        //public override void VisitAliasQualifiedName(AliasQualifiedNameSyntax node)
        //{
        //    base.VisitAliasQualifiedName(node);
        //}

        //public override void VisitAnonymousMethodExpression(AnonymousMethodExpressionSyntax node)
        //{
        //    base.VisitAnonymousMethodExpression(node);
        //}

        //public override void VisitAnonymousObjectCreationExpression(AnonymousObjectCreationExpressionSyntax node)
        //{
        //    base.VisitAnonymousObjectCreationExpression(node);
        //}

        //public override void VisitAnonymousObjectMemberDeclarator(AnonymousObjectMemberDeclaratorSyntax node)
        //{
        //    base.VisitAnonymousObjectMemberDeclarator(node);
        //}

        //public override void VisitArgumentList(ArgumentListSyntax node)
        //{
        //    base.VisitArgumentList(node);
        //}

        public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
        {
            Visit(node.Type);
            Visit(node.Initializer);
            //base.VisitArrayCreationExpression(node);
        }
 private static bool HasSizeSpecifier(ArrayCreationExpressionSyntax arrayCreation)
 {
     return(arrayCreation.ArrayBounds != null &&
            arrayCreation.ArrayBounds.Arguments.Any());
 }
        private static void AddArrayCreationExpressionTerms(
            ArrayCreationExpressionSyntax arrayCreationExpression,
            IList<string> terms,
            ref ExpressionType expressionType)
        {
            var validTerm = true;

            if (arrayCreationExpression.Initializer != null)
            {
                var flags = ExpressionType.Invalid;
                arrayCreationExpression.Initializer.Expressions.Do(e => AddSubExpressionTerms(e, terms, ref flags));

                validTerm &= IsValidTerm(flags);
            }

            if (validTerm)
            {
                expressionType = ExpressionType.ValidExpression;
            }
            else
            {
                expressionType = ExpressionType.Invalid;
            }
        }
            private IEnumerable<ITypeSymbol> InferTypeInArrayCreationExpression(
                ArrayCreationExpressionSyntax arrayCreationExpression, SyntaxToken? previousToken = null)
            {
                if (previousToken.HasValue && previousToken.Value != arrayCreationExpression.NewKeyword)
                {
                    // Has to follow the 'new' keyword. 
                    return SpecializedCollections.EmptyEnumerable<ITypeSymbol>();
                }

                var outerTypes = InferTypes(arrayCreationExpression);
                return outerTypes.Where(o => o is IArrayTypeSymbol);
            }
示例#41
0
        /// <summary>Called once at compilation start to register actions in the compilation context.</summary>
        /// <param name="context">The analysis context.</param>
        internal override void RegisterSyntaxNodeAction(CompilationStartAnalysisContext context)
        {
            context.RegisterSyntaxNodeAction(ctx =>
            {
                // We can't replace array allocations in attributes, as they're persisted to metadata
                if (ctx.Node.Parent is AttributeArgumentSyntax)
                {
                    return;
                }

                InitializerExpressionSyntax initializerExpr = null;
                bool isArrayCreationExpression = ctx.Node.CSharpKind() == SyntaxKind.ArrayCreationExpression;
                if (isArrayCreationExpression)
                {
                    // This is an ArrayCreationExpression (e.g. "new byte[2]" or "new byte[] { 1, 2 }").
                    // If it has only a single rank, and if the input to it is a constant 0, report it.
                    ArrayCreationExpressionSyntax arrayCreationExpr = (ArrayCreationExpressionSyntax)ctx.Node;
                    var arrayType = arrayCreationExpr.Type;
                    if (arrayType.ElementType is PointerTypeSyntax) // pointers can't be used as generic arguments
                    {
                        return;
                    }

                    if (arrayType.RankSpecifiers.Count >= 1)
                    {
                        // Make sure this is a single dimensional array.
                        ArrayRankSpecifierSyntax rankSpecifier = arrayType.RankSpecifiers[0];
                        if (rankSpecifier.Rank != 1)
                        {
                            return;
                        }

                        // Parse out the numerical length from the rank specifier.  It must be a constant zero.
                        LiteralExpressionSyntax sizeSpecifier = rankSpecifier.ChildNodes().FirstOrDefault(child => child.CSharpKind() == SyntaxKind.NumericLiteralExpression) as LiteralExpressionSyntax;
                        if (sizeSpecifier != null)
                        {
                            if (sizeSpecifier.Token.Value is int && ((int)sizeSpecifier.Token.Value) == 0)
                            {
                                Report(ctx, arrayCreationExpr);
                            }

                            return;
                        }

                        // We couldn't determine the length based on the rank specifier.
                        // We'll try to do so based on any initializer expression the array has.
                        initializerExpr = arrayCreationExpr.Initializer;
                    }
                }
                else if (!(ctx.Node.Parent is ArrayCreationExpressionSyntax))
                {
                    // This is an ArrayInitializerExpression (e.g. { 1, 2 }).  However, we only want to examine it
                    // if it's not part of a larger ArrayCreationExpressionSyntax; otherwise, we'll end up
                    // flagging it twice and recommending incorrect transforms.
                    initializerExpr = ctx.Node as InitializerExpressionSyntax;
                }

                // If we needed to examine the initializer in order to get the size and if it's 0,
                // report it, but make sure to report the right syntax node.
                if (initializerExpr != null && initializerExpr.Expressions.Count == 0)
                {
                    Report(ctx, isArrayCreationExpression ? ctx.Node : initializerExpr);
                }
            }, expressionKinds);
        }
示例#42
0
        private bool TryGenerateNewArray(ArrayCreationExpressionSyntax arrayCreationExpression)
        {
            var type = SemanticModel.GetTypeInfo(arrayCreationExpression).Type;
            if (type == null)
            {
                return false;
            }

            using (NewArrayTag())
            {
                GenerateType(type);

                if (arrayCreationExpression.Initializer != null)
                {
                    using (BoundTag())
                    using (ExpressionTag())
                    using (LiteralTag())
                    using (NumberTag())
                    {
                        EncodedText(arrayCreationExpression.Initializer.Expressions.Count.ToString());
                    }

                    if (!TryGenerateExpression(arrayCreationExpression.Initializer))
                    {
                        return false;
                    }
                }
                else
                {
                    foreach (var rankSpecifier in arrayCreationExpression.Type.RankSpecifiers)
                    {
                        foreach (var size in rankSpecifier.Sizes)
                        {
                            using (BoundTag())
                            {
                                if (!TryGenerateExpression(size))
                                {
                                    return false;
                                }
                            }
                        }
                    }
                }
            }

            return true;
        }
 public override void VisitArrayCreationExpression(ArrayCreationExpressionSyntax node)
 {
     if (!node.IsKind(SyntaxKind.ImplicitArrayCreationExpression) &&
         this.typeSymbol.Equals(this.semanticModel.GetTypeInfo(node).Type))
     {
         this.IsAmbiguous = false;
     }
     else
     {
         base.DefaultVisit(node);
     }
 }