You've already forked linux-packaging-mono
Imported Upstream version 4.6.0.125
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
This commit is contained in:
parent
a569aebcfd
commit
e79aa3c0ed
@@ -0,0 +1,155 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <copyright file="InputScopeManager.cs" company="Microsoft">
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// </copyright>
|
||||
// <owner current="true" primary="true">[....]</owner>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace System.Xml.Xsl.XsltOld {
|
||||
using Res = System.Xml.Utils.Res;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Xml;
|
||||
using System.Xml.XPath;
|
||||
|
||||
internal class InputScopeManager {
|
||||
private InputScope scopeStack;
|
||||
private string defaultNS = string.Empty;
|
||||
private XPathNavigator navigator; // We need this nsvigator for document() function implementation
|
||||
|
||||
public InputScopeManager(XPathNavigator navigator, InputScope rootScope) {
|
||||
this.navigator = navigator;
|
||||
this.scopeStack = rootScope;
|
||||
}
|
||||
|
||||
internal InputScope CurrentScope {
|
||||
get { return this.scopeStack; }
|
||||
}
|
||||
|
||||
internal InputScope VariableScope {
|
||||
get {
|
||||
Debug.Assert(this.scopeStack != null);
|
||||
Debug.Assert(this.scopeStack.Parent != null);
|
||||
return this.scopeStack.Parent;
|
||||
}
|
||||
}
|
||||
|
||||
internal InputScopeManager Clone() {
|
||||
InputScopeManager manager = new InputScopeManager(this.navigator, null);
|
||||
manager.scopeStack = this.scopeStack;
|
||||
manager.defaultNS = this.defaultNS;
|
||||
return manager;
|
||||
}
|
||||
|
||||
public XPathNavigator Navigator {
|
||||
get {return this.navigator;}
|
||||
}
|
||||
|
||||
internal InputScope PushScope() {
|
||||
this.scopeStack = new InputScope(this.scopeStack);
|
||||
return this.scopeStack;
|
||||
}
|
||||
|
||||
internal void PopScope() {
|
||||
Debug.Assert(this.scopeStack != null, "Push/Pop disbalance");
|
||||
if (this.scopeStack == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (NamespaceDecl scope = this.scopeStack.Scopes; scope != null; scope = scope.Next) {
|
||||
this.defaultNS = scope.PrevDefaultNsUri;
|
||||
}
|
||||
|
||||
this.scopeStack = this.scopeStack.Parent;
|
||||
}
|
||||
|
||||
internal void PushNamespace(string prefix, string nspace) {
|
||||
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
|
||||
Debug.Assert(prefix != null);
|
||||
Debug.Assert(nspace != null);
|
||||
this.scopeStack.AddNamespace(prefix, nspace, this.defaultNS);
|
||||
|
||||
if (prefix == null || prefix.Length == 0) {
|
||||
this.defaultNS = nspace;
|
||||
}
|
||||
}
|
||||
|
||||
// CompileContext
|
||||
|
||||
public string DefaultNamespace {
|
||||
get { return this.defaultNS; }
|
||||
}
|
||||
|
||||
private string ResolveNonEmptyPrefix(string prefix) {
|
||||
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
|
||||
Debug.Assert(!string.IsNullOrEmpty(prefix));
|
||||
if (prefix == "xml") {
|
||||
return XmlReservedNs.NsXml;
|
||||
}
|
||||
else if (prefix == "xmlns") {
|
||||
return XmlReservedNs.NsXmlNs;
|
||||
}
|
||||
|
||||
for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
|
||||
string nspace = inputScope.ResolveNonAtom(prefix);
|
||||
if (nspace != null) {
|
||||
return nspace;
|
||||
}
|
||||
}
|
||||
throw XsltException.Create(Res.Xslt_InvalidPrefix, prefix);
|
||||
}
|
||||
|
||||
public string ResolveXmlNamespace(string prefix) {
|
||||
Debug.Assert(prefix != null);
|
||||
if (prefix.Length == 0) {
|
||||
return this.defaultNS;
|
||||
}
|
||||
return ResolveNonEmptyPrefix(prefix);
|
||||
}
|
||||
|
||||
public string ResolveXPathNamespace(string prefix) {
|
||||
Debug.Assert(prefix != null);
|
||||
if (prefix.Length == 0) {
|
||||
return string.Empty;
|
||||
}
|
||||
return ResolveNonEmptyPrefix(prefix);
|
||||
}
|
||||
|
||||
internal void InsertExtensionNamespaces(string[] nsList) {
|
||||
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
|
||||
Debug.Assert(nsList != null);
|
||||
for (int idx = 0; idx < nsList.Length; idx++) {
|
||||
this.scopeStack.InsertExtensionNamespace(nsList[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
internal bool IsExtensionNamespace(String nspace) {
|
||||
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
|
||||
for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
|
||||
if (inputScope.IsExtensionNamespace( nspace )) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
internal void InsertExcludedNamespaces(string[] nsList) {
|
||||
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
|
||||
Debug.Assert(nsList != null);
|
||||
for (int idx = 0; idx < nsList.Length; idx++) {
|
||||
this.scopeStack.InsertExcludedNamespace(nsList[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
internal bool IsExcludedNamespace(String nspace) {
|
||||
Debug.Assert(this.scopeStack != null, "PushScope wasn't called");
|
||||
for (InputScope inputScope = this.scopeStack; inputScope != null; inputScope = inputScope.Parent) {
|
||||
if (inputScope.IsExcludedNamespace( nspace )) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user