Exemple #1
0
        public void When_CreatedWithNameAndValue_ValueShouldBeValid()
        {
            var attribute = new UnknownAttribute('h', "name");

            attribute.Value.ShouldBe("name");
            attribute.ToString().ShouldBe("h=name");
        }
Exemple #2
0
        internal virtual void ReadUnknownAttribute(MSBuildXmlReader reader, string lastAttr)
        {
            var ua = new UnknownAttribute {
                LocalName      = reader.LocalName,
                Prefix         = !string.IsNullOrEmpty(reader.Prefix) ? reader.Prefix : null,
                Namespace      = reader.NamespaceURI,
                Value          = reader.Value,
                AfterAttribute = lastAttr
            };

            if (unknownAttributes == null)
            {
                unknownAttributes = new List <UnknownAttribute> ();
            }
            unknownAttributes.Add(ua);
        }
		internal override void Read (MSBuildXmlReader reader)
		{
			if (reader.ForEvaluation) {
				if (reader.MoveToFirstAttribute ()) {
					do {
						ReadAttribute (reader.LocalName, reader.Value);
					} while (reader.MoveToNextAttribute ());
				}
			} else {
				StartWhitespace = reader.ConsumeWhitespace ();

				if (reader.MoveToFirstAttribute ()) {
					var knownAtts = GetKnownAttributes ();
					int attOrderIndex = 0;
					int expectedKnownAttIndex = 0;
					bool attOrderIsUnexpected = false;
					List<UnknownAttribute> unknownAttsList = null;
					attributeOrder = new string [knownAtts.Length];
					string lastAttr = null;
					do {
						var attName = reader.LocalName;
						int i = Array.IndexOf (knownAtts, attName);
						if (i == -1) {
							if (attName == "xmlns")
								continue;
							
							#if ATTR_STATS
							UnknownAtts.Add (GetType ().Name + " " + attName);
							#endif

							var ua = new UnknownAttribute {
								LocalName = attName,
								Prefix = !string.IsNullOrEmpty (reader.Prefix) ? reader.Prefix : null,
								Namespace = reader.NamespaceURI,
								Value = reader.Value,
								AfterAttribute = lastAttr
							};
							if (unknownAttsList == null)
								unknownAttsList = new List<UnknownAttribute> ();
							unknownAttsList.Add (ua);
							lastAttr = null;
						} else {
							if (attOrderIndex >= attributeOrder.Length)
								throw new InvalidOperationException ("Attribute specified twice");
							attributeOrder [attOrderIndex++] = attName;
							ReadAttribute (attName, reader.Value);
							if (i < expectedKnownAttIndex) {
								// Attributes have an unexpected order
								attOrderIsUnexpected = true;
							}
							expectedKnownAttIndex = i + 1;
							lastAttr = attName;
						}
					} while (reader.MoveToNextAttribute ());

					if (unknownAttsList != null)
						unknownAttributes = unknownAttsList.ToArray ();
					if (!attOrderIsUnexpected)
						attributeOrder = null;
					else {
						// Fill the remaning slots in the attributeOrder array (known attributes that were not read)
						foreach (var a in knownAtts) {
							if (!attributeOrder.Contains (a)) {
								if (attOrderIndex >= attributeOrder.Length)
									throw new InvalidOperationException ("Attribute specified twice");
								attributeOrder [attOrderIndex++] = a;
							}
						}
					}

					#if ATTR_STATS
					var atts = GetType().Name + " - " + string.Join (", ", (attributeOrder ?? knownAtts));
					if (attributeOrder == null)
						atts += " *";
					KnownAttOrder.Add (atts);
					#endif
				}
			}
			reader.MoveToElement ();

			emptyElementMode = reader.IsEmptyElement ? EmptyElementMode.Empty : EmptyElementMode.NotEmpty;

			if (!string.IsNullOrEmpty (reader.Prefix) && !SupportsNamespacePrefixes)
				throw new MSBuildFileFormatException ("XML namespace prefixes are not supported for " + reader.LocalName + " elements");

			ReadContent (reader);

			while (reader.IsWhitespace)
				reader.ReadAndStoreWhitespace ();

			EndWhitespace = reader.ConsumeWhitespaceUntilNewLine ();
		}
        /// <summary>
        /// Read a list of attributes
        /// </summary>
        private void ReadAttributes(ConstantPool cp, IModifiableAttributeProvider provider)
        {
            var count = stream.ReadU2();

            for (var i = 0; i < count; i++)
            {
                var nameIndex = stream.ReadU2();
                var name      = cp.GetEntry <ConstantPoolUtf8>(nameIndex).Value;
                var length    = stream.ReadU4();

                Attribute attr;
                int       tmp;
                switch (name)
                {
                case CodeAttribute.AttributeName:
                    attr = ReadCodeAttribute((MethodDefinition)provider, cp);
                    break;

                case ConstantValueAttribute.AttributeName:
                    tmp  = stream.ReadU2();
                    attr = new ConstantValueAttribute(((IConstantPoolValue)cp[tmp]).Value);
                    break;

                case ExceptionsAttribute.AttributeName:
                    attr = ReadExceptionsAttribute(cp);
                    break;

                case InnerClassesAttribute.AttributeName:
                    attr = ReadInnerClassesAttribute(cp);
                    break;

                case SyntheticAttribute.AttributeName:
                    attr = new SyntheticAttribute();
                    break;

                case SourceFileAttribute.AttributeName:
                    tmp  = stream.ReadU2();
                    attr = new SourceFileAttribute(cp.GetEntry <ConstantPoolUtf8>(tmp).Value);
                    break;

                case LineNumberTableAttribute.AttributeName:
                    attr = ReadLineNumberTableAttribute();
                    break;

                case LocalVariableTableAttribute.AttributeName:
                    attr = ReadLocalVariableTableAttribute(cp);
                    break;

                case DeprecatedAttribute.AttributeName:
                    attr = new DeprecatedAttribute();
                    break;

                case OverrideAttribute.AttributeName:
                    attr = new OverrideAttribute();
                    break;

                case SignatureAttribute.AttributeName:
                    tmp  = stream.ReadU2();
                    attr = new SignatureAttribute(cp.GetEntry <ConstantPoolUtf8>(tmp).Value);
                    break;

                case RuntimeVisibleAnnotationsAttribute.AttributeName:
                    attr = new RuntimeVisibleAnnotationsAttribute(ReadAnnotationsAttribute(cp));
                    break;

                case RuntimeInvisibleAnnotationsAttribute.AttributeName:
                    attr = new RuntimeInvisibleAnnotationsAttribute(ReadAnnotationsAttribute(cp));
                    break;

                case RuntimeVisibleParameterAnnotationsAttribute.AttributeName:
                    attr = new RuntimeVisibleParameterAnnotationsAttribute(ReadAnnotationsAttribute(cp));
                    break;

                case RuntimeInvisibleParameterAnnotationsAttribute.AttributeName:
                    attr = new RuntimeInvisibleParameterAnnotationsAttribute(ReadAnnotationsAttribute(cp));
                    break;

                case AnnotationDefaultAttribute.AttributeName:
                    attr = new AnnotationDefaultAttribute(ReadElementValue(cp));
                    break;

                default:
                    stream.Skip(length);
                    attr = new UnknownAttribute(name);
                    break;
                }
                provider.Add(attr);
            }
            provider.AttributesLoaded();
        }
Exemple #5
0
        internal override void Read(MSBuildXmlReader reader)
        {
            if (reader.ForEvaluation && !ContentRequiredForEvaluation)
            {
                if (reader.MoveToFirstAttribute())
                {
                    do
                    {
                        ReadAttribute(reader.LocalName, reader.Value);
                    } while (reader.MoveToNextAttribute());
                }
            }
            else
            {
                StartWhitespace = reader.ConsumeWhitespace();

                if (reader.MoveToFirstAttribute())
                {
                    var  knownAtts             = GetKnownAttributes();
                    int  attOrderIndex         = 0;
                    int  expectedKnownAttIndex = 0;
                    bool attOrderIsUnexpected  = false;
                    List <UnknownAttribute> unknownAttsList = null;
                    attributeOrder = new string [knownAtts.Length];
                    string lastAttr = null;
                    do
                    {
                        var attName = reader.LocalName;
                        int i       = Array.IndexOf(knownAtts, attName);
                        if (i == -1)
                        {
                            if (attName == "xmlns")
                            {
                                continue;
                            }

                                                        #if ATTR_STATS
                            UnknownAtts.Add(GetType().Name + " " + attName);
                                                        #endif

                            var ua = new UnknownAttribute {
                                LocalName      = attName,
                                Prefix         = !string.IsNullOrEmpty(reader.Prefix) ? reader.Prefix : null,
                                Namespace      = reader.NamespaceURI,
                                Value          = reader.Value,
                                AfterAttribute = lastAttr
                            };
                            if (unknownAttsList == null)
                            {
                                unknownAttsList = new List <UnknownAttribute> ();
                            }
                            unknownAttsList.Add(ua);
                            lastAttr = null;
                        }
                        else
                        {
                            if (attOrderIndex >= attributeOrder.Length)
                            {
                                throw new InvalidOperationException("Attribute specified twice");
                            }
                            attributeOrder [attOrderIndex++] = attName;
                            ReadAttribute(attName, reader.Value);
                            if (i < expectedKnownAttIndex)
                            {
                                // Attributes have an unexpected order
                                attOrderIsUnexpected = true;
                            }
                            expectedKnownAttIndex = i + 1;
                            lastAttr = attName;
                        }
                    } while (reader.MoveToNextAttribute());

                    if (unknownAttsList != null)
                    {
                        unknownAttributes = unknownAttsList.ToArray();
                    }
                    if (!attOrderIsUnexpected)
                    {
                        attributeOrder = null;
                    }
                    else
                    {
                        // Fill the remaning slots in the attributeOrder array (known attributes that were not read)
                        foreach (var a in knownAtts)
                        {
                            if (!attributeOrder.Contains(a))
                            {
                                if (attOrderIndex >= attributeOrder.Length)
                                {
                                    throw new InvalidOperationException("Attribute specified twice");
                                }
                                attributeOrder [attOrderIndex++] = a;
                            }
                        }
                    }

                                        #if ATTR_STATS
                    var atts = GetType().Name + " - " + string.Join(", ", (attributeOrder ?? knownAtts));
                    if (attributeOrder == null)
                    {
                        atts += " *";
                    }
                    KnownAttOrder.Add(atts);
                                        #endif
                }
            }
            reader.MoveToElement();

            emptyElementMode = reader.IsEmptyElement ? EmptyElementMode.Empty : EmptyElementMode.NotEmpty;

            if (!string.IsNullOrEmpty(reader.Prefix) && !SupportsNamespacePrefixes)
            {
                throw new MSBuildFileFormatException("XML namespace prefixes are not supported for " + reader.LocalName + " elements");
            }

            ReadContent(reader);

            while (reader.IsWhitespace)
            {
                reader.ReadAndStoreWhitespace();
            }

            EndWhitespace = reader.ConsumeWhitespaceUntilNewLine();
        }