Ejemplo n.º 1
0
        private static void HandleMethodParameter(SyntaxNodeAnalysisContext context, ParameterSyntax parameter)
        {
            var paramSympol = context.SemanticModel.GetDeclaredSymbol(parameter, context.CancellationToken);

            if (paramSympol != null)
            {
                var isRefCounter = RefCounter.IsRefCounterType(paramSympol.Type);
                if (isRefCounter)
                {
                    var param = context.SemanticModel.GetDeclaredSymbolSafe(parameter, context.CancellationToken);

                    if (param != null)
                    {
                        var method = parameter.FirstAncestorOrSelf <MethodDeclarationSyntax>();
                        var block  = method?.Body;
                        if (block == null)
                        {
                            return;
                        }

                        RefCounterStatus status = new RefCounterStatus();
                        if (method.Identifier.ToString().Equals(KnownSymbol.ReleaseReference))
                        {
                            status.AcquireReference("param of ReleaseReference", method.GetLocation());
                        }
                        ProcessLocalOrParamenterVar(context, param, block, status);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private static void HandleLocalDeclaration(SyntaxNodeAnalysisContext context,
                                                   LocalDeclarationStatementSyntax localDeclaration)
        {
            // 根据声明语句声明的Type(可能是var),获得SymbolInfo

            var isRefCounter = RefCounter.IsRefCounterType(context.SemanticModel, localDeclaration.Declaration.Type);

            if (isRefCounter)
            {
                foreach (var variable in localDeclaration.Declaration.Variables)
                {
                    HandleLocalVariable(context, variable);
                }
            }
        }