internal static void Load(this JavaTypeParameters tps, XmlReader reader)
        {
            reader.MoveToContent();
            if (reader.IsEmptyElement)
            {
                reader.Read();
            }
            else
            {
                reader.Read();
                do
                {
                    reader.MoveToContent();
                    if (reader.NodeType == XmlNodeType.EndElement)
                    {
                        break;                         // </typeParameters>
                    }
                    if (reader.NodeType != XmlNodeType.Element || reader.LocalName != "typeParameter")
                    {
                        throw XmlUtil.UnexpectedElementOrContent("typeParameters", reader, "typeParameter");
                    }
                    var tp = new JavaTypeParameter(tps);
                    tp.Load(reader);
                    tps.TypeParameters.Add(tp);
                } while (true);

                XmlUtil.VerifyEndElement(reader, "typeParameters");
                reader.Read();
            }
        }
 public JavaTypeReference(JavaTypeParameter referencedTypeParameter, string?arrayPart)
 {
     if (referencedTypeParameter == null)
     {
         throw new ArgumentNullException("referencedTypeParameter");
     }
     ReferencedTypeParameter = referencedTypeParameter;
     ArrayPart = arrayPart;
 }
		static bool IsConformantType (this JavaTypeParameter typeParameter, JavaTypeReference examinedType)
		{
			if (typeParameter.GenericConstraints == null)
				return true;
			// FIXME: implement correct generic constraint conformance check.
			Log.LogDebug ("NOTICE: generic constraint conformance check is not implemented, so the type might be actually compatible. Type parameter: {0}{1}, examined type: {2}",
			                               typeParameter.Name, typeParameter.Parent.ParentMethod?.Name ?? typeParameter.Parent.ParentType?.Name, examinedType);
			return false;
		}
 static bool IsConformantType(this JavaTypeParameter typeParameter, JavaTypeReference examinedType)
 {
     if (typeParameter.GenericConstraints == null)
     {
         return(true);
     }
     // FIXME: implement correct generic constraint conformance check.
     Console.Error.WriteLine("WARNING: generic constraint conformance check is not implemented, so the type might be actually compatible. Type parameter: {0}{1}, examined type: {2}",
                             typeParameter.Name, typeParameter.Parent.ParentMethod?.Name ?? typeParameter.Parent.ParentType?.Name, examinedType.ToString());
     return(false);
 }
     static void Load(this JavaTypeParameters tps, GenericParameterDefinitionList gtps)
     {
         foreach (var stp in gtps)
         {
             var tp = new JavaTypeParameter(tps)
             {
                 Name = stp.Name,
             };
             if (stp.Constraints != null)
             {
                 tp.GenericConstraints = new JavaGenericConstraints()
                 {
                     BoundsType         = stp.Name,
                     GenericConstraints = stp.Constraints.Select(_ => new JavaGenericConstraint()
                     {
                         Type = _.JavaName
                     }).ToArray()
                 }
             }
             ;
             tps.TypeParameters.Add(tp);
         }
     }
 }
        public static void Load(this JavaTypeParameter tp, XmlReader reader)
        {
            tp.Name = XmlUtil.GetRequiredAttribute(reader, "name");
            tp.ExtendedJniClassBound = reader.GetAttribute("jni-classBound");
            // such an ill-named attribute...
            tp.ExtendedClassBound = reader.GetAttribute("classBound");
            // and un-structuring attribute...
            tp.ExtendedInterfaceBounds    = reader.GetAttribute("interfaceBounds");
            tp.ExtendedJniInterfaceBounds = reader.GetAttribute("jni-interfaceBounds");
            XmlUtil.CheckExtraneousAttributes("typeParameter", reader, "name", "jni-classBound", "jni-interfaceBounds", "classBound", "interfaceBounds");
            if (reader.IsEmptyElement)
            {
                reader.Read();
            }
            else
            {
                reader.Read();
                do
                {
                    reader.MoveToContent();
                    if (reader.NodeType == XmlNodeType.EndElement)
                    {
                        break;                         // </typeParameter>
                    }
                    if (reader.NodeType != XmlNodeType.Element || reader.LocalName != "genericConstraints")
                    {
                        throw XmlUtil.UnexpectedElementOrContent("typeParameter", reader, "genericConstraints");
                    }

                    var gc = new JavaGenericConstraints();
                    gc.Load(reader);
                    tp.GenericConstraints = gc;
                } while (true);

                XmlUtil.VerifyEndElement(reader, "typeParameter");
                reader.Read();
            }
            // Now we have to deal with the format difference...
            // Some versions of class-parse stopped generating <genericConstraints> but started
            // generating "classBound" and "interfaceBounds" attributes instead.
            // They don't make sense and blocking this effort, but we have to deal with that...
            if (!string.IsNullOrEmpty(tp.ExtendedClassBound) || !string.IsNullOrEmpty(tp.ExtendedInterfaceBounds))
            {
                var gcs = new JavaGenericConstraints();
                if (!string.IsNullOrEmpty(tp.ExtendedClassBound))
                {
                    gcs.GenericConstraints.Add(new JavaGenericConstraint()
                    {
                        Type = tp.ExtendedClassBound
                    });
                }
                if (!string.IsNullOrEmpty(tp.ExtendedInterfaceBounds))
                {
                    foreach (var ic in tp.ExtendedInterfaceBounds.Split(':'))
                    {
                        gcs.GenericConstraints.Add(new JavaGenericConstraint()
                        {
                            Type = ic
                        });
                    }
                }
                tp.GenericConstraints = gcs;
            }
        }