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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
//------------------------------------------------------------------------------
// <copyright file="ParseRecorder.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
namespace System.Web.UI {
using System.CodeDom;
using System.Collections.Generic;
using System.Text.RegularExpressions;
/// <summary>
/// Abstract base class for an object that wants to be notified of parse
/// events during page parsing.
/// </summary>
public abstract class ParseRecorder {
internal static readonly ParseRecorder Null = new NullParseRecorder();
private static List<Func<ParseRecorder>> _factories;
/// <summary>
/// Functions added to this list are called to instantiate ParseRecorders
/// for each TemplateParser.
/// </summary>
public static IList<Func<ParseRecorder>> RecorderFactories {
get {
if (_factories == null) {
_factories = new List<Func<ParseRecorder>>();
}
return _factories;
}
}
internal static ParseRecorder CreateRecorders(TemplateParser parser) {
if (_factories == null) {
return ParseRecorder.Null;
}
List<ParseRecorder> recorders = new List<ParseRecorder>();
foreach (Func<ParseRecorder> factory in _factories) {
ParseRecorder recorder = factory();
if (recorder != null) {
recorders.Add(recorder);
}
}
ParseRecorderList list = new ParseRecorderList(recorders);
list.Initialize(parser);
return list;
}
/// <summary>
/// Called to initialize the listener.
/// </summary>
public virtual void Initialize(TemplateParser parser) {
}
/// <summary>
/// Called when the TemplateParser encounters a web control start tag
/// </summary>
public virtual void RecordBeginTag(ControlBuilder builder, Match tag) {
}
/// <summary>
/// Called when the TemplateParser encounters a web control end tag
/// </summary>
public virtual void RecordEndTag(ControlBuilder builder, Match tag) {
}
/// <summary>
/// Called when the TemplateParser encounters a web control empty tag
/// </summary>
public virtual void RecordEmptyTag(ControlBuilder builder, Match tag) {
}
/// <summary>
/// Called when the TemplateParser encounters a code block
/// </summary>
public virtual void RecordCodeBlock(ControlBuilder builder, Match codeBlock) {
}
/// <summary>
/// Called when the TemplateParser is finished parsing the file
/// </summary>
public virtual void ParseComplete(ControlBuilder root) {
}
/// <summary>
/// Enables the ParseRecorder to access the generated CodeDom and insert
/// and modify code
/// </summary>
public virtual void ProcessGeneratedCode(
ControlBuilder builder,
CodeCompileUnit codeCompileUnit,
CodeTypeDeclaration baseType,
CodeTypeDeclaration derivedType,
CodeMemberMethod buildMethod,
CodeMemberMethod dataBindingMethod) {
}
private sealed class NullParseRecorder : ParseRecorder {
}
private sealed class ParseRecorderList : ParseRecorder {
private readonly IEnumerable<ParseRecorder> _recorders;
internal ParseRecorderList(IEnumerable<ParseRecorder> recorders) {
_recorders = recorders;
}
public override void Initialize(TemplateParser parser) {
foreach (ParseRecorder recorder in _recorders) {
recorder.Initialize(parser);
}
}
public override void RecordBeginTag(ControlBuilder builder, Match tag) {
foreach (ParseRecorder recorder in _recorders) {
recorder.RecordBeginTag(builder, tag);
}
}
public override void RecordEndTag(ControlBuilder builder, Match tag) {
foreach (ParseRecorder recorder in _recorders) {
recorder.RecordEndTag(builder, tag);
}
}
public override void RecordEmptyTag(ControlBuilder builder, Match tag) {
foreach (ParseRecorder recorder in _recorders) {
recorder.RecordEmptyTag(builder, tag);
}
}
public override void RecordCodeBlock(ControlBuilder builder, Match codeBlock) {
foreach (ParseRecorder recorder in _recorders) {
recorder.RecordCodeBlock(builder, codeBlock);
}
}
public override void ParseComplete(ControlBuilder root) {
foreach (ParseRecorder recorder in _recorders) {
recorder.ParseComplete(root);
}
}
public override void ProcessGeneratedCode(ControlBuilder builder, CodeCompileUnit codeCompileUnit, CodeTypeDeclaration baseType, CodeTypeDeclaration derivedType, CodeMemberMethod buildMethod, CodeMemberMethod dataBindingMethod) {
foreach (ParseRecorder recorder in _recorders) {
recorder.ProcessGeneratedCode(builder, codeCompileUnit, baseType, derivedType, buildMethod, dataBindingMethod);
}
}
}
}
}
|