private CodeElement CreateCodeElement(EnumDeclarationSyntax enumDeclaration, SourceText text, SemanticModel semanticModel)
        {
            var symbol = semanticModel.GetDeclaredSymbol(enumDeclaration);

            if (symbol == null)
            {
                return(null);
            }

            var builder = new CodeElement.Builder
            {
                Kind        = symbol.GetKindString(),
                Name        = symbol.ToDisplayString(SymbolDisplayFormats.ShortTypeFormat),
                DisplayName = symbol.ToDisplayString(SymbolDisplayFormats.TypeFormat),
            };

            AddRanges(builder, enumDeclaration.AttributeLists.Span, enumDeclaration.Span, enumDeclaration.Identifier.Span, text);
            AddSymbolProperties(symbol, builder);

            foreach (var member in enumDeclaration.Members)
            {
                foreach (var childElement in CreateCodeElements(member, text, semanticModel))
                {
                    builder.AddChild(childElement);
                }
            }

            return(builder.ToCodeElement());
        }
        private static async Task <CodeElement> TranslateAsync(this CodeElement element, OmniSharpWorkspace workspace, SimpleFileRequest request)
        {
            var builder = new CodeElement.Builder
            {
                Kind        = element.Kind,
                DisplayName = element.DisplayName,
                Name        = element.Name
            };

            foreach (var property in element.Properties ?? Enumerable.Empty <KeyValuePair <string, object> >())
            {
                builder.AddProperty(property.Key, property.Value);
            }

            foreach (var range in element.Ranges ?? Enumerable.Empty <KeyValuePair <string, Range> >())
            {
                builder.AddRange(range.Key, await range.Value.TranslateAsync(workspace, request));
            }

            foreach (var childElement in element.Children ?? Enumerable.Empty <CodeElement>())
            {
                var translatedElement = await childElement.TranslateAsync(workspace, request);

                // This is plain stupid, but someone might put a #load directive inside a method or class
                if (translatedElement.Ranges.Values.Any(x => x.Start.Line < 0))
                {
                    continue;
                }

                builder.AddChild(translatedElement);
            }

            return(builder.ToCodeElement());
        }
        private CodeElement CreateCodeElement(NamespaceDeclarationSyntax namespaceDeclaration, SourceText text, SemanticModel semanticModel)
        {
            var symbol = semanticModel.GetDeclaredSymbol(namespaceDeclaration);

            if (symbol == null)
            {
                return(null);
            }

            var builder = new CodeElement.Builder
            {
                Kind        = symbol.GetKindString(),
                Name        = symbol.ToDisplayString(SymbolDisplayFormats.ShortTypeFormat),
                DisplayName = symbol.ToDisplayString(SymbolDisplayFormats.TypeFormat),
            };

            AddRanges(builder, attributesSpan: default, namespaceDeclaration.Span, namespaceDeclaration.Name.Span, text);
        private CodeElement CreateCodeElement(DelegateDeclarationSyntax delegateDeclaration, SourceText text, SemanticModel semanticModel)
        {
            var symbol = semanticModel.GetDeclaredSymbol(delegateDeclaration);

            if (symbol == null)
            {
                return(null);
            }

            var builder = new CodeElement.Builder
            {
                Kind        = symbol.GetKindString(),
                Name        = symbol.ToDisplayString(SymbolDisplayFormats.ShortTypeFormat),
                DisplayName = symbol.ToDisplayString(SymbolDisplayFormats.TypeFormat),
            };

            AddRanges(builder, delegateDeclaration.AttributeLists.Span, delegateDeclaration.Span, delegateDeclaration.Identifier.Span, text);
            AddSymbolProperties(symbol, builder);

            return(builder.ToCodeElement());
        }