Skip to content

Commit c5626d9

Browse files
committed
feat: Get initial state of outline regions
1 parent 46b7ad9 commit c5626d9

26 files changed

Lines changed: 271 additions & 118 deletions

src/CodeNav.OutOfProc/CodeNav.OutOfProc.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFramework>net8.0-windows8.0</TargetFramework>
44
<ImplicitUsings>enable</ImplicitUsings>

src/CodeNav.OutOfProc/Extensions/EnumExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.ComponentModel;
22

3-
namespace CodeNav.Extensions;
3+
namespace CodeNav.OutOfProc.Extensions;
44

55
public static class EnumExtensions
66
{

src/CodeNav.OutOfProc/Helpers/OutliningHelper.cs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using CodeNav.OutOfProc.Extensions;
22
using CodeNav.OutOfProc.Interfaces;
3+
using CodeNav.OutOfProc.Models;
34
using CodeNav.OutOfProc.ViewModels;
45
using CodeNav.Services;
56
using Microsoft;
67
using Microsoft.VisualStudio.Extensibility;
78
using Microsoft.VisualStudio.Extensibility.Helpers;
9+
using System.Text.Json;
810

911
namespace CodeNav.OutOfProc.Helpers;
1012

@@ -20,12 +22,32 @@ public OutliningHelper(VisualStudioExtensibility extensibility)
2022
_initializationTask = Task.Run(InitializeAsync);
2123
}
2224

23-
public async Task SubscribeToRegionEvents()
25+
/// <summary>
26+
/// Subscribe to region events and retrieve the current state of all regions.
27+
/// </summary>
28+
/// <remarks>
29+
/// Uses the InProc service.
30+
/// </remarks>
31+
/// <returns></returns>
32+
public async Task SubscribeToRegionEvents(CodeDocumentViewModel codeDocumentViewModel)
2433
{
2534
try
2635
{
2736
Assumes.NotNull(_inProcService);
28-
await _inProcService.SubscribeToRegionEvents();
37+
38+
// Subscribe to outline region events and get all outline regions
39+
var outlineRegionsJsonString = await _inProcService.SubscribeToRegionEvents();
40+
41+
// Synchronize all outline regions with the code items
42+
var outlineRegions = JsonSerializer.Deserialize<List<OutlineRegion>>(outlineRegionsJsonString);
43+
44+
if (outlineRegions!.Any() != true)
45+
{
46+
return;
47+
}
48+
49+
outlineRegions!.ForEach(outlineRegion =>
50+
SetIsExpanded(codeDocumentViewModel, outlineRegion.SpanStart, outlineRegion.SpanEnd, outlineRegion.IsExpanded));
2951
}
3052
catch (Exception e)
3153
{
@@ -66,7 +88,11 @@ public static async Task CollapseOutlineRegion(CodeItem codeItem)
6688
return;
6789
}
6890

69-
await codeItem.CodeDocumentViewModel.CodeDocumentService.OutliningHelper.CollapseOutlineRegion(codeItem.Span.Start, codeItem.Span.Length);
91+
await codeItem
92+
.CodeDocumentViewModel
93+
.CodeDocumentService
94+
.OutliningHelper
95+
.CollapseOutlineRegion(codeItem.OutlineSpan.Start, codeItem.OutlineSpan.Length);
7096
}
7197

7298
public static async Task ExpandOutlineRegion(CodeItem codeItem)
@@ -76,7 +102,11 @@ public static async Task ExpandOutlineRegion(CodeItem codeItem)
76102
return;
77103
}
78104

79-
await codeItem.CodeDocumentViewModel.CodeDocumentService.OutliningHelper.ExpandOutlineRegion(codeItem.Span.Start, codeItem.Span.Length);
105+
await codeItem
106+
.CodeDocumentViewModel
107+
.CodeDocumentService
108+
.OutliningHelper
109+
.ExpandOutlineRegion(codeItem.OutlineSpan.Start, codeItem.OutlineSpan.Length);
80110
}
81111

82112
/// <summary>

src/CodeNav.OutOfProc/Interfaces/ICodeCollapsible.cs

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/CodeNav.OutOfProc/Languages/CSharp/Mappers/BaseMapper.cs

Lines changed: 22 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -2,83 +2,30 @@
22
using CodeNav.OutOfProc.ViewModels;
33
using Microsoft.CodeAnalysis;
44
using Microsoft.CodeAnalysis.CSharp;
5-
using Microsoft.CodeAnalysis.CSharp.Syntax;
65
using Microsoft.CodeAnalysis.Text;
76

87
namespace CodeNav.OutOfProc.Languages.CSharp.Mappers;
98

109
public static class BaseMapper
1110
{
12-
public static T MapBase<T>(
13-
SyntaxNode source,
14-
SyntaxToken identifier,
15-
SyntaxTokenList modifiers,
16-
SemanticModel semanticModel,
17-
CodeDocumentViewModel codeDocumentViewModel) where T : CodeItem
18-
=> MapBase<T>(
19-
source,
20-
identifier,
21-
modifiers,
22-
semanticModel,
23-
codeDocumentViewModel);
24-
25-
public static T MapBase<T>(
26-
SyntaxNode source,
27-
NameSyntax name,
28-
SemanticModel semanticModel,
29-
CodeDocumentViewModel codeDocumentViewModel) where T : CodeItem
30-
=> MapBase<T>(
31-
source,
32-
identifier: null,
33-
name.ToString(),
34-
modifiers: [],
35-
semanticModel,
36-
codeDocumentViewModel);
37-
38-
public static T MapBase<T>(
39-
SyntaxNode source,
40-
string name,
41-
SemanticModel semanticModel,
42-
CodeDocumentViewModel codeDocumentViewModel) where T : CodeItem
43-
=> MapBase<T>(
44-
source,
45-
identifier: null,
46-
name,
47-
modifiers: [],
48-
semanticModel,
49-
codeDocumentViewModel);
50-
51-
public static T MapBase<T>(
52-
SyntaxNode source,
53-
SyntaxToken identifier,
54-
SemanticModel semanticModel,
55-
CodeDocumentViewModel codeDocumentViewModel) where T : CodeItem
56-
=> MapBase<T>(
57-
source,
58-
identifier,
59-
identifier.Text,
60-
modifiers: [],
61-
semanticModel,
62-
codeDocumentViewModel);
63-
6411
/// <summary>
6512
/// Map commonly shared code item properties based on the syntaxt token that is been mapped
6613
/// </summary>
6714
/// <typeparam name="T"></typeparam>
6815
/// <param name="source">Syntax node of the code member</param>
16+
/// <param name="semanticModel">Semantic model used during compilation</param>
17+
/// <param name="codeDocumentViewModel">Code document view model used in the CodeNav tool window</param>
6918
/// <param name="identifier">Syntax token of the code identifier</param>
7019
/// <param name="name">Name of the code member</param>
7120
/// <param name="modifiers">Accessibility modifiers of the code member</param>
72-
/// <param name="semanticModel">Semantic model used during compilation</param>
73-
/// <param name="codeDocumentViewModel">Code document view model used in the CodeNav tool window</param>
7421
/// <returns>Code item class or othe code class derived from code item</returns>
75-
private static T MapBase<T>(
22+
public static T MapBase<T>(
7623
SyntaxNode source,
77-
SyntaxToken? identifier,
78-
string name,
79-
SyntaxTokenList modifiers,
8024
SemanticModel semanticModel,
81-
CodeDocumentViewModel codeDocumentViewModel) where T : CodeItem
25+
CodeDocumentViewModel codeDocumentViewModel,
26+
SyntaxToken? identifier = null,
27+
string name = "",
28+
SyntaxTokenList? modifiers = null) where T : CodeItem
8229
{
8330
var codeItem = Activator.CreateInstance<T>();
8431

@@ -103,13 +50,11 @@ private static T MapBase<T>(
10350

10451
private static TextSpan MapOutlineSpan(TextSpan span, TextSpan? identifierSpan, string name)
10552
{
106-
var outlineSpanStart = span.Start;
107-
108-
outlineSpanStart += identifierSpan != null
109-
? identifierSpan.Value.Length
110-
: name.Length;
53+
var outlineSpanStart = identifierSpan != null
54+
? identifierSpan.Value.End
55+
: span.Start + name.Length;
11156

112-
return new TextSpan(outlineSpanStart, span.Length);
57+
return new TextSpan(outlineSpanStart, span.End - outlineSpanStart);
11358
}
11459

11560
private static string MapFullName(SyntaxNode source, string name, SemanticModel semanticModel)
@@ -128,25 +73,30 @@ private static string MapFullName(SyntaxNode source, string name, SemanticModel
12873
private static string MapName(SyntaxToken? identifier, string name)
12974
=> identifier != null ? identifier.Value.Text : name;
13075

131-
private static CodeItemAccessEnum MapAccess(SyntaxTokenList modifiers, SyntaxNode source)
76+
private static CodeItemAccessEnum MapAccess(SyntaxTokenList? modifiers, SyntaxNode source)
13277
{
133-
if (modifiers.Any(m => m.RawKind == (int)SyntaxKind.SealedKeyword))
78+
if (modifiers == null)
79+
{
80+
return MapDefaultAccess(source);
81+
}
82+
83+
if (modifiers.Value.Any(m => m.RawKind == (int)SyntaxKind.SealedKeyword))
13484
{
13585
return CodeItemAccessEnum.Sealed;
13686
}
137-
if (modifiers.Any(m => m.RawKind == (int)SyntaxKind.PublicKeyword))
87+
if (modifiers.Value.Any(m => m.RawKind == (int)SyntaxKind.PublicKeyword))
13888
{
13989
return CodeItemAccessEnum.Public;
14090
}
141-
if (modifiers.Any(m => m.RawKind == (int)SyntaxKind.PrivateKeyword))
91+
if (modifiers.Value.Any(m => m.RawKind == (int)SyntaxKind.PrivateKeyword))
14292
{
14393
return CodeItemAccessEnum.Private;
14494
}
145-
if (modifiers.Any(m => m.RawKind == (int)SyntaxKind.ProtectedKeyword))
95+
if (modifiers.Value.Any(m => m.RawKind == (int)SyntaxKind.ProtectedKeyword))
14696
{
14797
return CodeItemAccessEnum.Protected;
14898
}
149-
if (modifiers.Any(m => m.RawKind == (int)SyntaxKind.InternalKeyword))
99+
if (modifiers.Value.Any(m => m.RawKind == (int)SyntaxKind.InternalKeyword))
150100
{
151101
return CodeItemAccessEnum.Internal;
152102
}

src/CodeNav.OutOfProc/Languages/CSharp/Mappers/ClassMapper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public static CodeClassItem MapClass(ClassDeclarationSyntax member,
1414
SemanticModel semanticModel, SyntaxTree tree, CodeDocumentViewModel codeDocumentViewModel,
1515
bool mapBaseClass)
1616
{
17-
var codeItem = BaseMapper.MapBase<CodeClassItem>(member, member.Identifier, member.Modifiers, semanticModel, codeDocumentViewModel);
17+
var codeItem = BaseMapper.MapBase<CodeClassItem>(member, semanticModel, codeDocumentViewModel, member.Identifier, modifiers: member.Modifiers);
1818
codeItem.Kind = CodeItemKindEnum.Class;
1919
codeItem.Moniker = IconMapper.MapMoniker(codeItem.Kind, codeItem.Access);
2020
codeItem.Parameters = MapInheritance(member);

src/CodeNav.OutOfProc/Languages/CSharp/Mappers/DelegateEventMapper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ public static class DelegateEventMapper
1010
{
1111
public static CodeItem MapDelegate(DelegateDeclarationSyntax member, SemanticModel semanticModel, CodeDocumentViewModel codeDocumentViewModel)
1212
{
13-
var item = BaseMapper.MapBase<CodeItem>(member, member.Identifier, member.Modifiers, semanticModel, codeDocumentViewModel);
13+
var item = BaseMapper.MapBase<CodeItem>(member, semanticModel, codeDocumentViewModel, member.Identifier, modifiers: member.Modifiers);
1414
item.Kind = CodeItemKindEnum.Delegate;
1515
item.Moniker = IconMapper.MapMoniker(item.Kind, item.Access);
1616
return item;
1717
}
1818

1919
public static CodeItem MapEvent(EventFieldDeclarationSyntax member, SemanticModel semanticModel, CodeDocumentViewModel codeDocumentViewModel)
2020
{
21-
var item = BaseMapper.MapBase<CodeItem>(member, member.Declaration.Variables.First().Identifier,
22-
member.Modifiers, semanticModel, codeDocumentViewModel);
21+
var item = BaseMapper.MapBase<CodeItem>(member, semanticModel, codeDocumentViewModel, member.Declaration.Variables.First().Identifier,
22+
modifiers: member.Modifiers);
2323
item.Kind = CodeItemKindEnum.Event;
2424
item.Moniker = IconMapper.MapMoniker(item.Kind, item.Access);
2525
return item;

src/CodeNav.OutOfProc/Languages/CSharp/Mappers/EnumMapper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class EnumMapper
1212
public static CodeItem MapEnumMember(EnumMemberDeclarationSyntax member,
1313
SemanticModel semanticModel, CodeDocumentViewModel codeDocumentViewModel)
1414
{
15-
var item = BaseMapper.MapBase<CodeItem>(member, member.Identifier, semanticModel, codeDocumentViewModel);
15+
var item = BaseMapper.MapBase<CodeItem>(member, semanticModel, codeDocumentViewModel, member.Identifier);
1616
item.Kind = CodeItemKindEnum.EnumMember;
1717
item.Moniker = IconMapper.MapMoniker(item.Kind, item.Access);
1818

@@ -22,7 +22,7 @@ public static CodeItem MapEnumMember(EnumMemberDeclarationSyntax member,
2222
public static CodeClassItem MapEnum(EnumDeclarationSyntax member,
2323
SemanticModel semanticModel, SyntaxTree tree, CodeDocumentViewModel codeDocumentViewModel)
2424
{
25-
var item = BaseMapper.MapBase<CodeClassItem>(member, member.Identifier, member.Modifiers, semanticModel, codeDocumentViewModel);
25+
var item = BaseMapper.MapBase<CodeClassItem>(member, semanticModel, codeDocumentViewModel, member.Identifier, modifiers: member.Modifiers);
2626
item.Kind = CodeItemKindEnum.Enum;
2727
item.Moniker = IconMapper.MapMoniker(item.Kind, item.Access);
2828
item.Parameters = MapMembersToString(member.Members);

src/CodeNav.OutOfProc/Languages/CSharp/Mappers/FieldMapper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public static class FieldMapper
1212
public static CodeItem MapField(FieldDeclarationSyntax member, SemanticModel semanticModel,
1313
CodeDocumentViewModel codeDocumentViewModel)
1414
{
15-
var item = BaseMapper.MapBase<CodeItem>(member, member.Declaration.Variables.First().Identifier,
16-
member.Modifiers, semanticModel, codeDocumentViewModel);
15+
var item = BaseMapper.MapBase<CodeItem>(member, semanticModel, codeDocumentViewModel, member.Declaration.Variables.First().Identifier,
16+
modifiers: member.Modifiers);
1717

1818
item.Kind = IsConstant(member.Modifiers)
1919
? CodeItemKindEnum.Constant

src/CodeNav.OutOfProc/Languages/CSharp/Mappers/IndexerMapper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class IndexerMapper
1111
public static CodeItem MapIndexer(IndexerDeclarationSyntax member,
1212
SemanticModel semanticModel, CodeDocumentViewModel codeDocumentViewModel)
1313
{
14-
var codeItem = BaseMapper.MapBase<CodeFunctionItem>(member, member.ThisKeyword, member.Modifiers, semanticModel, codeDocumentViewModel);
14+
var codeItem = BaseMapper.MapBase<CodeFunctionItem>(member, semanticModel, codeDocumentViewModel, member.ThisKeyword, modifiers: member.Modifiers);
1515

1616
codeItem.ReturnType = TypeMapper.Map(member.Type);
1717
codeItem.Parameters = ParameterMapper.MapParameters(member.ParameterList);

0 commit comments

Comments
 (0)