MegaBites-AI/Windows-powershell
0308
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System.Collections.Concurrent;5using System.Collections.Generic;6using System.Collections.ObjectModel;7using System.ComponentModel;8using System.Diagnostics;9using System.Globalization;10using System.IO;11using System.Linq;12using System.Management.Automation.Host;13using System.Management.Automation.Internal;14using System.Management.Automation.Language;15using System.Reflection;16using System.Runtime.Serialization;17using System.Security;18using System.Security.Permissions;19using System.Xml;20 21using Dbg = System.Diagnostics.Debug;22 23#pragma warning disable 1634, 1691 // Stops compiler from warning about unknown warnings24 25namespace System.Management.Automation.Runspaces26{27 // ReSharper disable RedundantCast28 internal class TypesPs1xmlReader29 {30 public TypesPs1xmlReader(LoadContext context)31 {32 _context = context;33 _reader = context.reader;34 _readerLineInfo = (IXmlLineInfo)context.reader;35 InitIDs();36 }37 38 private readonly LoadContext _context;39 private readonly XmlReader _reader;40 private readonly IXmlLineInfo _readerLineInfo;41 42 #region Helpers43 44 private string ReadElementString(string nodeName)45 {46 // This code is based on XmlReader.ReadElementString, which is not available in CoreCLR.47 string result = string.Empty;48 49 if (_reader.MoveToContent() != XmlNodeType.Element)50 {51 _context.AddError(_readerLineInfo.LineNumber, TypesXmlStrings.NodeShouldHaveInnerText, nodeName);52 return null;53 }54 55 if (!_reader.IsEmptyElement)56 {57 _reader.Read();58 while (_reader.NodeType == XmlNodeType.Text)59 {60 result += _reader.Value;61 if (!_reader.Read())62 {63 break;64 }65 }66 67 if (_reader.NodeType != XmlNodeType.EndElement)68 {69 _context.AddError(_readerLineInfo.LineNumber, TypesXmlStrings.NodeShouldHaveInnerText, nodeName);70 return null;71 }72 73 result = result.Trim();74 _reader.Read();75 }76 else77 {78 _reader.Read();79 }80 81 if (string.IsNullOrWhiteSpace(result))82 {83 _context.AddError(_readerLineInfo.LineNumber, TypesXmlStrings.NodeShouldHaveInnerText, nodeName);84 return null;85 }86 87 return result;88 }89 90 private bool? ReadIsHiddenAttribute()91 {92 bool? isHidden = default(bool?);93 94 while (_reader.MoveToNextAttribute())95 {96 if (!isHidden.HasValue && (object)_reader.LocalName == (object)_idIsHidden)97 {98 isHidden = ToBoolean(_reader.Value);99 }100 101 // Unknown attributes are ignored.102 }103 104 return isHidden;105 }106 107 private void ReadIsHiddenAttributeNotSupported(string node)108 {109 if (ReadIsHiddenAttribute().HasValue)110 {111 _context.AddError(TypesXmlStrings.IsHiddenNotSupported, node, _idIsHidden);112 }113 }114 115 private void ReadEndElement()116 {117 while (_reader.NodeType == XmlNodeType.Whitespace)118 {119 _reader.Skip();120 }121 122 if (_reader.NodeType == XmlNodeType.None)123 {124 _reader.Skip();125 }126 else127 {128 _reader.ReadEndElement();129 }130 }131 132 private void UnknownNode(string node, string expectedNodes)133 {134 if (_reader.NodeType == XmlNodeType.Text)135 {136 _context.AddError(_readerLineInfo.LineNumber, TypesXmlStrings.NodeShouldNotHaveInnerText, node);137 _reader.Read();138 }139 else140 {141 _context.AddError(_readerLineInfo.LineNumber, TypesXmlStrings.UnknownNode, _reader.LocalName, expectedNodes);142 SkipUntilNodeEnd(_reader.LocalName);143 }144 }145 146 private void SkipUntilNodeEnd(string nodeName)147 {148 while (_reader.Read())149 {150 if (_reader.IsStartElement() && _reader.LocalName.Equals(nodeName))151 {152 SkipUntilNodeEnd(nodeName);153 }154 else if ((_reader.NodeType == XmlNodeType.EndElement) && _reader.LocalName.Equals(nodeName))155 {156 break;157 }158 }159 }160 161 private void NotMoreThanOnce(string node, string parent)162 {163 _context.AddError(_readerLineInfo.LineNumber, TypesXmlStrings.NotMoreThanOnceOne, node, parent);164 }165 166 private void NodeNotFound(int lineNumber, string node, string parent)167 {168 _context.AddError(lineNumber, TypesXmlStrings.NodeNotFoundOnce, node, parent);169 }170 171 private ScriptBlock GetScriptBlock(string text, int initialLine)172 {173 if (text == null)174 {175 return null;176 }177 178 ScriptBlock scriptBlock;179 try180 {181 scriptBlock = _context.IsProductCode182 ? ScriptBlock.CreateDelayParsedScriptBlock(text, isProductCode: true)183 : ScriptBlock.Create(text);184 }185 catch (ParseException pe)186 {187 _context.AddError(pe.Errors[0].Extent.StartLineNumber + initialLine - 1, pe.Errors[0].Message);188 return null;189 }190 191 if (scriptBlock != null)192 {193 if (_context.IsFullyTrusted)194 {195 scriptBlock.LanguageMode = PSLanguageMode.FullLanguage;196 }197 }198 199 return scriptBlock;200 }201 202 private Type ResolveType(string typeName, int line)203 {204 Exception exception;205 var type = TypeResolver.ResolveType(typeName, out exception);206 if (exception != null)207 {208 _context.AddError(line, exception.Message);209 }210 else if (type == null)211 {212 _context.AddError(line, ParserStrings.TypeNotFound, typeName);213 }214 215 return type;216 }217 218 private bool ToBoolean(string value)219 {220 value = value.Trim();221 if (string.Equals(value, "true", StringComparison.OrdinalIgnoreCase))222 {223 return true;224 }225 226 if (string.Equals(value, "false", StringComparison.OrdinalIgnoreCase))227 {228 return false;229 }230 231 _context.AddError(_readerLineInfo.LineNumber, TypesXmlStrings.ValueShouldBeTrueOrFalse, value);232 return false;233 }234 235 private T Converter<T>(object value, string name)236 {237 T result;238 239 if (!LanguagePrimitives.TryConvertTo(value, out result))240 {241 _context.AddError(TypesXmlStrings.ErrorConvertingNote, name, typeof(T));242 }243 244 return result;245 }246 247 private bool BoolConverter(object value, string name)248 {249 if (value is string s)250 {251 return ToBoolean(s);252 }253 254 return Converter<bool>(value, name);255 }256 257 private void CheckStandardNote<T>(TypeMemberData member, TypeData typeData, Action<TypeData, T> setter, Func<object, string, T> converter)258 {259 var note = member as NotePropertyData;260 if (note != null)261 {262 T value;263 if (note.Value.GetType() != typeof(T))264 {265 value = converter(note.Value, note.Name);266 }267 else268 {269 value = (T)note.Value;270 }271 272 setter(typeData, value);273 }274 else275 {276 _context.AddError(TypesXmlStrings.MemberShouldBeNote, member.Name);277 }278 }279 280 private static bool CheckStandardPropertySet(TypeMemberData member, TypeData typeData, Action<TypeData, PropertySetData> setter)281 {282 var propertySet = member as PropertySetData;283 if (propertySet != null)284 {285 setter(typeData, propertySet);286 return true;287 }288 289 return false;290 }291 292 #endregion Helpers293 294 public IEnumerable<TypeData> Read()295 {296 IEnumerable<TypeData> result = null;297 _reader.MoveToContent();298 if (_reader.NodeType == XmlNodeType.Element)299 {300 if ((object)_reader.LocalName == (object)_idTypes)301 {302 result = Read_Types();303 }304 }305 306 if (result == null)307 NodeNotFound(0, _idTypes, "Document");308 309 return result;310 }311 312 private IEnumerable<TypeData> Read_Types()313 {314 ReadIsHiddenAttributeNotSupported(_idTypes);315 _reader.MoveToElement();316 317 if (_reader.IsEmptyElement)318 {319 _reader.Skip();320 yield break;321 }322 323 _reader.ReadStartElement();324 _reader.MoveToContent();325 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)326 {327 if (_reader.NodeType == XmlNodeType.Element)328 {329 if ((object)_reader.LocalName == (object)_idType)330 {331 var p = Read_Type();332 if (p != null)333 {334 yield return p;335 }336 }337 else338 {339 UnknownNode(_idTypes, "Type");340 }341 }342 else343 {344 UnknownNode(_idTypes, "Type");345 }346 347 _reader.MoveToContent();348 }349 350 ReadEndElement();351 }352 353 private TypeData Read_Type()354 {355 var errorCount = _context.errors.Count;356 var lineNumber = _readerLineInfo.LineNumber;357 358 MemberSetData standardMembers = null;359 string name = null;360 Collection<TypeMemberData> members = null;361 Type typeConverter = null;362 Type typeAdapter = null;363 364 ReadIsHiddenAttributeNotSupported(_idType);365 _reader.MoveToElement();366 if (_reader.IsEmptyElement)367 {368 _reader.Skip();369 }370 else371 {372 _reader.ReadStartElement();373 _reader.MoveToContent();374 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)375 {376 if (_reader.NodeType == XmlNodeType.Element)377 {378 if ((object)_reader.LocalName == (object)_idName)379 {380 if (name != null)381 {382 NotMoreThanOnce(_idName, _idType);383 }384 385 name = ReadElementString(_idName);386 }387 else if ((object)_reader.LocalName == (object)_idMembers)388 {389 if (members != null)390 {391 NotMoreThanOnce(_idMembers, _idType);392 }393 394 members = Read_Members(out standardMembers);395 }396 else if ((object)_reader.LocalName == (object)_idTypeConverter)397 {398 if (typeConverter != null)399 {400 NotMoreThanOnce(_idTypeConverter, _idType);401 }402 403 typeConverter = Read_TypeX(_idTypeConverter);404 }405 else if ((object)_reader.LocalName == (object)_idTypeAdapter)406 {407 if (typeAdapter != null)408 {409 NotMoreThanOnce(_idTypeAdapter, _idType);410 }411 412 typeAdapter = Read_TypeX(_idTypeAdapter);413 }414 else415 {416 UnknownNode(_idType, "Name,Members,TypeConverter,TypeAdapter");417 }418 }419 else420 {421 UnknownNode(_idType, "Name,Members,TypeConverter,TypeAdapter");422 }423 424 _reader.MoveToContent();425 }426 427 ReadEndElement();428 }429 430 if (string.IsNullOrWhiteSpace(name))431 {432 NodeNotFound(lineNumber, _idName, _idType);433 }434 else if (members == null && typeConverter == null && typeAdapter == null)435 {436 _context.AddError(name, lineNumber, TypesXmlStrings.TypeNodeShouldHaveMembersOrTypeConverters);437 }438 439 if (_context.errors.Count != errorCount)440 {441 return null;442 }443 444 var typeData = new TypeData(name, true);445 if (members != null)446 {447 foreach (var m in members)448 {449 typeData.Members.Add(m.Name, m);450 }451 }452 453 typeData.TypeAdapter = typeAdapter;454 typeData.TypeConverter = typeConverter;455 456 if (standardMembers != null)457 {458 foreach (var m in standardMembers.Members)459 {460 if (m.Name.Equals(TypeTable.DefaultDisplayProperty, StringComparison.OrdinalIgnoreCase))461 {462 CheckStandardNote(m, typeData, static (t, v) => t.DefaultDisplayProperty = v, Converter<string>);463 }464 else if (m.Name.Equals(TypeTable.DefaultDisplayPropertySet, StringComparison.OrdinalIgnoreCase))465 {466 if (!CheckStandardPropertySet(m, typeData, (t, p) => t.DefaultDisplayPropertySet = p))467 {468 _context.AddError(TypesXmlStrings.MemberShouldHaveType, TypeTable.DefaultDisplayPropertySet, _idPropertySet);469 }470 }471 else if (m.Name.Equals(TypeTable.DefaultKeyPropertySet, StringComparison.OrdinalIgnoreCase))472 {473 if (!CheckStandardPropertySet(m, typeData, (t, p) => t.DefaultKeyPropertySet = p))474 {475 _context.AddError(TypesXmlStrings.MemberShouldHaveType, TypeTable.DefaultKeyPropertySet, _idPropertySet);476 }477 }478 else if (m.Name.Equals(TypeTable.SerializationMethodNode, StringComparison.OrdinalIgnoreCase))479 {480 CheckStandardNote(m, typeData, static (t, v) => t.SerializationMethod = v, Converter<string>);481 }482 else if (m.Name.Equals(TypeTable.SerializationDepth, StringComparison.OrdinalIgnoreCase))483 {484 CheckStandardNote(m, typeData, static (t, v) => t.SerializationDepth = v, Converter<uint>);485 }486 else if (m.Name.Equals(TypeTable.StringSerializationSource, StringComparison.OrdinalIgnoreCase))487 {488 var aliasData = m as AliasPropertyData;489 if (aliasData != null)490 {491 typeData.StringSerializationSource = aliasData.ReferencedMemberName;492 }493 else494 {495 typeData.StringSerializationSourceProperty = m;496 }497 }498 else if (m.Name.Equals(TypeTable.PropertySerializationSet, StringComparison.OrdinalIgnoreCase))499 {500 if (!CheckStandardPropertySet(m, typeData, (t, p) => t.PropertySerializationSet = p))501 {502 _context.AddError(TypesXmlStrings.MemberShouldHaveType, TypeTable.PropertySerializationSet, _idPropertySet);503 }504 }505 else if (m.Name.Equals(TypeTable.InheritPropertySerializationSet, StringComparison.OrdinalIgnoreCase))506 {507 CheckStandardNote(m, typeData, static (t, v) => t.InheritPropertySerializationSet = v, BoolConverter);508 }509 else if (m.Name.Equals(TypeTable.TargetTypeForDeserialization, StringComparison.OrdinalIgnoreCase))510 {511 CheckStandardNote(m, typeData, static (t, v) => t.TargetTypeForDeserialization = v, Converter<Type>);512 }513 else514 {515 _context.AddError(TypesXmlStrings.NotAStandardMember, m.Name);516 }517 }518 }519 520 return typeData;521 }522 523 private Type Read_TypeX(string elementName)524 {525 var errorCount = _context.errors.Count;526 var lineNumber = _readerLineInfo.LineNumber;527 int typeLineNumber = 0;528 529 string typeName = null;530 531 ReadIsHiddenAttributeNotSupported(elementName);532 _reader.MoveToElement();533 if (_reader.IsEmptyElement)534 {535 _reader.Skip();536 }537 else538 {539 _reader.ReadStartElement();540 _reader.MoveToContent();541 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)542 {543 if (_reader.NodeType == XmlNodeType.Element)544 {545 if ((object)_reader.LocalName == (object)_idTypeName)546 {547 if (typeName != null)548 {549 NotMoreThanOnce(_idTypeName, elementName);550 }551 552 typeLineNumber = _readerLineInfo.LineNumber;553 typeName = ReadElementString(_idTypeName);554 }555 else556 {557 UnknownNode(elementName, "TypeName");558 }559 }560 else561 {562 UnknownNode(elementName, "TypeName");563 }564 565 _reader.MoveToContent();566 }567 568 ReadEndElement();569 }570 571 if (string.IsNullOrWhiteSpace(typeName))572 {573 NodeNotFound(lineNumber, _idTypeName, elementName);574 }575 576 if (_context.errors.Count != errorCount)577 {578 return null;579 }580 581 return ResolveType(typeName, typeLineNumber);582 }583 584 private Collection<TypeMemberData> Read_Members(out MemberSetData standardMembers)585 {586 var errorCount = _context.errors.Count;587 588 standardMembers = null;589 var members = new Collection<TypeMemberData>();590 591 ReadIsHiddenAttributeNotSupported(_idMembers);592 _reader.MoveToElement();593 if (_reader.IsEmptyElement)594 {595 _reader.Skip();596 }597 else598 {599 _reader.ReadStartElement();600 _reader.MoveToContent();601 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)602 {603 if (_reader.NodeType == XmlNodeType.Element)604 {605 if ((object)_reader.LocalName == (object)_idNoteProperty)606 {607 var p = Read_NoteProperty();608 if (p != null)609 {610 members.Add(p);611 }612 }613 else if ((object)_reader.LocalName == (object)_idAliasProperty)614 {615 var p = Read_AliasProperty();616 if (p != null)617 {618 members.Add(p);619 }620 }621 else if ((object)_reader.LocalName == (object)_idScriptProperty)622 {623 var p = Read_ScriptProperty();624 if (p != null)625 {626 members.Add(p);627 }628 }629 else if ((object)_reader.LocalName == (object)_idCodeProperty)630 {631 var p = Read_CodeProperty();632 if (p != null)633 {634 members.Add(p);635 }636 }637 else if ((object)_reader.LocalName == (object)_idScriptMethod)638 {639 var p = Read_ScriptMethod();640 if (p != null)641 {642 members.Add(p);643 }644 }645 else if ((object)_reader.LocalName == (object)_idCodeMethod)646 {647 var p = Read_CodeMethod();648 if (p != null)649 {650 members.Add(p);651 }652 }653 else if ((object)_reader.LocalName == (object)_idPropertySet)654 {655 var p = Read_PropertySet();656 if (p != null)657 {658 members.Add(p);659 }660 }661 else if ((object)_reader.LocalName == (object)_idMemberSet)662 {663 var p = Read_MemberSet();664 if (p != null)665 {666 if (p.Name.Equals(TypeTable.PSStandardMembers, StringComparison.OrdinalIgnoreCase))667 {668 standardMembers = p;669 }670 else671 {672 members.Add(p);673 }674 }675 }676 else677 {678 UnknownNode(_idMembers, "NoteProperty,AliasProperty,ScriptProperty,CodeProperty,ScriptMethod,CodeMethod,PropertySet,MemberSet");679 }680 }681 else682 {683 UnknownNode(_idMembers, "NoteProperty,AliasProperty,ScriptProperty,CodeProperty,ScriptMethod,CodeMethod,PropertySet,MemberSet");684 }685 686 _reader.MoveToContent();687 }688 689 ReadEndElement();690 }691 692 return _context.errors.Count == errorCount ? members : null;693 }694 695 private MemberSetData Read_MemberSet()696 {697 var errorCount = _context.errors.Count;698 var lineNumber = _readerLineInfo.LineNumber;699 700 string name = null;701 Collection<TypeMemberData> members = null;702 bool? inheritMembers = default(bool?);703 704 bool? isHidden = ReadIsHiddenAttribute();705 _reader.MoveToElement();706 if (_reader.IsEmptyElement)707 {708 _reader.Skip();709 }710 else711 {712 _reader.ReadStartElement();713 _reader.MoveToContent();714 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)715 {716 if (_reader.NodeType == XmlNodeType.Element)717 {718 if ((object)_reader.LocalName == (object)_idName)719 {720 if (name != null)721 {722 NotMoreThanOnce(_idName, _idMemberSet);723 }724 725 name = ReadElementString(_idName);726 }727 else if ((object)_reader.LocalName == (object)_idInheritMembers)728 {729 if (inheritMembers.HasValue)730 {731 NotMoreThanOnce(_idInheritMembers, _idMemberSet);732 }733 734 inheritMembers = ToBoolean(ReadElementString(_idMemberSet));735 }736 else if ((object)_reader.LocalName == (object)_idMembers)737 {738 if (members != null)739 {740 NotMoreThanOnce(_idMembers, _idMemberSet);741 }742 743 MemberSetData standardMembers;744 members = Read_Members(out standardMembers);745 if (standardMembers != null)746 {747 // Somewhat pointless - but if we see PSStandardMembers inside a memberset, it's748 // really just another ordinary member.749 members.Add(standardMembers);750 }751 }752 else753 {754 UnknownNode(_idMemberSet, "Name,InheritMembers,Members");755 }756 }757 else758 {759 UnknownNode(_idMemberSet, "Name,InheritMembers,Members");760 }761 762 _reader.MoveToContent();763 }764 765 ReadEndElement();766 }767 768 if (string.IsNullOrWhiteSpace(name))769 {770 NodeNotFound(lineNumber, _idName, _idMemberSet);771 }772 773 // Somewhat pointlessly (backcompat), we allow a missing Member node774 members ??= new Collection<TypeMemberData>();775 776 if (_context.errors.Count != errorCount)777 {778 return null;779 }780 781 var result = new MemberSetData(name, members)782 {783 IsHidden = isHidden.GetValueOrDefault()784 };785 786 if (inheritMembers.HasValue)787 {788 result.InheritMembers = inheritMembers.Value;789 }790 791 return result;792 }793 794 private PropertySetData Read_PropertySet()795 {796 var errorCount = _context.errors.Count;797 var lineNumber = _readerLineInfo.LineNumber;798 799 string name = null;800 List<string> referencedProperties = null;801 802 bool? isHidden = ReadIsHiddenAttribute();803 _reader.MoveToElement();804 if (_reader.IsEmptyElement)805 {806 _reader.Skip();807 }808 else809 {810 _reader.ReadStartElement();811 _reader.MoveToContent();812 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)813 {814 if (_reader.NodeType == XmlNodeType.Element)815 {816 if ((object)_reader.LocalName == (object)_idName)817 {818 if (name != null)819 {820 NotMoreThanOnce(_idName, _idPropertySet);821 }822 823 name = ReadElementString(_idName);824 }825 else if ((object)_reader.LocalName == (object)_idReferencedProperties)826 {827 if (_reader.IsEmptyElement)828 {829 _reader.Skip();830 }831 else832 {833 _reader.ReadStartElement();834 _reader.MoveToContent();835 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)836 {837 if (_reader.NodeType == XmlNodeType.Element)838 {839 if ((object)_reader.LocalName == (object)_idName)840 {841 referencedProperties ??= new List<string>(8);842 843 referencedProperties.Add(ReadElementString(_idName));844 }845 else846 {847 UnknownNode(_idPropertySet, "Name");848 }849 }850 else851 {852 UnknownNode(_idPropertySet, "Name");853 }854 855 _reader.MoveToContent();856 }857 858 ReadEndElement();859 }860 }861 else862 {863 UnknownNode(_idPropertySet, "Name,ReferencedProperties");864 }865 }866 else867 {868 UnknownNode(_idPropertySet, "Name,ReferencedProperties");869 }870 871 _reader.MoveToContent();872 }873 874 ReadEndElement();875 }876 877 if (string.IsNullOrWhiteSpace(name))878 NodeNotFound(lineNumber, _idName, _idPropertySet);879 if (referencedProperties == null)880 NodeNotFound(lineNumber, _idReferencedProperties, _idPropertySet);881 882 if (_context.errors.Count != errorCount)883 {884 return null;885 }886 887 return new PropertySetData(referencedProperties)888 {889 Name = name,890 IsHidden = isHidden.GetValueOrDefault()891 };892 }893 894 private CodeMethodData Read_CodeMethod()895 {896 var errorCount = _context.errors.Count;897 var lineNumber = _readerLineInfo.LineNumber;898 var methodLineNumber = 0;899 900 string name = null;901 MethodInfo codeReference = null;902 903 ReadIsHiddenAttributeNotSupported(_idCodeMethod);904 _reader.MoveToElement();905 if (_reader.IsEmptyElement)906 {907 _reader.Skip();908 }909 else910 {911 _reader.ReadStartElement();912 _reader.MoveToContent();913 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)914 {915 if (_reader.NodeType == XmlNodeType.Element)916 {917 if ((object)_reader.LocalName == (object)_idName)918 {919 if (name != null)920 {921 NotMoreThanOnce(_idName, _idCodeMethod);922 }923 924 name = ReadElementString(_idName);925 }926 else if ((object)_reader.LocalName == (object)_idCodeReference)927 {928 if (codeReference != null)929 {930 NotMoreThanOnce(_idCodeReference, _idCodeMethod);931 }932 933 methodLineNumber = _readerLineInfo.LineNumber;934 codeReference = Read_CodeReference();935 if (codeReference == null)936 _context.AddError(methodLineNumber, ExtendedTypeSystem.CodeMethodMethodFormat);937 }938 else939 {940 UnknownNode(_idCodeMethod, "Name,CodeReference");941 }942 }943 else944 {945 UnknownNode(_idCodeMethod, "Name,CodeReference");946 }947 948 _reader.MoveToContent();949 }950 951 ReadEndElement();952 }953 954 if (string.IsNullOrWhiteSpace(name))955 NodeNotFound(lineNumber, _idName, _idCodeMethod);956 if (codeReference == null && methodLineNumber == 0)957 NodeNotFound(lineNumber, _idCodeReference, _idCodeMethod);958 if (codeReference != null && !PSCodeMethod.CheckMethodInfo(codeReference))959 _context.AddError(methodLineNumber, ExtendedTypeSystem.CodeMethodMethodFormat);960 961 if (_context.errors.Count != errorCount)962 {963 return null;964 }965 966 return new CodeMethodData(name, codeReference);967 }968 969 private MethodInfo Read_CodeReference()970 {971 var errorCount = _context.errors.Count;972 var lineNumber = _readerLineInfo.LineNumber;973 int typeLineNumber = 0;974 int methodLineNumber = 0;975 976 string typeName = null;977 string methodName = null;978 979 ReadIsHiddenAttributeNotSupported(_idCodeReference);980 _reader.MoveToElement();981 if (_reader.IsEmptyElement)982 {983 _reader.Skip();984 }985 else986 {987 _reader.ReadStartElement();988 _reader.MoveToContent();989 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)990 {991 if (_reader.NodeType == XmlNodeType.Element)992 {993 if ((object)_reader.LocalName == (object)_idTypeName)994 {995 if (typeName != null)996 {997 NotMoreThanOnce(_idTypeName, _idCodeReference);998 }999 1000 typeLineNumber = _readerLineInfo.LineNumber;1001 typeName = ReadElementString(_idTypeName);1002 }1003 else if ((object)_reader.LocalName == (object)_idMethodName)1004 {1005 if (methodName != null)1006 {1007 NotMoreThanOnce(_idMethodName, _idCodeReference);1008 }1009 1010 methodLineNumber = _readerLineInfo.LineNumber;1011 methodName = ReadElementString(_idMethodName);1012 }1013 else1014 {1015 UnknownNode(_idCodeReference, "TypeName,MethodName");1016 }1017 }1018 else1019 {1020 UnknownNode(_idCodeReference, "TypeName,MethodName");1021 }1022 1023 _reader.MoveToContent();1024 }1025 1026 ReadEndElement();1027 }1028 1029 if (string.IsNullOrWhiteSpace(typeName))1030 NodeNotFound(lineNumber, _idTypeName, _idCodeReference);1031 if (string.IsNullOrWhiteSpace(methodName))1032 NodeNotFound(lineNumber, _idMethodName, _idCodeReference);1033 1034 if (_context.errors.Count != errorCount)1035 {1036 return null;1037 }1038 1039 MethodInfo member = null;1040 var type = ResolveType(typeName, typeLineNumber);1041 if (type != null)1042 {1043 try1044 {1045 member = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase);1046 }1047 catch (AmbiguousMatchException e)1048 {1049 _context.AddError(methodLineNumber, e.Message);1050 }1051 }1052 1053 return member;1054 }1055 1056 private ScriptMethodData Read_ScriptMethod()1057 {1058 var errorCount = _context.errors.Count;1059 var lineNumber = _readerLineInfo.LineNumber;1060 1061 string name = null;1062 string script = null;1063 int scriptLineNumber = 0;1064 1065 ReadIsHiddenAttributeNotSupported(_idScriptMethod);1066 _reader.MoveToElement();1067 if (_reader.IsEmptyElement)1068 {1069 _reader.Skip();1070 }1071 else1072 {1073 _reader.ReadStartElement();1074 _reader.MoveToContent();1075 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)1076 {1077 if (_reader.NodeType == XmlNodeType.Element)1078 {1079 if ((object)_reader.LocalName == (object)_idName)1080 {1081 if (name != null)1082 {1083 NotMoreThanOnce(_idName, _idScriptMethod);1084 }1085 1086 name = ReadElementString(_idName);1087 }1088 else if ((object)_reader.LocalName == (object)_idScript)1089 {1090 if (script != null)1091 {1092 NotMoreThanOnce(_idScript, _idScriptMethod);1093 }1094 1095 scriptLineNumber = _readerLineInfo.LineNumber;1096 script = ReadElementString(_idScript);1097 }1098 else1099 {1100 UnknownNode(_idScriptMethod, "Name,Script");1101 }1102 }1103 else1104 {1105 UnknownNode(_idScriptMethod, "Name,Script");1106 }1107 1108 _reader.MoveToContent();1109 }1110 1111 ReadEndElement();1112 }1113 1114 if (string.IsNullOrWhiteSpace(name))1115 {1116 NodeNotFound(lineNumber, _idName, _idScriptMethod);1117 }1118 1119 if (string.IsNullOrWhiteSpace(script))1120 {1121 NodeNotFound(lineNumber, _idScript, _idScriptMethod);1122 }1123 1124 ScriptBlock scriptBlock = GetScriptBlock(script, scriptLineNumber);1125 1126 if (_context.errors.Count != errorCount)1127 {1128 return null;1129 }1130 1131 return new ScriptMethodData(name, scriptBlock);1132 }1133 1134 private CodePropertyData Read_CodeProperty()1135 {1136 var errorCount = _context.errors.Count;1137 var lineNumber = _readerLineInfo.LineNumber;1138 var getterLineNumber = 0;1139 var setterLineNumber = 0;1140 1141 string name = null;1142 MethodInfo getter = null;1143 MethodInfo setter = null;1144 1145 var isHidden = ReadIsHiddenAttribute();1146 _reader.MoveToElement();1147 if (_reader.IsEmptyElement)1148 {1149 _reader.Skip();1150 }1151 else1152 {1153 _reader.ReadStartElement();1154 _reader.MoveToContent();1155 while (_reader.NodeType != XmlNodeType.EndElement && _reader.NodeType != XmlNodeType.None)1156 {1157 if (_reader.NodeType == XmlNodeType.Element)1158 {1159 if ((object)_reader.LocalName == (object)_idName)1160 {1161 if (name != null)1162 {1163 NotMoreThanOnce(_idName, _idCodeProperty);1164 }1165 1166 name = ReadElementString(_idName);1167 }1168 else if ((object)_reader.LocalName == (object)_idGetCodeReference)1169 {1170 if (getter != null)1171 {1172 NotMoreThanOnce(_idGetCodeReference, _idCodeProperty);1173 }1174 1175 getterLineNumber = _readerLineInfo.LineNumber;1176 getter = Read_CodeReference();1177 if (getter == null)1178 {1179 _context.AddError(getterLineNumber, ExtendedTypeSystem.CodePropertyGetterAndSetterNull);1180 }1181 }1182 else if ((object)_reader.LocalName == (object)_idSetCodeReference)1183 {1184 if (setter != null)1185 {1186 NotMoreThanOnce(_idSetCodeReference, _idCodeProperty);1187 }1188 1189 setterLineNumber = _readerLineInfo.LineNumber;1190 setter = Read_CodeReference();1191 if (setter == null)1192 {1193 _context.AddError(setterLineNumber, ExtendedTypeSystem.CodePropertyGetterAndSetterNull);1194 }1195 }1196 else1197 {1198 UnknownNode(_idCodeProperty, "Name,GetCodeReference,SetCodeReference");1199 }1200 }