public bool CanAssignToA(ResolvedType targetType) { if (this.Category == ResolvedTypeCategory.ANY) { return(true); } ResolvedTypeCategory targetCategory = targetType.Category; if (targetCategory == ResolvedTypeCategory.ANY) { return(true); } if (targetCategory == ResolvedTypeCategory.OBJECT) { return(true); } if (this.Category == ResolvedTypeCategory.NULL) { switch (targetCategory) { case ResolvedTypeCategory.INSTANCE: case ResolvedTypeCategory.CLASS_DEFINITION: case ResolvedTypeCategory.FUNCTION_POINTER: case ResolvedTypeCategory.STRING: case ResolvedTypeCategory.LIST: case ResolvedTypeCategory.DICTIONARY: return(true); default: return(false); } } if (this.Category == ResolvedTypeCategory.VOID) { return(false); } if (this.Category == ResolvedTypeCategory.INTEGER && targetCategory == ResolvedTypeCategory.FLOAT) { return(true); } if (this.Category != targetCategory) { return(false); } if (targetCategory == ResolvedTypeCategory.INSTANCE) { ClassDefinition targetClass = targetType.ClassTypeOrReference; ClassDefinition baseClassWalker = this.ClassTypeOrReference; while (baseClassWalker != null) { if (baseClassWalker == targetClass) { return(true); } baseClassWalker = baseClassWalker.BaseClass; } return(false); } if (this.Category == ResolvedTypeCategory.LIST || this.Category == ResolvedTypeCategory.DICTIONARY) { TypeContext ctx = targetType.ctx; for (int i = 0; i < this.Generics.Length; ++i) { if (this.Generics[i] == targetType.Generics[i]) { } else if (this.Generics[i] == ctx.ANY && targetType.Generics[i] == ctx.OBJECT) { } else { return(false); } } return(true); } return(true); }
public static ResolvedType GetInstanceType(TypeContext ctx, ClassDefinition cd) { return(GetClassTypeImpl(ctx, ResolvedTypeCategory.INSTANCE, cd)); }
public static ResolvedType GetClassRefType(TypeContext ctx, ClassDefinition cd) { return(GetClassTypeImpl(ctx, ResolvedTypeCategory.CLASS_DEFINITION, cd)); }
internal ResolvedType(TypeContext ctx, ResolvedTypeCategory category) { this.ctx = ctx; this.Category = category; this.id = ctx.GetNextId(); }