public IPostfixLookupItem CreateItem(PostfixTemplateContext context)
        {
            var typeExpression = context.TypeExpression;

            if (typeExpression == null)
            {
                return(CreateExpressionItem(context));
            }

            var typeElement = typeExpression.ReferencedElement as ITypeElement;

            if (typeElement == null)
            {
                return(null);
            }

            if (context.IsAutoCompletion)
            {
                if (!TypeUtils.IsUsefulToCreateWithNew(typeElement))
                {
                    return(null);
                }
            }

            var canInstantiate = TypeUtils.CanInstantiateType(typeElement, typeExpression.Expression);

            if (canInstantiate != CanInstantiate.No)
            {
                var hasParameters = (canInstantiate & CanInstantiate.ConstructorWithParameters) != 0;
                return(new NewTypeItem(typeExpression, hasParameters));
            }

            return(null);
        }
Beispiel #2
0
            protected override void AfterComplete(ITextControl textControl, IThrowStatement statement)
            {
                if (statement.Semicolon != null)
                {
                    FormatStatementOnSemicolon(statement);
                }

                var settingsStore = statement.GetSettingsStore();
                var expression    = (IObjectCreationExpression)statement.Exception;

                var parenthesesType = settingsStore.GetValue(CodeCompletionSettingsAccessor.ParenthesesInsertType);

                if (parenthesesType == ParenthesesInsertType.None)
                {
                    var endOffset = expression.GetDocumentRange().TextRange.EndOffset;
                    textControl.Caret.MoveTo(endOffset, CaretVisualPlacement.DontScrollIfVisible);
                }
                else
                {
                    var canInstantiate       = TypeUtils.CanInstantiateType(statement.Exception.Type(), statement);
                    var hasRequiredArguments = (canInstantiate & CanInstantiate.ConstructorWithParameters) != 0;

                    var caretNode = hasRequiredArguments ? expression.LPar : (statement.Semicolon ?? (ITreeNode)expression);
                    var endOffset = caretNode.GetDocumentRange().TextRange.EndOffset;

                    textControl.Caret.MoveTo(endOffset, CaretVisualPlacement.DontScrollIfVisible);

                    if (hasRequiredArguments && settingsStore.GetValue(PostfixTemplatesSettingsAccessor.InvokeParameterInfo))
                    {
                        var lookupItemsOwner = Info.ExecutionContext.LookupItemsOwner;
                        LookupUtil.ShowParameterInfo(statement.GetSolution(), textControl, lookupItemsOwner);
                    }
                }
            }
Beispiel #3
0
        public PostfixTemplateInfo TryCreateInfo(CSharpPostfixTemplateContext context)
        {
            var typeExpression = context.TypeExpression;

            if (typeExpression == null)
            {
                return(TryCreateExpressionInfo(context));
            }

            var typeElement = typeExpression.ReferencedElement as ITypeElement;

            if (typeElement == null)
            {
                return(null);
            }

            if (context.IsPreciseMode)
            {
                if (!TypeUtils.IsUsefulToCreateWithNew(typeElement))
                {
                    return(null);
                }
            }

            var canInstantiate = TypeUtils.CanInstantiateType(typeElement, typeExpression.Expression);

            if (canInstantiate != CanInstantiate.No)
            {
                return(new PostfixTemplateInfo("new", typeExpression, PostfixTemplateTarget.TypeUsage));
            }

            return(null);
        }
Beispiel #4
0
        private static bool IsInstantiableExceptionType([NotNull] IDeclaredType declaredType, [NotNull] ICSharpExpression context)
        {
            var predefinedType = context.GetPredefinedType();
            var conversionRule = context.GetTypeConversionRule();

            return(conversionRule.IsImplicitlyConvertibleTo(declaredType, predefinedType.Exception) &&
                   TypeUtils.CanInstantiateType(declaredType, context) != CanInstantiate.No);
        }
            public VarByTypeItem([NotNull] PrefixExpressionContext context, [NotNull] IDeclaredType referencedType)
                : base("var", context)
            {
                myReferencedType   = referencedType;
                myLookupItemsOwner = context.PostfixContext.ExecutionContext.LookupItemsOwner;

                var canInstantiate = TypeUtils.CanInstantiateType(referencedType, context.Expression);

                myHasRequiredArguments = (canInstantiate & CanInstantiate.ConstructorWithParameters) != 0;
            }
        private static IPostfixLookupItem CreateExpressionItem([NotNull] PostfixTemplateContext context)
        {
            var expressionContext = context.InnerExpression;

            if (expressionContext == null)
            {
                return(null);
            }

            var invocationExpression = expressionContext.Expression as IInvocationExpression;

            if (invocationExpression != null) // StringBuilder().new
            {
                var reference = invocationExpression.InvokedExpression as IReferenceExpression;
                if (reference != null)
                {
                    var declaredElement = reference.Reference.Resolve().DeclaredElement;

                    if (context.IsAutoCompletion)
                    {
                        var typeElement = declaredElement as ITypeElement;
                        if (typeElement != null && TypeUtils.IsUsefulToCreateWithNew(typeElement))
                        {
                            var canInstantiate = TypeUtils.CanInstantiateType(typeElement, reference);
                            if (canInstantiate != CanInstantiate.No)
                            {
                                return(new NewExpressionItem(expressionContext));
                            }
                        }
                    }
                    else if (declaredElement == null || declaredElement is ITypeElement)
                    {
                        if (CommonUtils.IsReferenceExpressionsChain(reference))
                        {
                            return(new NewExpressionItem(expressionContext));
                        }
                    }
                }
            }
            else if (!context.IsAutoCompletion) // UnresolvedType.new
            {
                var reference = expressionContext.Expression as IReferenceExpression;
                if (reference != null && CommonUtils.IsReferenceExpressionsChain(reference))
                {
                    var declaredElement = reference.Reference.Resolve().DeclaredElement;
                    if (declaredElement == null || declaredElement is ITypeElement)
                    {
                        return(new NewTypeItem(expressionContext, hasRequiredArguments: true));
                    }
                }
            }

            return(null);
        }
Beispiel #7
0
            protected override void AfterComplete(ITextControl textControl, IObjectCreationExpression expression)
            {
                var referencedType = CSharpTypeFactory.CreateDeclaredType(expression.CreatedTypeUsage);

                var canInstantiate = TypeUtils.CanInstantiateType(referencedType, expression);

                if ((canInstantiate & CanInstantiate.ConstructorWithParameters) != 0)
                {
                    var lparRange = expression.LPar.GetDocumentRange();
                    var rparRange = expression.RPar.GetDocumentRange();

                    var documentRange   = lparRange.SetEndTo(rparRange.TextRange.EndOffset);
                    var argumentsMarker = documentRange.CreateRangeMarker();

                    var settingsStore       = expression.GetSettingsStore();
                    var invokeParameterInfo = settingsStore.GetValue(PostfixTemplatesSettingsAccessor.InvokeParameterInfo);

                    var solution = expression.GetSolution();

                    ExecuteRefactoring(textControl, expression, executeAfter: () =>
                    {
                        var argumentsRange = argumentsMarker.Range;
                        if (!argumentsRange.IsValid)
                        {
                            return;
                        }

                        var offset = argumentsRange.StartOffset + argumentsRange.Length / 2; // EWW
                        textControl.Caret.MoveTo(offset, CaretVisualPlacement.DontScrollIfVisible);

                        if (invokeParameterInfo)
                        {
                            var lookupItemsOwner = Info.ExecutionContext.LookupItemsOwner;
                            LookupUtil.ShowParameterInfo(solution, textControl, lookupItemsOwner);
                        }
                    });
                }
                else
                {
                    ExecuteRefactoring(textControl, expression);
                }
            }
        public IPostfixLookupItem CreateItem(PostfixTemplateContext context)
        {
            var expressionContext = context.TypeExpression ?? context.OuterExpression;

            if (expressionContext == null || !expressionContext.CanBeStatement)
            {
                return(null);
            }

            var expression = expressionContext.Expression;

            var referencedType = expressionContext.ReferencedType;

            if (referencedType != null) // 'Exception.throw' case
            {
                if (context.IsAutoCompletion && !IsInstantiableExceptionType(referencedType, expression))
                {
                    return(null);
                }

                var canInstantiate = TypeUtils.CanInstantiateType(referencedType, expression);
                var hasParameters  = (canInstantiate & CanInstantiate.ConstructorWithParameters) != 0;

                return(new ThrowByTypeItem(expressionContext, hasParameters));
            }

            bool needFixWithNew;

            if (CheckExpressionType(expressionContext, out needFixWithNew) || !context.IsAutoCompletion)
            {
                var reference = expressionContext.Expression as IReferenceExpression;
                if (reference != null && CommonUtils.IsReferenceExpressionsChain(reference))
                {
                    return(new ThrowByTypeItem(expressionContext, hasRequiredArguments: true));
                }

                return(new ThrowExpressionItem(expressionContext, needFixWithNew));
            }

            return(null);
        }
        public IPostfixLookupItem CreateItem(PostfixTemplateContext context)
        {
            var contexts = new List <PrefixExpressionContext>();

            foreach (var expressionContext in context.ExpressionsOrTypes)
            {
                var expression = expressionContext.Expression;
                if (expression is IReferenceExpression)
                {
                    // filter out 'too simple' local variable expressions
                    var target = expressionContext.ReferencedElement;
                    if (target is IParameter || target is ILocalVariable)
                    {
                        if (context.IsAutoCompletion)
                        {
                            continue;
                        }
                    }
                }
                else if (expression is IAssignmentExpression)
                {
                    if (context.IsAutoCompletion)
                    {
                        continue;
                    }
                }

                if (expressionContext.Type.IsVoid())
                {
                    continue;
                }

                var referencedType = expressionContext.ReferencedType;
                if (referencedType != null)
                {
                    if (context.IsAutoCompletion)
                    {
                        if (TypeUtils.CanInstantiateType(referencedType, expression) == 0)
                        {
                            break;
                        }
                        if (!TypeUtils.IsUsefulToCreateWithNew(referencedType.GetTypeElement()))
                        {
                            break;
                        }
                    }

                    contexts.Add(expressionContext);
                    break; // prevent from 'expr == T.var' => 'var t = expr == T;'
                }

                contexts.Add(expressionContext);
            }

            var bestContext = contexts.FirstOrDefault(MattersToShowVar) ?? contexts.LastOrDefault();

            if (bestContext == null)
            {
                return(null);
            }

            if (MattersToShowVar(bestContext) || !context.IsAutoCompletion)
            {
                var referencedType = bestContext.ReferencedType;
                if (referencedType != null)
                {
                    return(new VarByTypeItem(bestContext, referencedType));
                }

                var isConstructorCall = IsConstructorInvocation(bestContext.Expression);

                if (bestContext.CanBeStatement)
                {
                    return(new VarStatementItem(bestContext, isConstructorCall));
                }

                return(new VarExpressionItem(bestContext, isConstructorCall));
            }

            return(null);
        }
Beispiel #10
0
        public PostfixTemplateInfo TryCreateInfo(CSharpPostfixTemplateContext context)
        {
            var contexts = new List <CSharpPostfixExpressionContext>();

            foreach (CSharpPostfixExpressionContext expressionContext in context.AllExpressions)
            {
                var expression = expressionContext.Expression;
                if (expression is IReferenceExpression)
                {
                    // filter out 'too simple' local variable expressions
                    var target = expressionContext.ReferencedElement;
                    if (target is IParameter || target is ILocalVariable)
                    {
                        if (context.IsPreciseMode)
                        {
                            continue;
                        }
                    }
                }
                else if (expression is IAssignmentExpression)
                {
                    if (context.IsPreciseMode)
                    {
                        continue;
                    }
                }

                if (expressionContext.Type.IsVoid())
                {
                    continue;
                }

                var referencedType = expressionContext.ReferencedType;
                if (referencedType != null)
                {
                    if (context.IsPreciseMode)
                    {
                        if (TypeUtils.CanInstantiateType(referencedType, expression) == 0)
                        {
                            break;
                        }
                        if (!TypeUtils.IsUsefulToCreateWithNew(referencedType.GetTypeElement()))
                        {
                            break;
                        }
                    }

                    contexts.Add(expressionContext);
                    break; // prevent from 'expr == T.var' => 'var t = expr == T;'
                }

                contexts.Add(expressionContext);
            }

            var bestContext = contexts.FirstOrDefault(IsItMattersToShowVar) ?? contexts.LastOrDefault();

            if (bestContext != null)
            {
                if (IsItMattersToShowVar(bestContext) || !context.IsPreciseMode)
                {
                    var referencedType = bestContext.ReferencedType;
                    if (referencedType != null)
                    {
                        return(new PostfixTemplateInfo("var", bestContext, target: PostfixTemplateTarget.TypeUsage));
                    }

                    if (bestContext.CanBeStatement)
                    {
                        return(new PostfixTemplateInfo("var", bestContext, target: PostfixTemplateTarget.Statement));
                    }

                    return(new PostfixTemplateInfo("var", bestContext));
                }
            }

            return(null);
        }
Beispiel #11
0
        private static PostfixTemplateInfo TryCreateExpressionInfo([NotNull] CSharpPostfixTemplateContext context)
        {
            var expressionContext = context.InnerExpression;

            if (expressionContext == null)
            {
                return(null);
            }

            var invocationExpression = expressionContext.Expression as IInvocationExpression;

            if (invocationExpression != null)
            {
                var reference = invocationExpression.InvokedExpression as IReferenceExpression;
                if (reference != null)
                {
                    var resolveResult   = reference.Reference.Resolve();
                    var declaredElement = resolveResult.DeclaredElement;

                    if (context.IsPreciseMode)
                    {
                        var typeElement = declaredElement as ITypeElement;
                        if (typeElement != null && TypeUtils.IsUsefulToCreateWithNew(typeElement))
                        {
                            var canInstantiate = TypeUtils.CanInstantiateType(typeElement, reference);
                            if (canInstantiate != CanInstantiate.No)
                            {
                                return(new PostfixTemplateInfo("new", expressionContext));
                            }
                        }
                    }
                    else if (declaredElement == null || declaredElement is ITypeElement)
                    {
                        if (CSharpPostfixUtis.IsReferenceExpressionsChain(reference))
                        {
                            return(new PostfixTemplateInfo("new", expressionContext));
                        }
                    }
                }

                return(null);
            }

            if (!context.IsPreciseMode) // UnresolvedType.new
            {
                var reference = expressionContext.Expression as IReferenceExpression;
                if (reference != null && CSharpPostfixUtis.IsReferenceExpressionsChain(reference))
                {
                    var resolveResult = reference.Reference.Resolve();

                    var declaredElement = resolveResult.DeclaredElement;
                    if (declaredElement == null || declaredElement is ITypeElement)
                    {
                        // hasRequiredArguments: true
                        return(new PostfixTemplateInfo("new", expressionContext, PostfixTemplateTarget.TypeUsage));
                    }
                }
            }

            return(null);
        }