Ejemplo n.º 1
0
        public PostfixTemplateInfo TryCreateInfo(CSharpPostfixTemplateContext 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.IsPreciseMode && !IsInstantiableExceptionType(referencedType, expression))
                {
                    return(null);
                }

                return(new PostfixTemplateInfo("throw", expressionContext, target: PostfixTemplateTarget.TypeUsage));
            }

            bool needFixWithNew;

            if (CheckExpressionType(expressionContext, out needFixWithNew) || !context.IsPreciseMode)
            {
                var reference = expressionContext.Expression as IReferenceExpression;
                if (reference != null && CSharpPostfixUtis.IsReferenceExpressionsChain(reference))
                {
                    return(new PostfixTemplateInfo("throw", expressionContext, target: PostfixTemplateTarget.TypeUsage));
                }

                var info = new PostfixTemplateInfo("throw", expressionContext);
                if (needFixWithNew)
                {
                    info.PutData(NeedFixWithNewKey, info);
                }
                return(info);
            }

            return(null);
        }
Ejemplo n.º 2
0
        private static bool CheckExpressionType([NotNull] CSharpPostfixExpressionContext expressionContext, out bool needFixWithNew)
        {
            needFixWithNew = false;

            // 'new Exception().throw' case
            var expressionType = expressionContext.ExpressionType;

            if (expressionType.IsResolved)
            {
                var predefinedType = expressionContext.Expression.GetPredefinedType();
                var conversionRule = expressionContext.Expression.GetTypeConversionRule();
                return(expressionType.IsImplicitlyConvertibleTo(predefinedType.Exception, conversionRule));
            }

            // 'Exception(message).new' case
            var invocationExpression = expressionContext.Expression as IInvocationExpression;

            if (invocationExpression != null)
            {
                var reference = invocationExpression.InvokedExpression as IReferenceExpression;
                if (reference == null || !CSharpPostfixUtis.IsReferenceExpressionsChain(reference))
                {
                    return(false);
                }

                var resolveResult = reference.Reference.Resolve().Result;
                var typeElement   = resolveResult.DeclaredElement as ITypeElement;
                if (typeElement == null)
                {
                    return(false);
                }

                var declaredType = TypeFactory.CreateType(typeElement, resolveResult.Substitution);
                if (IsInstantiableExceptionType(declaredType, expressionContext.Expression))
                {
                    needFixWithNew = true;
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 3
0
        private static bool IsConstructorInvocation([NotNull] ICSharpExpression expression)
        {
            // check for expressions like 'StringBuilder().new'
            var invocationExpression = expression as IInvocationExpression;

            if (invocationExpression == null)
            {
                return(false);
            }

            var reference = invocationExpression.InvokedExpression as IReferenceExpression;

            if (reference != null && CSharpPostfixUtis.IsReferenceExpressionsChain(reference))
            {
                var resolveResult = reference.Reference.Resolve().Result;
                return(resolveResult.DeclaredElement is ITypeElement);
            }

            return(false);
        }
Ejemplo n.º 4
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);
        }