private static bool MattersToShowVar([NotNull] PrefixExpressionContext context)
        {
            if (context.CanBeStatement)
            {
                return(true);
            }

            var withReference = context.ExpressionWithReference;

            if (withReference != null)
            {
                // return SomeLong().var.Expression;
                var outerReference = ReferenceExpressionNavigator.GetByQualifierExpression(withReference);
                if (outerReference != null)
                {
                    return(true);
                }

                // SomeCall(withComplex.Arguments().var, 42);
                var argument = CSharpArgumentNavigator.GetByValue(withReference);
                if (argument != null)
                {
                    return(true);
                }
            }

            // note: what about F(arg.var)?

            return(false);
        }
Exemplo n.º 2
0
        private static void FixQualifierExpression([NotNull] ITextControl textControl, [NotNull] ICSharpExpression expression, [NotNull] ITypeElement ownerType)
        {
            var qualifierRange = expression.GetDocumentRange().TextRange;

            var comparer = DeclaredElementEqualityComparer.TypeElementComparer;

            // do not produce type qualifier when static method from containing type completed
            var typeDeclaration = expression.GetContainingTypeDeclaration();

            if (typeDeclaration != null && comparer.Equals(typeDeclaration.DeclaredElement, ownerType))
            {
                var reference = ReferenceExpressionNavigator.GetByQualifierExpression(expression).NotNull("reference != null");

                var delimiter = reference.Delimiter;
                if (delimiter != null)
                {
                    qualifierRange = qualifierRange.JoinRight(delimiter.GetDocumentRange().TextRange);
                }

                textControl.Document.ReplaceText(qualifierRange, string.Empty);
            }
            else
            {
                var keyword = CSharpTypeFactory.GetTypeKeyword(ownerType.GetClrName());
                textControl.Document.ReplaceText(qualifierRange, keyword ?? "T");
            }
        }
        private static bool IsAssignDestination(IReferenceExpression expr)
        {
            var fullReference = ReferenceExpressionNavigator.GetTopByQualifierExpression(expr);
            var assignment    = AssignmentExpressionNavigator.GetByDest(fullReference.GetContainingParenthesizedExpression());

            return(ExpressionStatementNavigator.GetByExpression(assignment) != null);
        }
        public override ICSharpExpression GetOuterExpression(ICSharpExpression expression)
        {
            var reference = ReferenceExpressionNavigator.GetByQualifierExpression(expression);

            if (reference != null && reference == Reference)
            {
                return(reference);
            }

            return(base.GetOuterExpression(expression));
        }
        public static Func <CallHierarchyFindResult, bool> GetSimpleFilter(
            ISolution solution,
            ICallGraphContextProvider provider,
            ShowCallsType type)
        {
            switch (type)
            {
            case ShowCallsType.INCOMING:
            {
                return(result =>
                    {
                        solution.Locks.AssertReadAccessAllowed();

                        var referenceElement = result.ReferenceElement;
                        var csharpTreeNode = referenceElement as ICSharpTreeNode;
                        var containing = csharpTreeNode?.GetContainingFunctionLikeDeclarationOrClosure();
                        var declaredElement = containing?.DeclaredElement;

                        return provider.IsMarkedGlobal(declaredElement);
                    });
            }

            case ShowCallsType.OUTGOING:
            {
                return(result =>
                    {
                        solution.Locks.AssertReadAccessAllowed();

                        var referenceElement = result.ReferenceElement;
                        var identifier = referenceElement as ICSharpIdentifier;
                        var referenceExpression = ReferenceExpressionNavigator.GetByNameIdentifier(identifier);
                        var declaredElement = referenceExpression?.Reference.Resolve().DeclaredElement;

                        if (declaredElement == null)
                        {
                            var referenceName = referenceElement as IReferenceName;
                            var objectCreationExpression = ObjectCreationExpressionNavigator.GetByTypeName(referenceName);

                            declaredElement = objectCreationExpression?.Reference?.Resolve().DeclaredElement;
                        }

                        return provider.IsMarkedGlobal(declaredElement);
                    });
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }
        }
        protected override void Analyze(IInvocationExpression expression, ElementProblemAnalyzerData data, IHighlightingConsumer consumer)
        {
            var reference = (expression.InvokedExpression as IReferenceExpression)?.Reference;

            if (reference == null)
            {
                return;
            }

            var info = reference.Resolve();

            if (info.ResolveErrorType != ResolveErrorType.OK)
            {
                return;
            }

            var method = info.DeclaredElement as IMethod;

            if (method == null)
            {
                return;
            }

            if (!method.ShortName.Equals(ourKnownMethod))
            {
                return;
            }

            if (method.GetContainingType()?.GetClrName().Equals(KnownTypes.Object) != true)
            {
                return;
            }


            var parameters = method.Parameters;

            if (parameters.Count != 1)
            {
                return;
            }

            var scope = expression.GetContainingFunctionLikeDeclarationOrClosure().GetCodeBody().GetAnyTreeNode();

            if (scope == null)
            {
                return;
            }

            IEnumerable <ITreeNode> usages = null;
            ITreeNode storage = null;
            var       containingParenthesizedExpression = expression.GetContainingParenthesizedExpression();
            var       castExpression = CastExpressionNavigator.GetByOp(containingParenthesizedExpression);
            var       asExpression   = AsExpressionNavigator.GetByOperand(containingParenthesizedExpression);
            var       initializer    = ExpressionInitializerNavigator.GetByValue(castExpression ?? asExpression ?? containingParenthesizedExpression);
            var       declaration    = LocalVariableDeclarationNavigator.GetByInitial(initializer);


            var usageProvider = data.GetUsagesProvider();

            if (declaration != null)
            {
                usages  = usageProvider.GetUsages(declaration.DeclaredElement, scope).Where(t => t is IReferenceExpression);
                storage = declaration;
            }
            else
            {
                var assignment = AssignmentExpressionNavigator.GetBySource(castExpression ?? asExpression ?? containingParenthesizedExpression);
                var dest       = assignment?.Dest as IReferenceExpression;
                var destInfo   = dest?.Reference.Resolve();
                if (destInfo != null && destInfo.ResolveErrorType == ResolveErrorType.OK)
                {
                    usages  = usageProvider.GetUsages(destInfo.DeclaredElement.NotNull(), scope).Where(t => IsSameReferenceUsed(t, dest));
                    storage = dest;
                }
                else
                {
                    return;
                }
            }

            foreach (var usage in usages)
            {
                if (usage is IReferenceExpression referenceExpression)
                {
                    var fullReferenceExpression = ReferenceExpressionNavigator.GetTopByQualifierExpression(referenceExpression);
                    if (IsUsageSetTransformParent(fullReferenceExpression, out var stayInWorldCoords, out var transform))
                    {
                        if (!InSameBlock(fullReferenceExpression, storage))
                        {
                            return;
                        }
                        var finder             = new TransformParentRelatedReferenceFinder(referenceExpression);
                        var relatedExpressions = finder.GetRelatedExpressions(scope, expression).FirstOrDefault();
                        if (relatedExpressions == null || relatedExpressions.GetTreeStartOffset() >= fullReferenceExpression.GetTreeStartOffset())
                        {
                            consumer.AddHighlighting(new InstantiateWithoutParentWarning(fullReferenceExpression, expression, transform, stayInWorldCoords));
                        }
                        return;
                    }
                }
            }
        }