Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
XPathPatternBuilder.cs
Go to the documentation of this file.
6
7namespace System.Xml.Xsl.Xslt;
8
9internal sealed class XPathPatternBuilder : XPathPatternParser.IPatternBuilder, IXPathBuilder<QilNode>
10{
11 private sealed class Annotation
12 {
13 public double Priority;
14
16 }
17
19 {
21
22 private readonly XPathQilFactory _f;
23
25
26 private readonly QilNode _fixupCurrent;
27
28 private readonly QilNode _fixupPosition;
29
30 private readonly QilNode _fixupLast;
31
32 public int numFixupCurrent;
33
34 public int numFixupPosition;
35
36 public int numFixupLast;
37
39
49
50 public QilNode ResolveVariable(string prefix, string name)
51 {
53 }
54
56 {
58 }
59
60 public string ResolvePrefix(string prefix)
61 {
63 }
64
66 {
68 return _fixupCurrent;
69 }
70
72 {
74 return _fixupPosition;
75 }
76
78 {
80 return _fixupLast;
81 }
82 }
83
84 private sealed class XsltFunctionFocus : IFocus
85 {
86 private readonly QilIterator _current;
87
89 {
90 _current = current;
91 }
92
94 {
95 return _current;
96 }
97
99 {
100 return null;
101 }
102
104 {
105 return null;
106 }
107 }
108
110
112
113 private bool _inTheBuild;
114
115 private readonly XPathQilFactory _f;
116
117 private readonly QilNode _fixupNode;
118
120
122
131
132 public void StartBuild()
133 {
134 _inTheBuild = true;
135 }
136
141
142 [return: NotNullIfNotNull("result")]
143 public QilNode EndBuild(QilNode result)
144 {
145 _inTheBuild = false;
146 return result;
147 }
148
150 {
151 if (left.NodeType == QilNodeType.Sequence)
152 {
153 ((QilList)left).Add(right);
154 return left;
155 }
156 return _f.Sequence(left, right);
157 }
158
159 private static QilLoop BuildAxisFilter(QilPatternFactory f, QilIterator itr, XPathAxis xpathAxis, XPathNodeType nodeType, string name, string nsUri)
160 {
161 QilNode right = ((name != null && nsUri != null) ? f.Eq(f.NameOf(itr), f.QName(name, nsUri)) : ((nsUri != null) ? f.Eq(f.NamespaceUriOf(itr), f.String(nsUri)) : ((name != null) ? f.Eq(f.LocalNameOf(itr), f.String(name)) : f.True())));
163 QilNode left = ((xmlNodeKindFlags == XmlNodeKindFlags.None) ? f.False() : ((xmlNodeKindFlags == itr.XmlType.NodeKinds) ? f.True() : f.IsType(itr, XmlQueryTypeFactory.NodeChoice(xmlNodeKindFlags))));
164 QilLoop qilLoop = f.BaseFactory.Filter(itr, f.And(left, right));
166 return qilLoop;
167 }
168
169 public QilNode Axis(XPathAxis xpathAxis, XPathNodeType nodeType, string prefix, string name)
170 {
172 double priority;
173 switch (xpathAxis)
174 {
175 case XPathAxis.DescendantOrSelf:
176 return _f.Nop(_fixupNode);
177 case XPathAxis.Root:
178 {
179 QilIterator expr;
181 priority = 0.5;
182 break;
183 }
184 default:
185 {
186 string nsUri = ((prefix == null) ? null : _environment.ResolvePrefix(prefix));
187 qilLoop = BuildAxisFilter(_f, _f.For(_fixupNode), xpathAxis, nodeType, name, nsUri);
188 switch (nodeType)
189 {
190 case XPathNodeType.Element:
191 case XPathNodeType.Attribute:
192 priority = ((name == null) ? ((prefix == null) ? (-0.5) : (-0.25)) : 0.0);
193 break;
194 case XPathNodeType.ProcessingInstruction:
195 priority = ((name != null) ? 0.0 : (-0.5));
196 break;
197 default:
198 priority = -0.5;
199 break;
200 }
201 break;
202 }
203 }
206 return qilLoop;
207 }
208
209 public QilNode JoinStep(QilNode left, QilNode right)
210 {
211 if (left.NodeType == QilNodeType.Nop)
212 {
213 QilUnary qilUnary = (QilUnary)left;
214 qilUnary.Child = right;
215 return qilUnary;
216 }
217 CleanAnnotation(left);
218 QilLoop qilLoop = (QilLoop)left;
219 bool flag = false;
220 if (right.NodeType == QilNodeType.Nop)
221 {
222 flag = true;
223 QilUnary qilUnary2 = (QilUnary)right;
224 right = qilUnary2.Child;
225 }
227 FixupFilterBinding(qilLoop, flag ? _f.Ancestor(lastParent.Variable) : _f.Parent(lastParent.Variable));
229 SetPriority(right, 0.5);
230 SetLastParent(right, qilLoop);
231 return right;
232 }
233
235 {
236 return null;
237 }
238
240 {
242 foreach (QilNode predicate in predicates)
243 {
245 }
247 QilIterator variable = qilLoop.Variable;
249 {
250 foreach (QilNode item in list)
251 {
252 qilLoop.Body = _f.And(qilLoop.Body, item);
253 }
255 }
256 else
257 {
264 foreach (QilNode item2 in list)
265 {
267 }
270 qilLoop.Body = _f.Not(_f.IsEmpty(set));
271 qilLoop.Body = _f.And(_f.IsType(variable, qilLoop.XmlType), qilLoop.Body);
272 }
273 SetPriority(nodeset, 0.5);
274 return nodeset;
275 }
276
287
288 public QilNode String(string value)
289 {
290 return _f.String(value);
291 }
292
293 public QilNode Number(double value)
294 {
296 }
297
298 public QilNode Variable(string prefix, string name)
299 {
301 }
302
303 public static void SetPriority(QilNode node, double priority)
304 {
305 Annotation annotation = ((Annotation)node.Annotation) ?? new Annotation();
307 node.Annotation = annotation;
308 }
309
310 public static double GetPriority(QilNode node)
311 {
312 return ((Annotation)node.Annotation).Priority;
313 }
314
315 private static void SetLastParent(QilNode node, QilLoop parent)
316 {
317 Annotation annotation = ((Annotation)node.Annotation) ?? new Annotation();
318 annotation.Parent = parent;
319 node.Annotation = annotation;
320 }
321
323 {
324 return ((Annotation)node.Annotation).Parent;
325 }
326
327 public static void CleanAnnotation(QilNode node)
328 {
329 node.Annotation = null;
330 }
331
337}
static string Xml_InternalError
Definition SR.cs:54
Definition SR.cs:7
QilLoop Filter(QilNode variable, QilNode body)
virtual void Add(QilNode node)
Definition QilNode.cs:121
QilIterator For(QilNode binding)
QilNode Filter(QilIterator variable, QilNode expr)
QilNode IsType(QilNode expr, XmlQueryType t)
QilNode Loop(QilIterator variable, QilNode body)
QilNode Is(QilNode left, QilNode right)
QilNode And(QilNode left, QilNode right)
QilName QName(string local, string uri, string prefix)
QilNode Eq(QilNode left, QilNode right)
static XmlNodeKindFlags AxisTypeMask(XmlNodeKindFlags inputTypeMask, XPathNodeType nodeType, XPathAxis xpathAxis)
static QilNode BuildOnePredicate(QilNode nodeset, QilNode predicate, bool isReverseStep, XPathQilFactory f, FixupVisitor fixupVisitor, ref int numFixupCurrent, ref int numFixupPosition, ref int numFixupLast)
static QilNode PredicateToBoolean(QilNode predicate, XPathQilFactory f, IXPathEnvironment env)
QilNode Id(QilNode context, QilNode id)
static readonly XmlQueryType DoubleX
static readonly XmlQueryType NodeNotRtfS
static XmlQueryType PrimeProduct(XmlQueryType t, XmlQueryCardinality c)
static XmlQueryType NodeChoice(XmlNodeKindFlags kinds)
static readonly XmlQueryType Document
static readonly XmlQueryType NodeNotRtf
QilNode ResolveFunction(string prefix, string name, IList< QilNode > args, IFocus env)
static QilLoop BuildAxisFilter(QilPatternFactory f, QilIterator itr, XPathAxis xpathAxis, XPathNodeType nodeType, string name, string nsUri)
readonly XPathPredicateEnvironment _predicateEnvironment
QilNode Operator(XPathOperator op, QilNode left, QilNode right)
IXPathBuilder< QilNode > GetPredicateBuilder(QilNode ctx)
QilNode Axis(XPathAxis xpathAxis, XPathNodeType nodeType, string prefix, string name)
QilNode Variable(string prefix, string name)
QilNode Function(string prefix, string name, IList< QilNode > args)
static QilLoop GetLastParent(QilNode node)
static void SetPriority(QilNode node, double priority)
QilNode BuildPredicates(QilNode nodeset, List< QilNode > predicates)
XPathPatternBuilder(IXPathEnvironment environment)
void FixupFilterBinding(QilLoop filter, QilNode newBinding)
static void SetLastParent(QilNode node, QilLoop parent)
QilNode JoinStep(QilNode left, QilNode right)
QilNode ResolveFunction(string prefix, string name, IList< QilNode > args, IFocus env)
QilNode ResolveVariable(string prefix, string name)
string ResolvePrefix(string prefix)