コード例 #1
0
        protected override DeclaredSymbolInfo?GetTypeDeclarationInfo(
            SyntaxNode container,
            TypeDeclarationSyntax typeDeclaration,
            StringTable stringTable,
            string containerDisplayName,
            string fullyQualifiedContainerName)
        {
            // If this is a part of partial type that only contains nested types, then we don't make an info type for
            // it. That's because we effectively think of this as just being a virtual container just to hold the nested
            // types, and not something someone would want to explicitly navigate to itself.  Similar to how we think of
            // namespaces.
            if (typeDeclaration.Modifiers.Any(SyntaxKind.PartialKeyword) &&
                typeDeclaration.Members.Any() &&
                typeDeclaration.Members.All(m => m is BaseTypeDeclarationSyntax))
            {
                return(null);
            }

            return(DeclaredSymbolInfo.Create(
                       stringTable,
                       typeDeclaration.Identifier.ValueText,
                       GetTypeParameterSuffix(typeDeclaration.TypeParameterList),
                       containerDisplayName,
                       fullyQualifiedContainerName,
                       typeDeclaration.Modifiers.Any(SyntaxKind.PartialKeyword),
                       typeDeclaration.Kind() switch
            {
                SyntaxKind.ClassDeclaration => DeclaredSymbolInfoKind.Class,
                SyntaxKind.InterfaceDeclaration => DeclaredSymbolInfoKind.Interface,
                SyntaxKind.StructDeclaration => DeclaredSymbolInfoKind.Struct,
                SyntaxKind.RecordDeclaration => DeclaredSymbolInfoKind.Record,
                SyntaxKind.RecordStructDeclaration => DeclaredSymbolInfoKind.RecordStruct,
                _ => throw ExceptionUtilities.UnexpectedValue(typeDeclaration.Kind()),
            },
コード例 #2
0
        protected override void AddDeclaredSymbolInfosWorker(
            SyntaxNode container,
            MemberDeclarationSyntax node,
            StringTable stringTable,
            ArrayBuilder <DeclaredSymbolInfo> declaredSymbolInfos,
            Dictionary <string, string> aliases,
            Dictionary <string, ArrayBuilder <int> > extensionMethodInfo,
            string containerDisplayName,
            string fullyQualifiedContainerName,
            CancellationToken cancellationToken)
        {
            // If this is a part of partial type that only contains nested types, then we don't make an info type for
            // it. That's because we effectively think of this as just being a virtual container just to hold the nested
            // types, and not something someone would want to explicitly navigate to itself.  Similar to how we think of
            // namespaces.
            if (node is TypeDeclarationSyntax typeDeclaration &&
                typeDeclaration.Modifiers.Any(SyntaxKind.PartialKeyword) &&
                typeDeclaration.Members.Any() &&
                typeDeclaration.Members.All(m => m is BaseTypeDeclarationSyntax))
            {
                return;
            }

            switch (node.Kind())
            {
            case SyntaxKind.ClassDeclaration:
            case SyntaxKind.RecordDeclaration:
            case SyntaxKind.RecordStructDeclaration:
            case SyntaxKind.InterfaceDeclaration:
            case SyntaxKind.StructDeclaration:
                var typeDecl = (TypeDeclarationSyntax)node;
                declaredSymbolInfos.Add(DeclaredSymbolInfo.Create(
                                            stringTable,
                                            typeDecl.Identifier.ValueText,
                                            GetTypeParameterSuffix(typeDecl.TypeParameterList),
                                            containerDisplayName,
                                            fullyQualifiedContainerName,
                                            typeDecl.Modifiers.Any(SyntaxKind.PartialKeyword),
                                            node.Kind() switch
                {
                    SyntaxKind.ClassDeclaration => DeclaredSymbolInfoKind.Class,
                    SyntaxKind.RecordDeclaration => DeclaredSymbolInfoKind.Record,
                    SyntaxKind.InterfaceDeclaration => DeclaredSymbolInfoKind.Interface,
                    SyntaxKind.StructDeclaration => DeclaredSymbolInfoKind.Struct,
                    SyntaxKind.RecordStructDeclaration => DeclaredSymbolInfoKind.RecordStruct,
                    _ => throw ExceptionUtilities.UnexpectedValue(node.Kind()),
                },
                                            GetAccessibility(container, typeDecl.Modifiers),
                                            typeDecl.Identifier.Span,
                                            GetInheritanceNames(stringTable, typeDecl.BaseList),
                                            IsNestedType(typeDecl)));
                return;
コード例 #3
0
        public override bool TryGetDeclaredSymbolInfo(
            StringTable stringTable,
            SyntaxNode node,
            string rootNamespace,
            out DeclaredSymbolInfo declaredSymbolInfo
            )
        {
            // If this is a part of partial type that only contains nested types, then we don't make an info type for
            // it. That's because we effectively think of this as just being a virtual container just to hold the nested
            // types, and not something someone would want to explicitly navigate to itself.  Similar to how we think of
            // namespaces.
            if (
                node is TypeDeclarationSyntax typeDeclaration &&
                typeDeclaration.Modifiers.Any(SyntaxKind.PartialKeyword) &&
                typeDeclaration.Members.Any() &&
                typeDeclaration.Members.All(m => m is BaseTypeDeclarationSyntax)
                )
            {
                declaredSymbolInfo = default;
                return(false);
            }

            switch (node.Kind())
            {
            case SyntaxKind.ClassDeclaration:
            case SyntaxKind.RecordDeclaration:
            case SyntaxKind.InterfaceDeclaration:
            case SyntaxKind.StructDeclaration:
                var typeDecl = (TypeDeclarationSyntax)node;
                declaredSymbolInfo = DeclaredSymbolInfo.Create(
                    stringTable,
                    typeDecl.Identifier.ValueText,
                    GetTypeParameterSuffix(typeDecl.TypeParameterList),
                    GetContainerDisplayName(node.Parent),
                    GetFullyQualifiedContainerName(node.Parent),
                    typeDecl.Modifiers.Any(SyntaxKind.PartialKeyword),
                    node.Kind() switch
                {
                    SyntaxKind.ClassDeclaration => DeclaredSymbolInfoKind.Class,
                    SyntaxKind.RecordDeclaration => DeclaredSymbolInfoKind.Record,
                    SyntaxKind.InterfaceDeclaration => DeclaredSymbolInfoKind.Interface,
                    SyntaxKind.StructDeclaration => DeclaredSymbolInfoKind.Struct,
                    _ => throw ExceptionUtilities.UnexpectedValue(node.Kind()),
                },
                    GetAccessibility(typeDecl, typeDecl.Modifiers),
                    typeDecl.Identifier.Span,
                    GetInheritanceNames(stringTable, typeDecl.BaseList),
                    IsNestedType(typeDecl)
                    );
                return(true);
コード例 #4
0
        protected override void AddLocalFunctionInfos(
            MemberDeclarationSyntax memberDeclaration,
            StringTable stringTable,
            ArrayBuilder <DeclaredSymbolInfo> declaredSymbolInfos,
            string containerDisplayName,
            string fullyQualifiedContainerName,
            CancellationToken cancellationToken)
        {
            AddLocalFunctionInfosRecurse(memberDeclaration);

            return;

            void AddLocalFunctionInfosRecurse(SyntaxNode node)
            {
                cancellationToken.ThrowIfCancellationRequested();

                foreach (var child in node.ChildNodesAndTokens())
                {
                    if (child.IsNode)
                    {
                        AddLocalFunctionInfosRecurse(child.AsNode() !);
                    }
                }

                if (node is LocalFunctionStatementSyntax localFunction)
                {
                    declaredSymbolInfos.Add(DeclaredSymbolInfo.Create(
                                                stringTable,
                                                localFunction.Identifier.ValueText, GetMethodSuffix(localFunction),
                                                containerDisplayName,
                                                fullyQualifiedContainerName,
                                                isPartial: false,
                                                DeclaredSymbolInfoKind.Method,
                                                Accessibility.Private,
                                                localFunction.Identifier.Span,
                                                inheritanceNames: ImmutableArray <string> .Empty,
                                                parameterCount: localFunction.ParameterList.Parameters.Count,
                                                typeParameterCount: localFunction.TypeParameterList?.Parameters.Count ?? 0));
                }
            }
        }