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