forked from aspnet/AspNetWebStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCallbackVisitor.cs
More file actions
96 lines (83 loc) · 3.1 KB
/
CallbackVisitor.cs
File metadata and controls
96 lines (83 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading;
using System.Web.Razor.Parser.SyntaxTree;
namespace System.Web.Razor.Parser
{
public class CallbackVisitor : ParserVisitor
{
private Action<Span> _spanCallback;
private Action<RazorError> _errorCallback;
private Action<BlockType> _endBlockCallback;
private Action<BlockType> _startBlockCallback;
private Action _completeCallback;
public CallbackVisitor(Action<Span> spanCallback)
: this(spanCallback, _ =>
{
})
{
}
public CallbackVisitor(Action<Span> spanCallback, Action<RazorError> errorCallback)
: this(spanCallback, errorCallback, _ =>
{
}, _ =>
{
})
{
}
public CallbackVisitor(Action<Span> spanCallback, Action<RazorError> errorCallback, Action<BlockType> startBlockCallback, Action<BlockType> endBlockCallback)
: this(spanCallback, errorCallback, startBlockCallback, endBlockCallback, () =>
{
})
{
}
public CallbackVisitor(Action<Span> spanCallback, Action<RazorError> errorCallback, Action<BlockType> startBlockCallback, Action<BlockType> endBlockCallback, Action completeCallback)
{
_spanCallback = spanCallback;
_errorCallback = errorCallback;
_startBlockCallback = startBlockCallback;
_endBlockCallback = endBlockCallback;
_completeCallback = completeCallback;
}
public SynchronizationContext SynchronizationContext { get; set; }
public override void VisitStartBlock(Block block)
{
base.VisitStartBlock(block);
RaiseCallback(SynchronizationContext, block.Type, _startBlockCallback);
}
public override void VisitSpan(Span span)
{
base.VisitSpan(span);
RaiseCallback(SynchronizationContext, span, _spanCallback);
}
public override void VisitEndBlock(Block block)
{
base.VisitEndBlock(block);
RaiseCallback(SynchronizationContext, block.Type, _endBlockCallback);
}
public override void VisitError(RazorError err)
{
base.VisitError(err);
RaiseCallback(SynchronizationContext, err, _errorCallback);
}
public override void OnComplete()
{
base.OnComplete();
RaiseCallback<object>(SynchronizationContext, null, _ => _completeCallback());
}
private static void RaiseCallback<T>(SynchronizationContext syncContext, T param, Action<T> callback)
{
if (callback != null)
{
if (syncContext != null)
{
syncContext.Post(state => callback((T)state), param);
}
else
{
callback(param);
}
}
}
}
}