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; }
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 ); }