コード例 #1
0
        private static bool IsFixableBackingField(
            PropertyDeclarationSyntax propertyDeclaration,
            IPropertySymbol propertySymbol,
            IFieldSymbol fieldSymbol,
            Compilation compilation,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            UseAutoPropertyWalker walker = UseAutoPropertyWalkerCache.GetInstance();

            INamedTypeSymbol containingType = fieldSymbol.ContainingType;

            bool shouldSearchForReferenceInInstanceConstructor = !containingType.IsSealed &&
                                                                 !propertySymbol.IsStatic &&
                                                                 (propertySymbol.IsVirtual || propertySymbol.IsOverride);

            ImmutableArray <SyntaxReference> syntaxReferences = containingType.DeclaringSyntaxReferences;

            if (syntaxReferences.Length == 1)
            {
                walker.SetValues(fieldSymbol, shouldSearchForReferenceInInstanceConstructor, default(Compilation), semanticModel, cancellationToken);

                walker.Visit(propertyDeclaration.Parent);

                bool isFixable = !walker.IsReferencedInInstanceConstructor && !walker.IsUsedInRefOrOutArgument;

                UseAutoPropertyWalkerCache.Free(walker);

                return(isFixable);
            }
            else
            {
                foreach (SyntaxReference syntaxReference in syntaxReferences)
                {
                    SyntaxNode typeDeclaration = syntaxReference.GetSyntax(cancellationToken);

                    if (typeDeclaration.SyntaxTree == semanticModel.SyntaxTree)
                    {
                        walker.SetValues(fieldSymbol, shouldSearchForReferenceInInstanceConstructor, default(Compilation), semanticModel, cancellationToken);
                    }
                    else
                    {
                        walker.SetValues(fieldSymbol, shouldSearchForReferenceInInstanceConstructor, compilation, default(SemanticModel), cancellationToken);
                    }

                    walker.Visit(typeDeclaration);

                    bool isFixable = !walker.IsReferencedInInstanceConstructor && !walker.IsUsedInRefOrOutArgument;

                    if (!isFixable)
                    {
                        UseAutoPropertyWalkerCache.Free(walker);
                        return(false);
                    }
                }

                UseAutoPropertyWalkerCache.Free(walker);
                return(true);
            }
        }
コード例 #2
0
        private static bool IsFixableBackingField(
            PropertyDeclarationSyntax propertyDeclaration,
            IPropertySymbol propertySymbol,
            IFieldSymbol fieldSymbol,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            INamedTypeSymbol containingType = fieldSymbol.ContainingType;

            bool shouldSearchForReferenceInInstanceConstructor = !containingType.IsSealed &&
                                                                 !propertySymbol.IsStatic &&
                                                                 (propertySymbol.IsVirtual || propertySymbol.IsOverride);

            UseAutoPropertyWalker walker = UseAutoPropertyWalker.GetInstance();

            var isFixable = false;

            ImmutableArray <SyntaxReference> syntaxReferences = containingType.DeclaringSyntaxReferences;

            if (syntaxReferences.Length == 1)
            {
                walker.SetValues(fieldSymbol, shouldSearchForReferenceInInstanceConstructor, semanticModel, cancellationToken);

                walker.Visit(propertyDeclaration.Parent);

                isFixable = walker.Success;
            }
            else
            {
                foreach (SyntaxReference syntaxReference in syntaxReferences)
                {
                    SyntaxNode typeDeclaration = syntaxReference.GetSyntax(cancellationToken);

                    if (typeDeclaration.SyntaxTree != semanticModel.SyntaxTree)
                    {
                        isFixable = false;
                        break;
                    }

                    walker.SetValues(fieldSymbol, shouldSearchForReferenceInInstanceConstructor, semanticModel, cancellationToken);

                    walker.Visit(typeDeclaration);

                    isFixable = walker.Success;

                    if (!isFixable)
                    {
                        break;
                    }
                }
            }

            UseAutoPropertyWalker.Free(walker);

            return(isFixable);
        }
コード例 #3
0
            public static void Free(UseAutoPropertyWalker walker)
            {
                walker.SetValues(
                    default(IFieldSymbol),
                    false,
                    default(SemanticModel),
                    default(CancellationToken));

                _cachedInstance = walker;
            }
コード例 #4
0
            public static UseAutoPropertyWalker GetInstance()
            {
                UseAutoPropertyWalker walker = _cachedInstance;

                if (walker != null)
                {
                    _cachedInstance = null;
                }
                else
                {
                    walker = new UseAutoPropertyWalker();
                }

                return(walker);
            }
コード例 #5
0
            public static UseAutoPropertyWalker GetInstance()
            {
                UseAutoPropertyWalker walker = _cachedInstance;

                if (walker != null)
                {
                    Debug.Assert(walker.FieldSymbol == null);
                    Debug.Assert(walker.SemanticModel == null);
                    Debug.Assert(walker.CancellationToken == default);

                    _cachedInstance = null;
                    return(walker);
                }

                return(new UseAutoPropertyWalker());
            }
コード例 #6
0
 public static void Free(UseAutoPropertyWalker walker)
 {
     walker.ClearValues();
     _cachedInstance = walker;
 }