private Type ResolveType(string type, int arrayIndex)
        {
            var result = TypeUtil.GetBuiltInType(type, _resolver.DynamicExpression.Language);

            if (result == null)
                result = Type.GetType(type, false, _resolver.IgnoreCase);

            // This deviates from the specs but allows us to not include
            // boolean and single in the known types table.

            if (result == null)
                result = Type.GetType("System." + type, false, _resolver.IgnoreCase);

            if (result == null)
                result = FindTypeInImports(type);

            if (result == null)
            {
                throw new ExpressionsException(
                    String.Format("Unknown type '{0}'", type),
                    ExpressionsExceptionType.InvalidExplicitCast
                );
            }

            if (arrayIndex == 1)
                result = result.MakeArrayType();
            else if (arrayIndex > 1)
                result = result.MakeArrayType(arrayIndex);

            return result;
        }
Exemple #2
0
        public IExpression IdentifierAccess(IdentifierAccess identifierAccess)
        {
            // First try variables.

            var identifiers = _resolver.DynamicExpression.ParseResult.Identifiers;

            for (int i = 0; i < _resolver.IdentifierTypes.Length; i++)
            {
                if (
                    _resolver.IdentifierTypes[i] != null &&
                    _resolver.IdentifiersEqual(identifiers[i].Name, identifierAccess.Name)
                    )
                {
                    return(VariableAccess(_resolver.IdentifierIndexes[i], _resolver.IdentifierTypes[i]));
                }
            }

            // Next, we go through the owner type.

            if (_resolver.OwnerType != null)
            {
                var result = Resolve(new VariableAccess(_resolver.OwnerType, 0), identifierAccess.Name);

                if (result == null)
                {
                    result = Resolve(new TypeAccess(_resolver.OwnerType), identifierAccess.Name);
                }

                if (result != null)
                {
                    return(result);
                }
            }

            // Next, imports. Namespaces have precedence.

            foreach (var import in _resolver.Imports)
            {
                if (
                    import.Namespace != null &&
                    _resolver.IdentifiersEqual(import.Namespace, identifierAccess.Name)
                    )
                {
                    if (import.Type != null)
                    {
                        return(new TypeAccess(import.Type));
                    }
                    else
                    {
                        return(new ImportAccess(import));
                    }
                }
            }

            // Next, members of the imports.

            foreach (var import in _resolver.Imports)
            {
                if (import.Namespace == null)
                {
                    var result = Resolve(new TypeAccess(import.Type), identifierAccess.Name);

                    if (result != null)
                    {
                        return(result);
                    }
                }
            }

            // Last, see whether the identifier is a built in type.

            var type = TypeUtil.GetBuiltInType(identifierAccess.Name, _resolver.DynamicExpression.Language);

            if (type != null)
            {
                return(new TypeAccess(type));
            }

            throw new ExpressionsException(
                      String.Format("Unresolved identifier '{0}'", identifierAccess.Name),
                      ExpressionsExceptionType.UndefinedName
                      );
        }