示例#1
0
        internal override Node Bind(Binder b)
        {
            Symbol = b.Lookup(Name);
            if (Affinity != BindAffinity.Invoke && Affinity != BindAffinity.Type)
            {
                if (Symbol.IsMethodOrMethodGroup())
                {
                    // IdExpr can't be a method
                    // TODO (nvk): If delegates are supprted this needs to be revised!
                    Symbol = null;
                }
                else if (Symbol is TypeSymbol)
                {
                    Symbol = null;
                }
                else if (Symbol is NamespaceSymbol)
                {
                    Symbol = null;
                }
                else if (Symbol is SymbolList)
                {
                    Symbol = Symbol.UniqueIdent();
                }
            }
            if (Symbol == null && Affinity != BindAffinity.Type)
            {
                if (Affinity == BindAffinity.Alias)
                {
                    return(LiteralExpr.Bound(Constant.Create(Name)));
                }
                else
                {
                    switch (b.Options.UndeclaredVariableResolution)
                    {
                    case VariableResolution.Error:
                        throw Error(ErrorCode.IdentifierNotFound, Name);

                    case VariableResolution.GenerateLocal:
                        Symbol = b.AddVariable(Name, Compilation.Get(NativeType.Usual));
                        break;

                    case VariableResolution.TreatAsField:
                        return(AliasExpr.Bound(Name));

                    case VariableResolution.TreatAsFieldOrMemvar:
                        if (Affinity == BindAffinity.Assign)
                        {
                            b.CreatesAutoVars = true;
                        }
                        return(AutoVarExpr.Bound(Name));
                    }
                }
            }
            Datatype = Symbol.Type();
            return(null);
        }