Exemple #1
0
        public static ITypeSymbol GetMatchedTypeSymbol(
            this PatternSyntax pattern,
            SyntaxNodeAnalysisContext context,
            ITypeSymbol type,
            HashSet <ITypeSymbol> allCases,
            bool isClosed)
        {
            ITypeSymbol symbolUsed;

            switch (pattern)
            {
            case DeclarationPatternSyntax declarationPattern:
                symbolUsed = context.GetDeclarationType(declarationPattern);
                break;

            case DiscardPatternSyntax _:
            case ConstantPatternSyntax constantPattern
                when constantPattern.IsNull():
                // Ignored
                return(null);

            case VarPatternSyntax _:
            case RecursivePatternSyntax _:
            default:
                context.ReportCasePatternNotSupported(pattern);
                return(null);
            }

            if (isClosed && !allCases.Contains(symbolUsed))
            {
                var diagnostic = Diagnostic.Create(ExhaustiveMatchAnalyzer.MatchMustBeOnCaseType,
                                                   pattern.GetLocation(), symbolUsed.GetFullName(), type.GetFullName());
                context.ReportDiagnostic(diagnostic);
            }

            return(symbolUsed);
        }