static JavaTypeReference JavaTypeNameToReference(this JavaApi api, JavaTypeName tn, params JavaTypeParameters?[] contextTypeParameters) { var tp = contextTypeParameters.Where(tps => tps != null) .SelectMany(tps => tps !.TypeParameters) .FirstOrDefault(xp => xp.Name == tn.DottedName); if (tp != null) { return(new JavaTypeReference(tp, tn.ArrayPart)); } if (tn.DottedName == JavaTypeReference.GenericWildcard.SpecialName) { return(new JavaTypeReference(tn.BoundsType, tn.GenericConstraints?.Select(gc => JavaTypeNameToReference(api, gc, contextTypeParameters)), tn.ArrayPart)); } var primitive = JavaTypeReference.GetSpecialType(tn.DottedName); if (primitive != null) { return(tn.ArrayPart == null && tn.GenericConstraints == null ? primitive : new JavaTypeReference(primitive, tn.ArrayPart, tn.BoundsType, tn.GenericConstraints?.Select(gc => JavaTypeNameToReference(api, gc, contextTypeParameters)))); } var type = api.FindNonGenericType(tn.FullNameNonGeneric); return(new JavaTypeReference(type, tn.GenericArguments != null ? tn.GenericArguments.Select(_ => api.JavaTypeNameToReference(_, contextTypeParameters)).ToArray() : null, tn.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); }
public JavaTypeReference(JavaTypeReference referencedType, string arrayPart) { if (referencedType == null) { throw new ArgumentNullException("referencedType"); } SpecialName = referencedType.SpecialName; ReferencedType = referencedType.ReferencedType; TypeParameters = referencedType.TypeParameters; ArrayPart = arrayPart; }
static JavaTypeReference() { Void = new JavaTypeReference("void"); Boolean = new JavaTypeReference("boolean"); Char = new JavaTypeReference("char"); Byte = new JavaTypeReference("byte"); Short = new JavaTypeReference("short"); Int = new JavaTypeReference("int"); Long = new JavaTypeReference("long"); Float = new JavaTypeReference("float"); Double = new JavaTypeReference("double"); GenericWildcard = new JavaTypeReference("?"); }
public JavaTypeReference(JavaTypeReference referencedType, string?arrayPart, string?wildcardBoundsType, IEnumerable <JavaTypeReference>?wildcardConstraints) { if (referencedType == null) { throw new ArgumentNullException("referencedType"); } SpecialName = referencedType.SpecialName; WildcardBoundsType = wildcardBoundsType; WildcardConstraints = wildcardConstraints?.ToList(); ReferencedType = referencedType.ReferencedType; ReferencedTypeParameter = referencedType.ReferencedTypeParameter; TypeParameters = referencedType.TypeParameters; ArrayPart = arrayPart; }
// It compares two JavaTypeReferences. // Note that it is to compare them as a type reference, not as its object entity. // So, for example, if one has a TypeParameter with T with some contraint and // the other has a TypeParameter with T somehow without it, they are still "same". public static bool AreEqual(JavaTypeReference tr1, JavaTypeReference?tr2) { if (tr1 == null) { return(tr2 == null); } else if (tr2 == null) { return(false); } if (tr1.ArrayPart != tr2.ArrayPart) { return(false); } if (tr1.SpecialName != null) { return(tr1.SpecialName == tr2.SpecialName); } if (tr1.ReferencedTypeParameter != null) { if (tr2.ReferencedTypeParameter == null || tr1.ReferencedTypeParameter.Name != tr2.ReferencedTypeParameter.Name) { return(false); } return(true); } else if (tr2.ReferencedTypeParameter != null) { return(false); } if (tr1.ReferencedType == null || tr2.ReferencedType == null) { return(false); } if (tr1.ReferencedType.Parent != tr2.ReferencedType.Parent) { return(false); } if (tr1.ReferencedType.Name != tr2.ReferencedType.Name) { return(false); } return(true); }
static JavaTypeReference JavaTypeNameToReference(this JavaApi api, JavaTypeName tn, params JavaTypeParameters [] contextTypeParameters) { var tp = contextTypeParameters.Where(tps => tps != null).SelectMany(tps => tps.TypeParameters).FirstOrDefault(_ => _.Name == tn.FullNameNonGeneric); if (tp != null) { return(new JavaTypeReference(tp, tn.ArrayPart)); } var primitive = JavaTypeReference.GetSpecialType(tn.FullNameNonGeneric); if (primitive != null) { return(tn.ArrayPart == null ? primitive : new JavaTypeReference(primitive, tn.ArrayPart)); } var type = api.FindNonGenericType(tn.FullNameNonGeneric); return(new JavaTypeReference(type, tn.GenericArguments != null ? tn.GenericArguments.Select(_ => api.JavaTypeNameToReference(_, contextTypeParameters)).ToArray() : null, tn.ArrayPart)); }
static JavaTypeReference GetVisibleNonSpecialType(this JavaMethodBase method, JavaTypeReference r) { if (r == null || r.SpecialName != null || r.ReferencedTypeParameter != null || r.ArrayPart != null) { return(null); } var requiredVisibility = method.Visibility == "public" && method.Parent.Visibility == "public" ? "public" : method.Visibility; for (var t = r; t != null; t = (t.ReferencedType as JavaClass)?.ResolvedExtends) { if (t.ReferencedType == null) { break; } if (IsAcceptableVisibility(required: requiredVisibility, actual: t.ReferencedType.Visibility)) { return(t); } } return(null); }