public static PseudoCallExpression ToPseudoCallExpression(this XElement e) { // we need a factory or context for equality var XElement = new SolutionProjectLanguageType { Namespace = "System.Xml.Linq", Name = "XElement" }; var XAttribute = new SolutionProjectLanguageType { Namespace = "System.Xml.Linq", Name = "XAttribute" }; var XName = new SolutionProjectLanguageType { Namespace = "System.Xml.Linq", Name = "XName" }; var XComment = new SolutionProjectLanguageType { Namespace = "System.Xml.Linq", Name = "XComment" }; #region XNameFromString Func <string, PseudoCallExpression> XNameFromString = Name => { return(new PseudoCallExpression { Method = new SolutionProjectLanguageMethod { DeclaringType = XName, IsStatic = true, Name = SolutionProjectLanguageMethod.op_Implicit }, ParameterExpressions = new[] { new PseudoStringConstantExpression { Value = Name } } }); }; #endregion var CreateXElement = default(Func <XElement, PseudoCallExpression>); Func <XElement, object[]> GetParameters = ee => { var NewParameters = new ArrayList(); NewParameters.Add(XNameFromString(ee.Name.LocalName)); var Content = new PseudoArrayExpression(); Content.ElementType = new SolutionProjectLanguageType { Name = "object" }; foreach (var item in ee.Attributes().ToArray()) { Content.Items.Add( new PseudoCallExpression { Method = new SolutionProjectLanguageMethod { Name = SolutionProjectLanguageMethod.ConstructorName, DeclaringType = XAttribute, ReturnType = XAttribute }, ParameterExpressions = new object [] { XNameFromString(item.Name.LocalName), new PseudoStringConstantExpression { Value = item.Value } } } ); } foreach (var item in ee.Nodes().ToArray()) { var _XText = item as XText; if (_XText != null) { Content.Items.Add( new PseudoStringConstantExpression { Value = _XText.Value } ); } var _XElement = item as XElement; if (_XElement != null) { Content.Items.Add( CreateXElement(_XElement) ); } var _XComment = item as XComment; if (_XComment != null) { Content.Items.Add( new PseudoCallExpression { Method = new SolutionProjectLanguageMethod { Name = SolutionProjectLanguageMethod.ConstructorName, DeclaringType = XComment, ReturnType = XComment }, ParameterExpressions = new object[] { new PseudoStringConstantExpression { Value = _XComment.Value } } } ); } } NewParameters.Add(Content); return(NewParameters.ToArray()); }; CreateXElement = ee => { return(new PseudoCallExpression { XLinq = ee, Method = new SolutionProjectLanguageMethod { Name = SolutionProjectLanguageMethod.ConstructorName, DeclaringType = XElement, ReturnType = XElement }, ParameterExpressions = GetParameters(ee) }); }; return(CreateXElement(e)); }
public static PseudoCallExpression ToPseudoCallExpression(this XElement e) { // we need a factory or context for equality var XElement = new SolutionProjectLanguageType { Namespace = "System.Xml.Linq", Name = "XElement" }; var XAttribute = new SolutionProjectLanguageType { Namespace = "System.Xml.Linq", Name = "XAttribute" }; var XName = new SolutionProjectLanguageType { Namespace = "System.Xml.Linq", Name = "XName" }; var XComment = new SolutionProjectLanguageType { Namespace = "System.Xml.Linq", Name = "XComment" }; #region XNameFromString Func<string, PseudoCallExpression> XNameFromString = Name => { return new PseudoCallExpression { Method = new SolutionProjectLanguageMethod { DeclaringType = XName, IsStatic = true, Name = SolutionProjectLanguageMethod.op_Implicit }, ParameterExpressions = new[] { new PseudoStringConstantExpression { Value = Name } } }; }; #endregion var CreateXElement = default(Func<XElement, PseudoCallExpression>); Func<XElement, object[]> GetParameters = ee => { var NewParameters = new ArrayList(); NewParameters.Add(XNameFromString(ee.Name.LocalName)); var Content = new PseudoArrayExpression(); Content.ElementType = new SolutionProjectLanguageType { Name = "object" }; foreach (var item in ee.Attributes().ToArray()) { Content.Items.Add( new PseudoCallExpression { Method = new SolutionProjectLanguageMethod { Name = SolutionProjectLanguageMethod.ConstructorName, DeclaringType = XAttribute, ReturnType = XAttribute }, ParameterExpressions = new object [] { XNameFromString(item.Name.LocalName), new PseudoStringConstantExpression { Value = item.Value } } } ); } foreach (var item in ee.Nodes().ToArray()) { var _XText = item as XText; if (_XText != null) { Content.Items.Add( new PseudoStringConstantExpression { Value = _XText.Value } ); } var _XElement = item as XElement; if (_XElement != null) { Content.Items.Add( CreateXElement(_XElement) ); } var _XComment = item as XComment; if (_XComment != null) { Content.Items.Add( new PseudoCallExpression { Method = new SolutionProjectLanguageMethod { Name = SolutionProjectLanguageMethod.ConstructorName, DeclaringType = XComment, ReturnType = XComment }, ParameterExpressions = new object[] { new PseudoStringConstantExpression { Value = _XComment.Value } } } ); } } NewParameters.Add(Content); return NewParameters.ToArray(); }; CreateXElement = ee => { return new PseudoCallExpression { XLinq = ee, Method = new SolutionProjectLanguageMethod { Name = SolutionProjectLanguageMethod.ConstructorName, DeclaringType = XElement, ReturnType = XElement }, ParameterExpressions = GetParameters(ee) }; }; return CreateXElement(e); }