Esempio n. 1
0
        /// <summary>
        /// Process local variable declaration.
        /// </summary>
        /// <param name="localVariableDeclaration">
        /// The local variable declaration.
        /// </param>
        private static void ProcessLocalVariableDeclaration(ILocalVariableDeclaration localVariableDeclaration)
        {
            IMultipleLocalVariableDeclaration multipleDeclaration = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(localVariableDeclaration);

            if (multipleDeclaration.Declarators.Count > 1)
            {
                IType newType = CSharpTypeFactory.CreateType(multipleDeclaration.TypeUsage);

                using (WriteLockCookie.Create(true))
                {
                    multipleDeclaration.SetTypeUsage(CSharpElementFactory.GetInstance(localVariableDeclaration.GetPsiModule()).CreateTypeUsageNode(newType));
                }
            }
            else
            {
                ILocalVariable variable = localVariableDeclaration.DeclaredElement;
                if (variable != null)
                {
                    if (!multipleDeclaration.IsVar)
                    {
                        using (WriteLockCookie.Create(true))
                        {
                            localVariableDeclaration.SetType(variable.Type);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        private static ITreeNode GetCaptureHighlightingRange(
            [NotNull] ITreeNode topDeclaration, [CanBeNull] IParametersOwner thisElement, [NotNull] IDeclaredElement capture, out DocumentRange range)
        {
            var declarations = capture.GetDeclarations();

            if (declarations.Count == 0) // accessors 'value' parameter
            {
                if (thisElement is IAccessor accessor && Equals(accessor.ValueVariable, capture))
                {
                    var identifier = ((IAccessorDeclaration)topDeclaration).NameIdentifier;
                    range = identifier.GetDocumentRange();
                    return(identifier);
                }

                range = DocumentRange.InvalidRange;
                return(null);
            }

            var declaration = declarations[0];

            range = declaration.GetNameDocumentRange();
#if RESHARPER2016_3
            var nameEndOffset = range.EndOffset;
#else
            var nameEndOffset = range.TextRange.EndOffset;
#endif

            if (declaration is ILocalVariableDeclaration variableDeclaration)
            {
                var multiple = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(variableDeclaration);
                if (multiple != null && multiple.Declarators[0] == variableDeclaration)
                {
                    var documentRange = multiple.GetTypeRange();
                    range = documentRange.SetEndTo(nameEndOffset);
                    return(variableDeclaration);
                }

                return(null);
            }

            if (declaration is IRegularParameterDeclaration parameterDeclaration)
            {
                if (range.TextRange.Length < 3)
                {
                    range = parameterDeclaration.TypeUsage.GetDocumentRange().SetEndTo(nameEndOffset);
                }

                return(parameterDeclaration);
            }

            if (declaration is IAnonymousMethodParameterDeclaration anonymousParameter)
            {
                range = anonymousParameter.TypeUsage.GetDocumentRange().SetEndTo(nameEndOffset);
                return(anonymousParameter);
            }

            return(declaration);
        }
        // Check that invocation immediately under declaration statement as initializer (Parenthesized Expression is allowed)
        private bool IsInvocationInitializer()
        {
            var expression                  = myInvocationExpression.GetContainingParenthesizedExpression();
            var currentInitializer          = ExpressionInitializerNavigator.GetByValue(expression);
            var selectedDeclarator          = LocalVariableDeclarationNavigator.GetByInitial(currentInitializer);
            var multiplyVariableDeclaration = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(selectedDeclarator);

            return(DeclarationStatementNavigator.GetByDeclaration(multiplyVariableDeclaration) != null);
        }
        public static void CreateInefficientMultidimensionalArrayAccessWarning([CanBeNull] IDeclaredElement declaredElement,
                                                                               [NotNull] IVariableDeclaration variableDeclaration, [NotNull]  IDaemonProcess daemonProcess, [NotNull]  DaemonProcessKind kind,
                                                                               [NotNull] IHighlightingConsumer consumer, [NotNull] DocumentRange highlightingRange)
        {
            if (declaredElement == null)
            {
                return;
            }

            var type = variableDeclaration.Type as IArrayType;

            if (type == null)
            {
                return;
            }

            if (type.Rank == 1)
            {
                return;
            }

            IArrayCreationExpression arrayCreationExpression = null;
            IMultipleDeclaration     multipleDeclaration     = null;

            switch (variableDeclaration)
            {
            case IFieldDeclaration fieldDeclaration:
                // perfomance optimization
                if (fieldDeclaration.GetAccessRights() != AccessRights.PRIVATE)
                {
                    return;
                }

                arrayCreationExpression = (fieldDeclaration.Initial as IExpressionInitializer)?.Value as IArrayCreationExpression;
                multipleDeclaration     = MultipleFieldDeclarationNavigator.GetByDeclarator(fieldDeclaration);

                break;

            case ILocalVariableDeclaration localVariableDeclaration:
                var initial = localVariableDeclaration.Initial;
                arrayCreationExpression = (initial as IExpressionInitializer)?.Value as IArrayCreationExpression;

                if (initial != null && arrayCreationExpression == null)
                {
                    return;
                }

                multipleDeclaration =
                    MultipleLocalVariableDeclarationNavigator.GetByDeclarator(localVariableDeclaration);
                break;

            default:
                return;
            }

            var classDeclaration = variableDeclaration.GetContainingNode <IClassLikeDeclaration>();

            if (classDeclaration == null)
            {
                return;
            }

            var usages = FindArrayUsages(declaredElement, classDeclaration, daemonProcess, kind);

            foreach (var usage in usages)
            {
                if (ElementAccessExpressionNavigator.GetByOperand(usage as ICSharpExpression) == null)
                {
                    return;
                }
            }

            if (arrayCreationExpression.ContainsErrorElement())
            {
                return;
            }

            consumer.AddHighlighting(new InefficientMultidimensionalArrayUsageWarning(usages.Select(t => t.CreateTreeElementPointer()).ToList(),
                                                                                      arrayCreationExpression, variableDeclaration, multipleDeclaration, highlightingRange));
        }