Skip to content

Commit

Permalink
Merge pull request #1075 from akshita31/codelens_attr
Browse files Browse the repository at this point in the history
Added attribute span property for fileMemberElement
  • Loading branch information
david-driscoll committed Jan 11, 2018
2 parents 2852b9f + febe1ed commit 290c9d2
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 16 deletions.
Expand Up @@ -9,6 +9,10 @@ public class FileMemberElement : IComparable<FileMemberElement>

public QuickFix Location { get; set; }

public int AttributeSpanStart { get; set; }

public int AttributeSpanEnd { get; set; }

public string Kind { get; set; }

public ICollection<SyntaxFeature> Features { get; } = new List<SyntaxFeature>();
Expand Down
35 changes: 19 additions & 16 deletions src/OmniSharp.Roslyn.CSharp/Workers/StructureComputer.cs
Expand Up @@ -5,6 +5,7 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using OmniSharp.Abstractions.Services;
using OmniSharp.Models;
using OmniSharp.Models.MembersTree;
Expand Down Expand Up @@ -55,13 +56,15 @@ private async Task Process(Document document)
(syntaxRoot as CSharpSyntaxNode)?.Accept(this);
}

private FileMemberElement AsNode(SyntaxNode node, string text, Location location)
private FileMemberElement AsNode(SyntaxNode node, string text, Location location, TextSpan attributeSpan)
{
var ret = new FileMemberElement();
var lineSpan = location.GetLineSpan();
ret.Projects = new List<string>();
ret.ChildNodes = new List<FileMemberElement>();
ret.Kind = node.Kind().ToString();
ret.AttributeSpanStart = attributeSpan.Start;
ret.AttributeSpanEnd = attributeSpan.End;
ret.Location = new QuickFix()
{
Text = text,
Expand All @@ -83,9 +86,9 @@ private FileMemberElement AsNode(SyntaxNode node, string text, Location location
return ret;
}

private FileMemberElement AsChild(SyntaxNode node, string text, Location location)
private FileMemberElement AsChild(SyntaxNode node, string text, Location location, TextSpan attributeSpan)
{
var child = AsNode(node, text, location);
var child = AsNode(node, text, location, attributeSpan);
var childNodes = ((List<FileMemberElement>)_roots.Peek().ChildNodes);

// Prevent inserting the same node multiple times
Expand All @@ -104,9 +107,9 @@ private FileMemberElement AsChild(SyntaxNode node, string text, Location locatio
}
}

private FileMemberElement AsParent(SyntaxNode node, string text, Action fn, Location location)
private FileMemberElement AsParent(SyntaxNode node, string text, Action fn, Location location, TextSpan attributeSpan)
{
var child = AsChild(node, text, location);
var child = AsChild(node, text, location, attributeSpan);
_roots.Push(child);
fn();
_roots.Pop();
Expand All @@ -115,52 +118,52 @@ private FileMemberElement AsParent(SyntaxNode node, string text, Action fn, Loca

public override void VisitClassDeclaration(ClassDeclarationSyntax node)
{
AsParent(node, node.Identifier.Text, () => base.VisitClassDeclaration(node), node.Identifier.GetLocation());
AsParent(node, node.Identifier.Text, () => base.VisitClassDeclaration(node), node.Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitInterfaceDeclaration(InterfaceDeclarationSyntax node)
{
AsParent(node, node.Identifier.Text, () => base.VisitInterfaceDeclaration(node), node.Identifier.GetLocation());
AsParent(node, node.Identifier.Text, () => base.VisitInterfaceDeclaration(node), node.Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitEnumDeclaration(EnumDeclarationSyntax node)
{
AsParent(node, node.Identifier.Text, () => base.VisitEnumDeclaration(node), node.Identifier.GetLocation());
AsParent(node, node.Identifier.Text, () => base.VisitEnumDeclaration(node), node.Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitEnumMemberDeclaration(EnumMemberDeclarationSyntax node)
{
AsChild(node, node.Identifier.Text, node.Identifier.GetLocation());
AsChild(node, node.Identifier.Text, node.Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node)
{
AsChild(node, node.Identifier.Text, node.Identifier.GetLocation());
AsChild(node, node.Identifier.Text, node.Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
AsChild(node, node.Identifier.Text, node.Identifier.GetLocation());
AsChild(node, node.Identifier.Text, node.Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
{
AsChild(node, node.Declaration.Variables.First().Identifier.Text, node.Declaration.Variables.First().Identifier.GetLocation());
AsChild(node, node.Declaration.Variables.First().Identifier.Text, node.Declaration.Variables.First().Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitEventFieldDeclaration(EventFieldDeclarationSyntax node)
{
AsChild(node, node.Declaration.Variables.First().Identifier.Text, node.Declaration.Variables.First().Identifier.GetLocation());
AsChild(node, node.Declaration.Variables.First().Identifier.Text, node.Declaration.Variables.First().Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitStructDeclaration(StructDeclarationSyntax node)
{
AsParent(node, node.Identifier.Text, () => base.VisitStructDeclaration(node), node.Identifier.GetLocation());
AsParent(node, node.Identifier.Text, () => base.VisitStructDeclaration(node), node.Identifier.GetLocation(), node.AttributeLists.Span);
}

public override void VisitConstructorDeclaration(ConstructorDeclarationSyntax node)
{
AsChild(node, node.Identifier.Text, node.Identifier.GetLocation());
AsChild(node, node.Identifier.Text, node.Identifier.GetLocation(), node.AttributeLists.Span);
}
}
}
}

0 comments on commit 290c9d2

Please sign in to comment.