Skip to content

Commit 6aa537e

Browse files
committed
Visual Basic syntax highlighting support
1 parent 4a0eb3a commit 6aa537e

11 files changed

Lines changed: 160 additions & 77 deletions

SourceCodeReader.Web/Infrastructure/ApplicationNinjectModule.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using SourceCodeReader.Web.Services;
77
using SourceCodeReader.Web.Services.GitHub;
88
using SourceCodeReader.Web.LanguageServices;
9+
using SourceCodeReader.Web.LanguageServices.DotNet;
910

1011
namespace SourceCodeReader.Web.Infrastructure
1112
{

SourceCodeReader.Web/LanguageServices/CSharpSyntaxNavigationBuilder.cs

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

SourceCodeReader.Web/LanguageServices/CSharpCodeNavigationSyntaxWalker.cs renamed to SourceCodeReader.Web/LanguageServices/DotNet/CSharpCodeNavigationSyntaxWalker.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
using System.Web;
55
using Roslyn.Compilers.CSharp;
66

7-
namespace SourceCodeReader.Web.LanguageServices
7+
namespace SourceCodeReader.Web.LanguageServices.DotNet
88
{
9-
internal enum TokenKind
9+
public enum TokenKind
1010
{
1111
None,
1212
MethodCall,
@@ -16,16 +16,15 @@ internal enum TokenKind
1616
/// <summary>
1717
/// Idea copied from http://www.matlus.com/c-to-html-syntax-highlighter-using-roslyn/
1818
/// </summary>
19-
internal class CSharpCodeNavigationSyntaxWalker : SyntaxWalker
19+
public class CSharpCodeNavigationSyntaxWalker : SyntaxWalker, IDotNetSourceCodeNavigationSyntaxWalker
2020
{
21-
private SemanticModel semanticModel;
2221
private Action<TokenKind, string, int?> writeDelegate;
2322

24-
internal void DoVisit(SyntaxNode token, SemanticModel semanticModel, Action<TokenKind, string, int?> writeDelegate)
23+
public void DoVisit(string sourceCode, Action<TokenKind, string, int?> writeDelegate)
2524
{
26-
this.semanticModel = semanticModel;
25+
var syntaxTree = SyntaxTree.ParseCompilationUnit(sourceCode);
2726
this.writeDelegate = writeDelegate;
28-
Visit(token);
27+
Visit(syntaxTree.GetRoot());
2928
}
3029

3130
public override void VisitToken(SyntaxToken token)
@@ -67,9 +66,10 @@ private TokenKind GetTokenKind(SyntaxToken token)
6766
return TokenKind.ObjectCreation;
6867

6968
// string result = customer.GetFulleName();
70-
if (token.Parent.Parent.Kind == SyntaxKind.MemberAccessExpression
69+
if ((token.Parent.Parent.Kind == SyntaxKind.MemberAccessExpression
7170
&& token.Parent.Parent.Parent.Kind == SyntaxKind.InvocationExpression
72-
&& token.GetPreviousToken().Kind == SyntaxKind.DotToken)
71+
&& token.GetPreviousToken().Kind == SyntaxKind.DotToken) ||
72+
(token.Parent.Parent.Kind == SyntaxKind.InvocationExpression))
7373
return TokenKind.MethodCall;
7474

7575
return TokenKind.None;

SourceCodeReader.Web/LanguageServices/DotNetCodeEditorService.cs renamed to SourceCodeReader.Web/LanguageServices/DotNet/DotNetCodeEditorService.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
using Ninject.Extensions.Logging;
1111
using System.Threading.Tasks;
1212

13-
namespace SourceCodeReader.Web.LanguageServices
13+
namespace SourceCodeReader.Web.LanguageServices.DotNet
1414
{
1515
public class DotNetCodeEditorService : IEditorService
1616
{
@@ -32,15 +32,16 @@ public string BuildNavigatableSourceCodeFromFile(string filename)
3232
{
3333
var sourceCode = File.ReadAllText(filename);
3434
var fileExtension = Path.GetExtension(filename).ToLowerInvariant();
35-
35+
36+
ISyntaxNavigationBuilder syntaxNavigationBuilder = new DotNetSyntaxNavigationBuilder();
37+
3638
if (fileExtension == ".cs")
3739
{
38-
var syntaxHighlighter = new CSharpSyntaxNavigationBuilder();
39-
return syntaxHighlighter.GetCodeAsNavigatableHtml(sourceCode);
40+
return syntaxNavigationBuilder.GetCodeAsNavigatableHtml(sourceCode, new CSharpCodeNavigationSyntaxWalker());
4041
}
4142
else if (fileExtension == ".vb")
4243
{
43-
return sourceCode;
44+
return syntaxNavigationBuilder.GetCodeAsNavigatableHtml(sourceCode, new VisualBasicCodeNavigationSyntaxWalker());
4445
}
4546
else
4647
{
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Web;
5+
using System.Text;
6+
7+
namespace SourceCodeReader.Web.LanguageServices.DotNet
8+
{
9+
public class DotNetSyntaxNavigationBuilder : ISyntaxNavigationBuilder
10+
{
11+
public string GetCodeAsNavigatableHtml(string sourceCode, IDotNetSourceCodeNavigationSyntaxWalker syntaxWalker)
12+
{
13+
var htmlBuilder = new StringBuilder();
14+
syntaxWalker.DoVisit(sourceCode, (tk, text, start) =>
15+
{
16+
switch (tk)
17+
{
18+
case TokenKind.ObjectCreation:
19+
case TokenKind.MethodCall:
20+
htmlBuilder.Append(string.Format(@"<a href=""javascript:$.findReferences('{0}', '{1}', {2})"">{1}</a>", tk, text, start.GetValueOrDefault()));
21+
break;
22+
default:
23+
htmlBuilder.Append(System.Web.HttpUtility.HtmlEncode(text));
24+
break;
25+
}
26+
});
27+
28+
return htmlBuilder.ToString();
29+
}
30+
}
31+
}

SourceCodeReader.Web/LanguageServices/FindReferenceSyntaxWalker.cs renamed to SourceCodeReader.Web/LanguageServices/DotNet/FindReferenceSyntaxWalker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using Roslyn.Compilers.CSharp;
77
using Roslyn.Compilers.CSharp.Retargeting;
88

9-
namespace SourceCodeReader.Web.LanguageServices
9+
namespace SourceCodeReader.Web.LanguageServices.DotNet
1010
{
1111
internal class FindReferenceSyntaxWalker : CommonSyntaxWalker
1212
{
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace SourceCodeReader.Web.LanguageServices.DotNet
2+
{
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
8+
public interface IDotNetSourceCodeNavigationSyntaxWalker
9+
{
10+
void DoVisit(string sourceCode, Action<TokenKind, string, int?> writeDelegate);
11+
}
12+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Web;
5+
using Roslyn.Compilers.VisualBasic;
6+
7+
namespace SourceCodeReader.Web.LanguageServices.DotNet
8+
{
9+
public class VisualBasicCodeNavigationSyntaxWalker : SyntaxWalker, IDotNetSourceCodeNavigationSyntaxWalker
10+
{
11+
private Action<TokenKind, string, int?> writeDelegate;
12+
13+
public void DoVisit(string sourceCode, Action<TokenKind, string, int?> writeDelegate)
14+
{
15+
var syntaxTree = SyntaxTree.ParseCompilationUnit(sourceCode);
16+
this.writeDelegate = writeDelegate;
17+
Visit(syntaxTree.GetRoot());
18+
}
19+
20+
public override void VisitToken(SyntaxToken token)
21+
{
22+
VisitLeadingTrivia(token);
23+
bool isProcessed = false;
24+
25+
switch (token.Kind)
26+
{
27+
case SyntaxKind.IdentifierToken:
28+
writeDelegate(this.GetTokenKind(token), token.GetText(), token.Span.Start);
29+
isProcessed = true;
30+
break;
31+
default:
32+
writeDelegate(TokenKind.None, token.GetText(), null);
33+
isProcessed = true;
34+
break;
35+
}
36+
37+
if (!isProcessed)
38+
{
39+
writeDelegate(TokenKind.None, token.GetText(), null);
40+
}
41+
base.VisitTrailingTrivia(token);
42+
}
43+
44+
private TokenKind GetTokenKind(SyntaxToken token)
45+
{
46+
// Customer customer = new Customer();
47+
if (token.Parent.Parent.Kind == SyntaxKind.ObjectCreationExpression)
48+
return TokenKind.ObjectCreation;
49+
50+
// string result = customer.GetFulleName();
51+
if ((token.Parent.Parent.Kind == SyntaxKind.MemberAccessExpression
52+
&& token.Parent.Parent.Parent.Kind == SyntaxKind.InvocationExpression
53+
&& token.GetPreviousToken().Kind == SyntaxKind.DotToken) ||
54+
(token.Parent.Parent.Kind == SyntaxKind.InvocationExpression))
55+
return TokenKind.MethodCall;
56+
57+
return TokenKind.None;
58+
}
59+
60+
// Handle SyntaxTrivia
61+
public override void VisitTrivia(SyntaxTrivia trivia)
62+
{
63+
switch (trivia.Kind)
64+
{
65+
case SyntaxKind.CommentTrivia:
66+
case SyntaxKind.DisabledTextTrivia:
67+
case SyntaxKind.DocumentationComment:
68+
case SyntaxKind.RegionDirective:
69+
case SyntaxKind.EndRegionDirective:
70+
default:
71+
writeDelegate(TokenKind.None, trivia.GetFullText(), null);
72+
break;
73+
}
74+
base.VisitTrivia(trivia);
75+
}
76+
}
77+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
using SourceCodeReader.Web.LanguageServices.DotNet;
3+
4+
namespace SourceCodeReader.Web.LanguageServices
5+
{
6+
public interface ISyntaxNavigationBuilder
7+
{
8+
string GetCodeAsNavigatableHtml(string sourceCode, IDotNetSourceCodeNavigationSyntaxWalker syntaxWalker);
9+
}
10+
}

SourceCodeReader.Web/SourceCodeReader.Web.csproj

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,15 @@
196196
<Compile Include="Infrastructure\IApplicationConfigurationProvider.cs" />
197197
<Compile Include="Infrastructure\NinjectDependencyResolver.cs" />
198198
<Compile Include="Infrastructure\NinjectScope.cs" />
199-
<Compile Include="LanguageServices\CSharpSyntaxNavigationBuilder.cs" />
200-
<Compile Include="LanguageServices\DotNetCodeEditorService.cs" />
201-
<Compile Include="LanguageServices\CSharpCodeNavigationSyntaxWalker.cs" />
199+
<Compile Include="LanguageServices\DotNet\DotNetSyntaxNavigationBuilder.cs" />
200+
<Compile Include="LanguageServices\DotNet\DotNetCodeEditorService.cs" />
201+
<Compile Include="LanguageServices\DotNet\CSharpCodeNavigationSyntaxWalker.cs" />
202202
<Compile Include="LanguageServices\DefaultFindReferenceProgressListener.cs" />
203-
<Compile Include="LanguageServices\FindReferenceSyntaxWalker.cs" />
203+
<Compile Include="LanguageServices\DotNet\FindReferenceSyntaxWalker.cs" />
204+
<Compile Include="LanguageServices\DotNet\IDotNetSourceCodeNavigationSyntaxWalker.cs" />
204205
<Compile Include="LanguageServices\IFindReferenceProgress.cs" />
206+
<Compile Include="LanguageServices\ISyntaxNavigationBuilder.cs" />
207+
<Compile Include="LanguageServices\DotNet\VisualBasicCodeNavigationSyntaxWalker.cs" />
205208
<Compile Include="Models\FindReferenceParameter.cs" />
206209
<Compile Include="Models\FindReferenceResult.cs" />
207210
<Compile Include="Models\Project.cs" />

0 commit comments

Comments
 (0)