コード例 #1
0
        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");
        }
コード例 #2
0
        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");
        }
コード例 #3
0
        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.");
        }
コード例 #4
0
        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");
        }
コード例 #5
0
        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");
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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));
                    }
                }
            }
        }
コード例 #9
0
        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.");
        }
コード例 #10
0
        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}`."
                        }
                    }
                    ;
                }
            }
        }
    }