Example #1
0
        public static IEnumerable <ExpressionSyntax> GetNonNewObjectReturnsForMethod(
            BaseMethodDeclarationSyntax methodDeclaration,
            SemanticModel semanticModel,
            KnownSymbols knownSymbols, RecursiveState recursiveState1)
        {
            var methodSymbol = semanticModel.GetDeclaredSymbol(methodDeclaration);

            if (!methodSymbol.ReturnsByRef && IsCompleteValueType(methodSymbol.ReturnType))
            {
                yield break;
            }

            var returnExpressions =
                methodDeclaration.Body != null
                    ? methodDeclaration.Body
                .DescendantNodes()
                .OfType <ReturnStatementSyntax>()
                .Select(x => x.Expression)
                .ToArray()
                    : new[] { methodDeclaration.ExpressionBody.Expression };

            foreach (var expression in returnExpressions)
            {
                if (!Utils.IsNewlyCreatedObject(semanticModel, expression, knownSymbols, RecursiveIsNewlyCreatedObjectState.Empty(), recursiveState1))
                {
                    yield return(expression);
                }
            }
        }
Example #2
0
        public static bool IsAccessOnNewlyCreatedObject(KnownSymbols knownSymbols,
                                                        SemanticModel semanticModel,
                                                        SyntaxNode node, RecursiveState recursiveState1)
        {
            bool IsOnNewlyCreatedObject(ExpressionSyntax exp)
            {
                if (exp is MemberAccessExpressionSyntax memberAccess1)
                {
                    return(IsOnNewlyCreatedObject(memberAccess1.Expression));
                }
                if (exp is ElementAccessExpressionSyntax elementAccess1)
                {
                    return(IsOnNewlyCreatedObject(elementAccess1.Expression));
                }
                return(Utils.IsNewlyCreatedObject(semanticModel, exp, knownSymbols, RecursiveIsNewlyCreatedObjectState.Empty(), recursiveState1));
            }

            if (node.Parent is MemberAccessExpressionSyntax memberAccess)
            {
                return(IsOnNewlyCreatedObject(memberAccess));
            }

            if (node is ElementAccessExpressionSyntax elementAccess)
            {
                return(IsOnNewlyCreatedObject(elementAccess));
            }

            return(false);
        }
        private void WsOnMessage(object sender, MessageEventArgs args)
        {
            try
            {
                var json = args.Data;
                var data = JsonConvert.DeserializeObject <dynamic> (json);

                foreach (var datum in data)
                {
                    var s      = (string)datum.s;
                    var symbol = s.Substring(0, 3);
                    if (!s.EndsWith("USDT"))
                    {
                        continue;
                    }
                    if (symbol == "BCC")
                    {
                        symbol = "BCH";
                    }
                    if (!KnownSymbols.Contains(symbol))
                    {
                        continue;
                    }
                    Update(datum, symbol);
                }
            }
            catch (Exception e)
            {
                Logger.Error(e);
            }
        }
Example #4
0
        private void SetTextAndFontFamily(SymbolIconTag tag)
        {
            switch (tag.SymbolType)
            {
            case SymbolType.Glyph:
                if (!string.IsNullOrWhiteSpace(tag.FontFamily))
                {
                    this.FontFamily = new System.Windows.Media.FontFamily(tag.FontFamily);
                }
                else
                {
                    this.FontFamily = new System.Windows.Media.FontFamily("Segoe MDL2 Assets");
                }

                this.Text = this.GetUnicode(tag.SymbolName) ?? string.Empty;

                break;

            case SymbolType.Symbol:
                this.FontFamily = new System.Windows.Media.FontFamily("Segoe MDL2 Assets");
                this.Text       = KnownSymbols.ContainsKey(tag.SymbolName) ? KnownSymbols[tag.SymbolName] : string.Empty;
                break;

            case SymbolType.FontAwesome:
                this.FontFamily = new System.Windows.Media.FontFamily($"file:///{System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}/SymbolVisualizer/FontAwesome.otf#FontAwesome");

                this.Text = KnownFontAwesomeIcons.ContainsKey(tag.SymbolName) ? KnownFontAwesomeIcons[tag.SymbolName] : string.Empty;
                break;

            default:
                System.Diagnostics.Debugger.Break();
                break;
            }
        }
Example #5
0
 public static bool ReturnsNewObject(PropertyDeclarationSyntax propertyDeclaration,
                                     SemanticModel semanticModel,
                                     KnownSymbols knownSymbols,
                                     RecursiveState recursiveState1)
 {
     return(!GetNonNewObjectReturnsForPropertyGet(propertyDeclaration, semanticModel, knownSymbols, recursiveState1).Any());
 }
        private static async Task ConnectAndSubscribe(WebSocket ws, CancellationToken ct)
        {
            await Task.Run(() => ws.Connect( ), ct);

            var productIds = string.Join(",", KnownSymbols.Select(x => $"\"{x}-USD\""));
            await ws.SendStringAsync(
                $"{{\"type\":\"subscribe\",\"product_ids\":[{productIds}],\"channels\":[\"ticker\"]}}");
        }
Example #7
0
        public static IEnumerable <Impurity> GetImpurities(
            SyntaxNode methodDeclaration,
            SemanticModel semanticModel,
            KnownSymbols knownSymbols,
            RecursiveState recursiveState,
            PurityType purityType = PurityType.Pure,
            Maybe <PureLambdaConfig> pureLambdaConfig = default)
        {
            var impuritiesFinder = new ImpuritiesFinder(semanticModel, purityType, knownSymbols);

            return(impuritiesFinder.GetImpurities(methodDeclaration, recursiveState, pureLambdaConfig));
        }
Example #8
0
        private static bool MethodReturnsNewObject(
            SemanticModel semanticModel,
            KnownSymbols knownSymbols,
            RecursiveState recursiveState,
            IMethodSymbol invokedMethod)
        {
            if (invokedMethod.IsInCode() && !invokedMethod.IsAbstract)
            {
                var location = invokedMethod.Locations.First();

                var locationSourceTree = location.SourceTree;

                var node = locationSourceTree.GetRoot().FindNode(location.SourceSpan);

                if (node is BaseMethodDeclarationSyntax methodNode)
                {
                    if (ReturnsNewObject(
                            methodNode,
                            Utils.GetSemanticModel(semanticModel, methodNode.SyntaxTree),
                            knownSymbols, recursiveState))
                    {
                        return(true);
                    }
                }
                else if (node.Parent.Parent is PropertyDeclarationSyntax propertyDeclaration)
                {
                    if (ReturnsNewObject(
                            propertyDeclaration,
                            Utils.GetSemanticModel(semanticModel, propertyDeclaration.SyntaxTree),
                            knownSymbols, recursiveState))
                    {
                        return(true);
                    }
                }
            }
            else
            {
                if (GetAllAttributes(invokedMethod)
                    .Any(x => IsReturnsNewObjectAttribute(x.AttributeClass.Name)))
                {
                    return(true);
                }

                if (knownSymbols.KnownReturnsNewObjectMethods.TryGetValue(
                        Utils.GetFullMetaDataName(invokedMethod.ContainingType), out var methods) &&
                    methods.AnyMatches(invokedMethod))
                {
                    return(true);
                }
            }

            return(false);
        }
Example #9
0
        ChangeAcceptedPurityTypeBasedOnWhetherExpressionRepresentsANewObjectOrParameterBasedExpression(
            PurityType currentAcceptedPurityType,
            ExpressionSyntax node,
            KnownSymbols knownSymbols,
            SemanticModel semanticModel,
            RecursiveState recursiveState)
        {
            if (Utils.IsNewlyCreatedObject(semanticModel, node, knownSymbols, RecursiveIsNewlyCreatedObjectState.Empty(), recursiveState))
            {
                return(PurityType.PureExceptLocally);
            }
            else if (ImpuritiesFinder.IsParameter(semanticModel, node))
            {
                return(PurityType.PureExceptReadLocally);
            }

            return(currentAcceptedPurityType);
        }
        public override async Task GetExchangeData(CancellationToken ct)
        {
            ExchangeData = new Dictionary <string, CryptoCoin> ( );

            while (!ct.IsCancellationRequested)
            {
                var data = await TickerUrl.GetJsonAsync <List <CoinDeltaCoin> > (ct);

                foreach (var datum in data)
                {
                    var marketname = datum.MarketName.Split('-');
                    if (marketname[1] == "inr" && KnownSymbols.Contains(marketname[0].ToUpper( )))
                    {
                        Update(datum, marketname[0].ToUpper( ));
                    }
                }

                await Task.Delay(60000, ct);
            }
        }
Example #11
0
        public static bool AnyImpurePropertyInitializer(TypeDeclarationSyntax typeDeclaration,
                                                        SemanticModel semanticModel,
                                                        KnownSymbols knownSymbols,
                                                        RecursiveState recursiveState,
                                                        InstanceStaticCombination instanceStaticCombination)
        {
            var props = typeDeclaration
                        .Members
                        .OfType <PropertyDeclarationSyntax>()
                        .Where(instanceStaticCombination.Matches)
                        .ToArray();

            foreach (var var in props.Select(x => x.Initializer).Where(i => i != null))
            {
                if (Utils.GetImpurities(var, semanticModel, knownSymbols, recursiveState).Any())
                {
                    return(true);
                }
            }

            return(false);
        }
Example #12
0
        public static bool AnyImpureFieldInitializer(
            TypeDeclarationSyntax typeDeclaration,
            SemanticModel semanticModel,
            KnownSymbols knownSymbols,
            RecursiveState recursiveState,
            InstanceStaticCombination instanceStaticCombination)
        {
            var fields =
                typeDeclaration.Members
                .OfType <FieldDeclarationSyntax>()
                .Where(instanceStaticCombination.Matches)
                .ToArray();

            foreach (var var in fields.SelectMany(x => x.Declaration.Variables))
            {
                if (Utils.GetImpurities(var, semanticModel, knownSymbols, recursiveState).Any())
                {
                    return(true);
                }
            }

            return(false);
        }
        public static bool DoesMethodUseTAsObject_IncludingStaticConstructorsIfRelevant(
            IMethodSymbol method,
            SemanticModel semanticModel,
            ITypeParameterSymbol typeParameter,
            IMethodSymbol[] relevantObjectMethods,
            KnownSymbols knownSymbols,
            RecursiveStateForNotUsedAsObject recursiveStateForNotUsedAsObject)
        {
            IEnumerable <INamedTypeSymbol> GetAllContainingTypes()
            {
                var containingType = method.ContainingType;

                while (containingType != null)
                {
                    yield return(containingType);

                    containingType = containingType.ContainingType;
                }
            }

            if (method.IsStatic || method.MethodKind == MethodKind.Constructor)
            {
                var containingTypes = GetAllContainingTypes().ToList();

                var staticConstructors = containingTypes.SelectMany(x => x.StaticConstructors).ToList();

                if (staticConstructors
                    .Any(c =>
                         DoesMethodUseTAsObject(c, semanticModel, typeParameter, relevantObjectMethods, knownSymbols, recursiveStateForNotUsedAsObject)))
                {
                    return(true);
                }
            }

            return(DoesMethodUseTAsObject(method, semanticModel, typeParameter, relevantObjectMethods, knownSymbols, recursiveStateForNotUsedAsObject));
        }
Example #14
0
        public NullCheckScanner([NotNull] Compilation compilation)
        {
            Guard.NotNull(compilation, nameof(compilation));

            knownSymbols = new KnownSymbols(compilation);
        }
        public static bool DoesMethodUseTAsObject(IMethodSymbol method, SemanticModel semanticModel,
                                                  ITypeParameterSymbol typeParameter, IMethodSymbol[] relevantObjectMethods, KnownSymbols knownSymbols,
                                                  RecursiveStateForNotUsedAsObject recursiveStateForNotUsedAsObject)
        {
            if (recursiveStateForNotUsedAsObject.ItemsInStack.Contains((method, typeParameter)))
            {
                return(false);
            }

            recursiveStateForNotUsedAsObject = recursiveStateForNotUsedAsObject.Add(method, typeParameter);

            if (typeParameter.GetAttributes().Any(x => Utils.IsNotUsedAsObjectAttribute(x.AttributeClass.Name)))
            {
                return(false);
            }

            if (method.GetAttributes().Any(x =>
                                           Utils.IsDoesNotUseClassTypeParameterAsObjectAttributeForTypeParameter(x, typeParameter.Name)))
            {
                return(false);
            }

            if (method.IsInCode())
            {
                var location = method.Locations.First();

                var locationSourceTree = location.SourceTree;

                var methodSyntax = locationSourceTree.GetRoot().FindNode(location.SourceSpan);

                return(GetNodesWhereTIsUsedAsObject(methodSyntax, semanticModel, relevantObjectMethods, typeParameter,
                                                    knownSymbols, recursiveStateForNotUsedAsObject).Any());
            }

            if (typeParameter.DeclaringMethod != null)
            {
                if (knownSymbols.KnownNotUsedAsObjectMethodTypeParameters.TryGetValue(
                        Utils.GetFullMetaDataName(typeParameter.DeclaringMethod.ContainingType),
                        out var methods) &&
                    methods.Keys.FirstOrNoValue(x => x.Matches(typeParameter.DeclaringMethod))
                    .HasValueAnd(x => methods[x].Contains(typeParameter.Name)))
                {
                    return(false);
                }
            }
            else
            {
                if (knownSymbols.KnownNotUsedAsObjectClassTypeParameters.TryGetValue(
                        Utils.GetFullMetaDataName(typeParameter.DeclaringType),
                        out var methods) &&
                    methods.Contains(typeParameter.Name))
                {
                    return(false);
                }
            }

            return(true);
        }
        public static IEnumerable <SyntaxNode> GetNodesWhereTIsUsedAsObject(SyntaxNode scope,
                                                                            SemanticModel semanticModel,
                                                                            IMethodSymbol[] relevantObjectMethods,
                                                                            ITypeParameterSymbol typeParameterSymbol,
                                                                            KnownSymbols knownSymbols,
                                                                            RecursiveStateForNotUsedAsObject recursiveStateForNotUsedAsObject)
        {
            var objectType = semanticModel.Compilation.ObjectType;

            var invocationOperations = scope.DescendantNodes()
                                       .OfType <InvocationExpressionSyntax>()
                                       .Select(x => semanticModel.GetOperation(x))
                                       .OfType <IInvocationOperation>()
                                       .Where(x => x.TargetMethod.ContainingType.TypeKind != TypeKind.Delegate)
                                       .ToList();

            var invocationsOfObjectMethodsOnExpressionsOfTypeT =
                invocationOperations
                .Where(x => x.Instance?.Type.Equals(typeParameterSymbol) ?? false)
                .Where(x => relevantObjectMethods.Contains(x.TargetMethod))
                .ToList();

            foreach (var inv in invocationsOfObjectMethodsOnExpressionsOfTypeT)
            {
                yield return(inv.Syntax);
            }

            var conversions =
                Utils.GetConversions(scope, semanticModel);


            var conversionsFromTToObject =
                conversions.Where(x => [email protected](typeParameterSymbol) &&
                                  x.to.Equals(objectType))
                .Select(x => x.node)
                .ToList();

            foreach (var conv in conversionsFromTToObject)
            {
                yield return(conv);
            }



            var constructionOperations =
                scope.DescendantNodes()
                .OfType <ObjectCreationExpressionSyntax>()
                .Select(x => semanticModel.GetOperation(x))
                .OfType <IObjectCreationOperation>()
                .Where(x => x.Constructor.ContainingType.TypeKind != TypeKind.Delegate)
                .ToList();



            var invokedMethodsAndConstructorsWithRelevantTypeParameters =
                invocationOperations
                .Select(x => (Method: x.TargetMethod, x.Syntax))
                .Concat(constructionOperations.Select(x => (Method: x.Constructor, x.Syntax)))
                .Select(x => (
                            node: x.Syntax,
                            method: x.Method,
                            typeParamsAndArgs:
                            GetTypeParametersAndMatchingArguments(x.Method)
                            .Where(p =>
                                   p.argument.Equals(typeParameterSymbol)).ToList()))
                .ToList();

            foreach (var invokedMethodOrConstructor in invokedMethodsAndConstructorsWithRelevantTypeParameters)
            {
                foreach (var tp in invokedMethodOrConstructor.typeParamsAndArgs)
                {
                    if (DoesMethodUseTAsObject_IncludingStaticConstructorsIfRelevant(
                            invokedMethodOrConstructor.method,
                            semanticModel,
                            tp.typeParameter,
                            relevantObjectMethods,
                            knownSymbols,
                            recursiveStateForNotUsedAsObject))
                    {
                        yield return(invokedMethodOrConstructor.node);

                        break;
                    }
                }
            }
        }
Example #17
0
        public static IEnumerable <ExpressionSyntax> GetNonNewObjectReturnsForPropertyGet(
            PropertyDeclarationSyntax propertyDeclaration,
            SemanticModel semanticModel,
            KnownSymbols knownSymbols,
            RecursiveState recursiveState1)
        {
            var propertySymbol = semanticModel.GetDeclaredSymbol(propertyDeclaration);

            if (propertySymbol.GetMethod == null)
            {
                yield break;
            }

            if (!propertySymbol.ReturnsByRef && IsCompleteValueType(propertySymbol.Type))
            {
                yield break;
            }

            List <ExpressionSyntax> returnExpressions;

            if (propertyDeclaration.AccessorList != null)
            {
                var getAccessor =
                    propertyDeclaration.AccessorList.Accessors.FirstOrNoValue(x =>
                                                                              x.Keyword.Kind() == SyntaxKind.GetKeyword);

                if (getAccessor.HasNoValue)
                {
                    yield break;
                }

                var getAccessorValue = getAccessor.GetValue();

                returnExpressions =
                    getAccessorValue.ExpressionBody != null
                        ? new List <ExpressionSyntax>()
                {
                    getAccessorValue.ExpressionBody.Expression
                }
                        : getAccessor.GetValue()
                .DescendantNodes()
                .OfType <ReturnStatementSyntax>()
                .Select(x => x.Expression)
                .ToList();
            }
            else if (propertyDeclaration.ExpressionBody != null)
            {
                returnExpressions = new List <ExpressionSyntax>()
                {
                    propertyDeclaration.ExpressionBody.Expression
                };
            }
            else
            {
                yield break;
            }

            foreach (var expression in returnExpressions)
            {
                if (!Utils.IsNewlyCreatedObject(semanticModel, expression, knownSymbols, RecursiveIsNewlyCreatedObjectState.Empty(), recursiveState1))
                {
                    yield return(expression);
                }
            }
        }
Example #18
0
 public static bool ReturnsNewObject(BaseMethodDeclarationSyntax methodDeclaration,
                                     SemanticModel semanticModel,
                                     KnownSymbols knownSymbols, RecursiveState recursiveState1)
 {
     return(!GetNonNewObjectReturnsForMethod(methodDeclaration, semanticModel, knownSymbols, recursiveState1).Any());
 }
Example #19
0
        public static List <ExpressionSyntax> GetValuesPossiblyInjectedInto(SemanticModel semanticModel,
                                                                            ILocalSymbol variable,
                                                                            SyntaxNode containingBlockNode, KnownSymbols knownSymbols, RecursiveState recursiveState)
        {
            var usages = containingBlockNode
                         .DescendantNodes()
                         .OfType <IdentifierNameSyntax>()
                         .Where(x => x.Identifier.Text == variable.Name)
                         .Where(x => semanticModel.GetSymbolInfo(x).Symbol?.Equals(variable) ?? false)
                         .Select(x => x.Parent)
                         .ToList();

            List <ExpressionSyntax> result = new List <ExpressionSyntax>();

            void HandleMemberAccess(MemberAccessExpressionSyntax usage)
            {
                if (usage.Parent is AssignmentExpressionSyntax assignment)
                {
                    result.Add(assignment.Right);
                }
                else if (usage.Parent is InvocationExpressionSyntax invocation)
                {
                    if (semanticModel.GetSymbolInfo(invocation.Expression).Symbol is IMethodSymbol invokedMethod)
                    {
                        var purityType = ImpuritiesFinder.GetMethodPurityType(semanticModel, knownSymbols,
                                                                              invokedMethod, recursiveState);

                        if (purityType.HasValueAnd(x => x.Equals(PurityType.PureExceptLocally)))
                        {
                            result.AddRange(invocation.ArgumentList.Arguments.Select(x => x.Expression));
                        }
                    }
                }
                else if (usage.Parent is MemberAccessExpressionSyntax memberAccess)
                {
                    HandleMemberAccess(memberAccess);
                }
            }

            foreach (var usage in usages)
            {
                if (usage is MemberAccessExpressionSyntax memberAccess)
                {
                    HandleMemberAccess(memberAccess);
                }
                else if (usage is ElementAccessExpressionSyntax elementAccess)
                {
                    if (elementAccess.Parent is AssignmentExpressionSyntax assignment)
                    {
                        result.Add(assignment.Right);
                    }
                }
            }

            return(result);
        }
Example #20
0
        public static bool IsNewlyCreatedObject(SemanticModel semanticModel,
                                                SyntaxNode expression,
                                                KnownSymbols knownSymbols,
                                                RecursiveIsNewlyCreatedObjectState recursiveState, RecursiveState recursiveState1)
        {
            if (expression is LiteralExpressionSyntax)
            {
                return(true);
            }

            if (expression is TupleExpressionSyntax tuple)
            {
                return(tuple.Arguments
                       .Select(x => x.Expression)
                       .All(x => IsNewlyCreatedObject(semanticModel, x, knownSymbols, recursiveState, recursiveState1)));
            }


            if (expression is ObjectCreationExpressionSyntax objectCreationExpression)
            {
                if (objectCreationExpression
                    .ArgumentList != null)
                {
                    if (objectCreationExpression
                        .ArgumentList
                        .Arguments.Any(arg =>
                                       !IsNewlyCreatedObject(semanticModel, arg.Expression, knownSymbols, recursiveState, recursiveState1)))
                    {
                        return(false);
                    }
                }


                if (objectCreationExpression.Initializer != null)
                {
                    if (objectCreationExpression
                        .Initializer
                        .Expressions
                        .OfType <AssignmentExpressionSyntax>()
                        .Any(x =>
                             !IsNewlyCreatedObject(semanticModel, x.Right, knownSymbols, recursiveState, recursiveState1)))
                    {
                        return(false);
                    }
                }

                return(true);
            }

            if (expression is ArrayCreationExpressionSyntax arrayCreationExpression)
            {
                if (arrayCreationExpression.Initializer != null)
                {
                    if (arrayCreationExpression
                        .Initializer
                        .Expressions
                        .Any(x =>
                             !IsNewlyCreatedObject(semanticModel, x, knownSymbols, recursiveState, recursiveState1)))
                    {
                        return(false);
                    }
                }

                return(true);
            }

            if (expression is ImplicitArrayCreationExpressionSyntax arrayCreationExpression1)
            {
                if (arrayCreationExpression1.Initializer != null)
                {
                    if (arrayCreationExpression1
                        .Initializer
                        .Expressions
                        .Any(x =>
                             !IsNewlyCreatedObject(semanticModel, x, knownSymbols, recursiveState, recursiveState1)))
                    {
                        return(false);
                    }
                }

                return(true);
            }

            if (expression is InitializerExpressionSyntax initSyntax &&
                initSyntax.Kind() == SyntaxKind.ArrayInitializerExpression)
            {
                if (initSyntax
                    .Expressions
                    .Any(x =>
                         !IsNewlyCreatedObject(semanticModel, x, knownSymbols, recursiveState, recursiveState1)))
                {
                    return(false);
                }
                return(true);
            }

            if (expression is InvocationExpressionSyntax invocationExpression)
            {
                if (semanticModel.GetSymbolInfo(invocationExpression.Expression).Symbol is IMethodSymbol invokedMethod)
                {
                    if (MethodReturnsNewObject(semanticModel, knownSymbols, recursiveState1, invokedMethod))
                    {
                        return(true);
                    }
                }
            }

            if (expression is MemberAccessExpressionSyntax memberAccessExpression)
            {
                if (semanticModel.GetSymbolInfo(memberAccessExpression.Name).Symbol is IPropertySymbol propertySymbol && !GetUsage(memberAccessExpression.Name).IsWrite())
                {
                    if (MethodReturnsNewObject(semanticModel, knownSymbols, recursiveState1, propertySymbol.GetMethod))
                    {
                        return(true);
                    }
                }
            }

            if (expression is IdentifierNameSyntax identifier)
            {
                var identifierSymbol = semanticModel.GetSymbolInfo(identifier).Symbol;

                if (identifierSymbol is ILocalSymbol local)
                {
                    if (!local.IsRef && IsCompleteValueType(local.Type))
                    {
                        return(true);
                    }

                    if (recursiveState.VariablesUnderTest.Contains(local))
                    {
                        return(true);
                    }

                    var methodBody =
                        GetBodyOfMethodThatContainsExpression(expression);

                    if (methodBody.HasNoValue)
                    {
                        return(false);
                    }

                    var valuesInjectedIntoObject =
                        GetValuesPossiblyInjectedInto(semanticModel, local, methodBody.GetValue(), knownSymbols, recursiveState1);

                    if (!valuesInjectedIntoObject.All(x =>
                    {
                        var typeSymbol = semanticModel.GetTypeInfo(x).Type;

                        if (typeSymbol != null && IsImmutablePureData(typeSymbol))
                        {
                            return(true);
                        }

                        return(IsNewlyCreatedObject(semanticModel, x, knownSymbols, recursiveState.Add(local),
                                                    recursiveState1));
                    }))
                    {
                        return(false);
                    }

                    return(FindValuesAssignedToVariable(semanticModel, local, methodBody.GetValue()).All(x =>
                                                                                                         IsNewlyCreatedObject(semanticModel, x, knownSymbols, recursiveState.Add(local), recursiveState1)));
                }
            }

            if (semanticModel.GetTypeInfo(expression).Type is ITypeSymbol type)
            {
                if (IsCompleteValueType(type))
                {
                    return(true);
                }
            }

            return(false);
        }