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; } }