// 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; using System.Threading; using Microsoft.AspNet.Razor.Parser.SyntaxTree; namespace Microsoft.AspNet.Razor.Parser { public class CallbackVisitor : ParserVisitor { private Action _spanCallback; private Action _errorCallback; private Action _endBlockCallback; private Action _startBlockCallback; private Action _completeCallback; public CallbackVisitor(Action spanCallback) : this(spanCallback, _ => { }) { } public CallbackVisitor(Action spanCallback, Action errorCallback) : this(spanCallback, errorCallback, _ => { }, _ => { }) { } public CallbackVisitor(Action spanCallback, Action errorCallback, Action startBlockCallback, Action endBlockCallback) : this(spanCallback, errorCallback, startBlockCallback, endBlockCallback, () => { }) { } public CallbackVisitor(Action spanCallback, Action errorCallback, Action startBlockCallback, Action 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(SynchronizationContext, null, _ => _completeCallback()); } private static void RaiseCallback(SynchronizationContext syncContext, T param, Action callback) { if (callback != null) { if (syncContext != null) { syncContext.Post(state => callback((T)state), param); } else { callback(param); } } } } }