public void TypeReferenceEquals() { var int_ref = JavaTypeReference.Int; Assert.AreEqual(JavaTypeReference.Int, int_ref, "primitive types 2"); var pkg = new JavaPackage("com.example", "com/example", null); var dummyType = JavaApiTestHelper.CreateClass(pkg, "Dummy"); var tps = new JavaTypeParameters(dummyType); var gt = new JavaTypeParameter("T", tps); Assert.AreEqual(new JavaTypeReference(gt, null), new JavaTypeReference(new JavaTypeParameter("T", tps), null), "type parameters"); Assert.AreNotEqual(new JavaTypeReference(gt, null), new JavaTypeReference(new JavaTypeParameter("U", tps), null), "type parameters 2"); Assert.AreNotEqual(new JavaTypeReference(gt, null), new JavaTypeReference(gt, "[]"), "type parameters: array vs. non-array"); Assert.AreEqual(new JavaTypeReference(gt, "[]"), new JavaTypeReference(gt, "[]"), "type parameters: array vs. array"); var type = JavaApiTestHelper.CreateClass(pkg, "T"); Assert.AreEqual(new JavaTypeReference(type, null, null), new JavaTypeReference(type, null, null), "type vs. type"); Assert.AreNotEqual(new JavaTypeReference(type, null, "[]"), new JavaTypeReference(type, null, null), "type: array vs. non array"); Assert.AreNotEqual(new JavaTypeReference(type, null, "[]"), new JavaTypeReference(type, null, "[][]"), "type: array vs. array of array"); Assert.AreNotEqual(new JavaTypeReference(type, null, null), new JavaTypeReference(new JavaTypeParameter("T", tps), null), "type vs. type parameters"); Assert.AreNotEqual(new JavaTypeReference(gt, "[]"), new JavaTypeReference(type, null, null), "type: array vs. non array"); Assert.AreNotEqual(new JavaTypeReference(type, null, "[]"), new JavaTypeReference(type, null, "[][]"), "type: array vs. array of array"); }
public void GenericInheritanceMappings() { var obj = api.FindNonGenericType("java.lang.Object") as JavaClass; Assert.IsNotNull(obj.GenericInheritanceMapping, "java.lang.Object mapping not found"); Assert.AreEqual(0, obj.GenericInheritanceMapping.Count, "ContentObservable mapping not found"); var kls = api.FindNonGenericType("android.database.ContentObservable") as JavaClass; var map = kls.GenericInheritanceMapping; Assert.IsNotNull(map, "ContentObservable mapping not found"); Assert.AreEqual(1, map.Count, "ContentObservable mapping count unexpected"); Assert.IsNotNull(map.Keys.First().ReferencedTypeParameter, "key is not GenericTypeParameter"); Assert.IsNotNull("T", map.Keys.First().ReferencedTypeParameter.Name, "key GenericTypeParameter has unexpected name"); Assert.IsNotNull(map.Values.First().ReferencedType, "value is not to JavaType"); Assert.IsNotNull("android.database.ContentObserver", map.Values.First().ReferencedType.FullName, "value JavaType has unexpected name"); var dummyType = new JavaClass(new JavaPackage(api) { Name = string.Empty }) { Name = "Dummy" }; var tps = new JavaTypeParameters(dummyType); JavaTypeReference mapped; Assert.IsTrue(map.TryGetValue(new JavaTypeReference(new JavaTypeParameter(tps) { Name = "T" }, null), out mapped), "Mapped type for generic parameter 'T' not found, or dictionary lookup failed."); Assert.AreEqual("android.database.ContentObserver", mapped.ReferencedType.FullName, "unexpected resolved type"); }
public void GenericDerivation() { var dic = api.FindType("java.util.Dictionary") as JavaClassModel; Assert.IsNotNull(dic, "Dictionary not found"); Assert.AreEqual(0, dic.GenericInheritanceMapping.Count, "Dictionary should have no mapping."); var hashtable = api.FindType("java.util.Hashtable") as JavaClassModel; Assert.IsNotNull(hashtable, "Hashtable not found"); Assert.AreEqual(0, hashtable.GenericInheritanceMapping.Count, "Hashtable should have no mapping."); var pkg = new JavaPackage("com.example", "com/example", null); var dummyType = JavaApiTestHelper.CreateClass(pkg, "Dummy"); var tps = new JavaTypeParameters(dummyType); var props = api.FindType("java.util.Properties") as JavaClassModel; Assert.IsNotNull(props, "Properties not found"); Assert.AreEqual(2, props.GenericInheritanceMapping.Count, "Properties should have no mapping."); var k = new JavaTypeReference(new JavaTypeParameter("K", tps), null); var v = new JavaTypeReference(new JavaTypeParameter("V", tps), null); Assert.IsNotNull(props.GenericInheritanceMapping [k], "Properties: mapping for K not found."); Assert.AreEqual("java.lang.Object", props.GenericInheritanceMapping [k].ReferencedType.FullName, "Properties: mapping for K is not to java.lang.Object."); Assert.AreEqual("java.lang.Object", props.GenericInheritanceMapping [v].ReferencedType.FullName, "Properties: mapping for K is not to java.lang.Object."); }
public void GenericInheritanceMappings() { var obj = api.FindType("java.lang.Object") as JavaClassModel; Assert.IsNotNull(obj.GenericInheritanceMapping, "java.lang.Object mapping not found"); Assert.AreEqual(0, obj.GenericInheritanceMapping.Count, "ContentObservable mapping not found"); var kls = api.FindType("android.database.ContentObservable") as JavaClassModel; var map = kls.GenericInheritanceMapping; Assert.IsNotNull(map, "ContentObservable mapping not found"); Assert.AreEqual(1, map.Count, "ContentObservable mapping count unexpected"); Assert.IsNotNull(map.Keys.First().ReferencedTypeParameter, "key is not GenericTypeParameter"); Assert.IsNotNull("T", map.Keys.First().ReferencedTypeParameter.Name, "key GenericTypeParameter has unexpected name"); Assert.IsNotNull(map.Values.First().ReferencedType, "value is not to JavaType"); Assert.IsNotNull("android.database.ContentObserver", map.Values.First().ReferencedType.FullName, "value JavaType has unexpected name"); var pkg = new JavaPackage("com.example", "com/example", null); var dummyType = JavaApiTestHelper.CreateClass(pkg, "Dummy"); var tps = new JavaTypeParameters(dummyType); var gt = new JavaTypeParameter("T", tps); Assert.IsTrue(map.TryGetValue(new JavaTypeReference(gt, null), out var mapped), "Mapped type for generic parameter 'T' not found, or dictionary lookup failed."); Assert.AreEqual("android.database.ContentObserver", mapped.ReferencedType.FullName, "unexpected resolved type"); }
public void TypeReferenceEquals() { var intRef = new JavaTypeReference("int"); Assert.AreEqual(intRef, new JavaTypeReference("int"), "primitive types"); Assert.AreEqual(JavaTypeReference.Int, intRef, "primitive types 2"); Assert.AreNotEqual(new JavaTypeReference("void"), intRef, "primitive types 3"); Assert.AreNotEqual(intRef, new JavaTypeReference(intRef, "[]"), "primitive types: array vs. non-array"); Assert.AreEqual(new JavaTypeReference(intRef, "[]"), new JavaTypeReference(intRef, "[]"), "primitive types: array vs. array"); var dummyType = new JavaClass(new JavaPackage(api) { Name = string.Empty }) { Name = "Dummy" }; var tps = new JavaTypeParameters(dummyType); var gt = new JavaTypeParameter(tps) { Name = "T" }; Assert.AreEqual(new JavaTypeReference(gt, null), new JavaTypeReference(new JavaTypeParameter(tps) { Name = "T" }, null), "type parameters"); Assert.AreNotEqual(new JavaTypeReference(gt, null), new JavaTypeReference(new JavaTypeParameter(tps) { Name = "U" }, null), "type parameters 2"); Assert.AreNotEqual(new JavaTypeReference(gt, null), new JavaTypeReference("T"), "primitive vs. type parameters"); Assert.AreNotEqual(new JavaTypeReference(gt, null), new JavaTypeReference(gt, "[]"), "type parameters: array vs. non-array"); Assert.AreEqual(new JavaTypeReference(gt, "[]"), new JavaTypeReference(gt, "[]"), "type parameters: array vs. array"); var type = new JavaClass(new JavaPackage(api) { Name = string.Empty }) { Name = "T" }; Assert.AreEqual(new JavaTypeReference(type, null, null), new JavaTypeReference(type, null, null), "type vs. type"); Assert.AreNotEqual(new JavaTypeReference(type, null, "[]"), new JavaTypeReference(type, null, null), "type: array vs. non array"); Assert.AreNotEqual(new JavaTypeReference(type, null, "[]"), new JavaTypeReference(type, null, "[][]"), "type: array vs. array of array"); Assert.AreNotEqual(new JavaTypeReference(type, null, null), new JavaTypeReference(new JavaTypeParameter(tps) { Name = "T" }, null), "type vs. type parameters"); Assert.AreNotEqual(new JavaTypeReference(gt, "[]"), new JavaTypeReference(type, null, null), "type: array vs. non array"); Assert.AreNotEqual(new JavaTypeReference(type, null, "[]"), new JavaTypeReference(type, null, "[][]"), "type: array vs. array of array"); }
static void SaveTypeParameters(JavaTypeParameters parameters, XmlWriter writer) { if (parameters.Count == 0) { return; } writer.WriteStartElement("typeParameters"); if (parameters.PropertyBag.TryGetValue("merge.SourceFile", out var source)) { writer.WriteAttributeString("merge.SourceFile", source); } foreach (var tp in parameters) { writer.WriteStartElement("typeParameter"); writer.WriteAttributeString("name", tp.Name); writer.WriteAttributeStringIfValue("classBound", tp.ExtendedClassBound); writer.WriteAttributeStringIfValue("jni-classBound", tp.ExtendedJniClassBound); writer.WriteAttributeStringIfValue("interfaceBounds", tp.ExtendedInterfaceBounds); writer.WriteAttributeStringIfValue("jni-interfaceBounds", tp.ExtendedJniInterfaceBounds); if (tp.GenericConstraints.Count > 0) { // If there is only one generic constraint that specifies java.lang.Object, // that is not really a constraint, so skip that. // jar2xml does not emit that either. if (tp.GenericConstraints.Count == 1 && tp.GenericConstraints[0].Type == "java.lang.Object") { WriteFullEndElement(writer); continue; } writer.WriteStartElement("genericConstraints"); foreach (var g in tp.GenericConstraints) { writer.WriteStartElement("genericConstraint"); writer.WriteAttributeString("type", g.Type); WriteFullEndElement(writer); } WriteFullEndElement(writer); } WriteFullEndElement(writer); } WriteFullEndElement(writer); }
public static void ParseTypeParameters(JavaTypeParameters parameters, XElement element) { foreach (var elem in element.Elements()) { if (elem.Name.LocalName == "typeParameter") { ParseTypeParameter(parameters, elem); } } if (element.XGetAttribute("merge.SourceFile") is string source && source.HasValue()) { parameters.PropertyBag.Add("merge.SourceFile", source); } }
public static void ParseTypeParameter(JavaTypeParameters parameters, XElement element) { var parameter = new JavaTypeParameter(element.XGetAttribute("name"), parameters) { ExtendedJniClassBound = element.XGetAttribute("jni-classBound"), ExtendedClassBound = element.XGetAttribute("classBound"), ExtendedInterfaceBounds = element.XGetAttribute("interfaceBounds"), ExtendedJniInterfaceBounds = element.XGetAttribute("jni-interfaceBounds") }; parameters.Add(parameter); if (element.Element("genericConstraints") is XElement gc) { parameter.GenericConstraints.AddRange(ParseGenericConstraints(gc)); return; } // 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(parameter.ExtendedClassBound) || !string.IsNullOrEmpty(parameter.ExtendedInterfaceBounds)) { if (!string.IsNullOrEmpty(parameter.ExtendedClassBound)) { parameter.GenericConstraints.Add(new JavaGenericConstraint(parameter.ExtendedClassBound)); } if (!string.IsNullOrEmpty(parameter.ExtendedInterfaceBounds)) { foreach (var ic in parameter.ExtendedInterfaceBounds.Split(':')) { parameter.GenericConstraints.Add(new JavaGenericConstraint(ic)); } } } }
public void GenericDerivation() { var dic = api.FindNonGenericType("java.util.Dictionary") as JavaClass; Assert.IsNotNull(dic, "Dictionary not found"); Assert.AreEqual(0, dic.GenericInheritanceMapping.Count, "Dictionary should have no mapping."); var hashtable = api.FindNonGenericType("java.util.Hashtable") as JavaClass; Assert.IsNotNull(hashtable, "Hashtable not found"); Assert.AreEqual(0, hashtable.GenericInheritanceMapping.Count, "Hashtable should have no mapping."); var dummyType = new JavaClass(new JavaPackage(api) { Name = string.Empty }) { Name = "Dummy" }; var tps = new JavaTypeParameters(dummyType); var props = api.FindNonGenericType("java.util.Properties") as JavaClass; Assert.IsNotNull(props, "Properties not found"); Assert.AreEqual(2, props.GenericInheritanceMapping.Count, "Properties should have no mapping."); var k = new JavaTypeReference(new JavaTypeParameter(tps) { Name = "K" }, null); var v = new JavaTypeReference(new JavaTypeParameter(tps) { Name = "V" }, null); Assert.IsNotNull(props.GenericInheritanceMapping [k], "Properties: mapping for K not found."); Assert.AreEqual("java.lang.Object", props.GenericInheritanceMapping [k].ReferencedType.FullName, "Properties: mapping for K is not to java.lang.Object."); Assert.AreEqual("java.lang.Object", props.GenericInheritanceMapping [v].ReferencedType.FullName, "Properties: mapping for K is not to java.lang.Object."); }
IEnumerable <ApiComparisonReport> CompareTypeParameters(string reference, string target, JavaTypeParameters rTPs, JavaTypeParameters tTPs) { if (rTPs == null) { yield break; } if (tTPs == null) { yield return new ApiComparisonReport { Context = rTPs, Issue = ApiComparisonIssue.MissingTypeParameter, Message = $"`{target}` does not have any type parameter." } } ; else { foreach (var rTP in rTPs.TypeParameters) { var tTP = tTPs?.TypeParameters?.FirstOrDefault(_ => _.Name == rTP.Name); if (tTP == null) { yield return new ApiComparisonReport { Context = rTP, Issue = ApiComparisonIssue.MissingTypeParameter, Message = $"`{target}` does not have type parameter `{rTP.Name}`." } } ; } } } }