Exemple #1
0
        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);
        }
Exemple #2
0
 public static ResolvedType GetInstanceType(TypeContext ctx, ClassDefinition cd)
 {
     return(GetClassTypeImpl(ctx, ResolvedTypeCategory.INSTANCE, cd));
 }
Exemple #3
0
 public static ResolvedType GetClassRefType(TypeContext ctx, ClassDefinition cd)
 {
     return(GetClassTypeImpl(ctx, ResolvedTypeCategory.CLASS_DEFINITION, cd));
 }
Exemple #4
0
 internal ResolvedType(TypeContext ctx, ResolvedTypeCategory category)
 {
     this.ctx      = ctx;
     this.Category = category;
     this.id       = ctx.GetNextId();
 }