Exemple #1
0
        private DataType resolve_type(UnresolvedType unresolved_type)
        {
            DataType type = null;

            // still required for vapigen
            if (unresolved_type.unresolved_symbol.name == "void")
            {
                return(new VoidType());
            }

            var sym = resolve_symbol(unresolved_type.unresolved_symbol);

            if (sym == null)
            {
                // don't report same error twice
                if (!unresolved_type.unresolved_symbol.error)
                {
                    Report.error(unresolved_type.source_reference, "The type name `%s' could not be found".printf(unresolved_type.unresolved_symbol.ToString()));
                }
                return(new InvalidType());
            }

            if (sym is TypeParameter)
            {
                type = new GenericType((TypeParameter)sym);
            }
            else if (sym is TypeSymbol)
            {
                if (sym is ValaDelegate)
                {
                    type = new DelegateType((ValaDelegate)sym);
                }
                else if (sym is Class)
                {
                    var cl = (Class)sym;
                    if (cl.is_error_base)
                    {
                        type = new ErrorType(null, null, unresolved_type.source_reference);
                    }
                    else
                    {
                        type = new ObjectType(cl);
                    }
                }
                else if (sym is Interface)
                {
                    type = new ObjectType((Interface)sym);
                }
                else if (sym is Struct)
                {
                    type = get_type_for_struct((Struct)sym, (Struct)sym);
                }
                else if (sym is ValaEnum)
                {
                    type = new EnumValueType((ValaEnum)sym);
                }
                else if (sym is ErrorDomain)
                {
                    type = new ErrorType((ErrorDomain)sym, null, unresolved_type.source_reference);
                }
                else if (sym is ErrorCode)
                {
                    type = new ErrorType((ErrorDomain)sym.parent_symbol, (ErrorCode)sym, unresolved_type.source_reference);
                }
                else
                {
                    Report.error(unresolved_type.source_reference, "internal error: `%s' is not a supported type".printf(sym.get_full_name()));
                    return(new InvalidType());
                }
            }
            else
            {
                Report.error(unresolved_type.source_reference, "`%s' is not a type".printf(sym.get_full_name()));
                return(new InvalidType());
            }

            type.source_reference = unresolved_type.source_reference;
            type.value_owned      = unresolved_type.value_owned;
            sym.used = true;

            if (type is GenericType)
            {
                // type parameters are always considered nullable
                // actual type argument may or may not be nullable
                type.nullable = true;
            }
            else
            {
                type.nullable = unresolved_type.nullable;
            }

            type.is_dynamic = unresolved_type.is_dynamic;
            foreach (DataType type_arg in unresolved_type.get_type_arguments())
            {
                type.add_type_argument(type_arg);
            }

            return(type);
        }