/// <summary> /// Attempts to resolve current node and sets either of the following fields: /// _Field, _Method, _Property /// /// The following fields are also set: /// _Type, _Static /// </summary> private void resolveSelf(Context ctx) { Action check = () => { if (Expression == null && !_IsStatic) error(CompilerMessages.DynamicMemberFromStaticContext, _Type, MemberName); if (_Method == null && TypeHints.Count > 0) error(CompilerMessages.TypeArgumentsForNonMethod, _Type, MemberName); }; _Type = StaticType != null ? ctx.ResolveType(StaticType) : Expression.Resolve(ctx); // special case: array length if (_Type.IsArray && MemberName == "Length") { check(); return; } // check for field try { _Field = ctx.ResolveField(_Type, MemberName); _IsStatic = _Field.IsStatic; check(); return; } catch (KeyNotFoundException) { } // check for property try { _Property = ctx.ResolveProperty(_Type, MemberName); if(!_Property.CanGet) error(CompilerMessages.PropertyNoGetter, _Type, MemberName); _IsStatic = _Property.IsStatic; check(); return; } catch (KeyNotFoundException) { } // check for event: events are only allowed at the left side of += and -= try { ctx.ResolveEvent(_Type, MemberName); error(CompilerMessages.EventAsExpr); } catch (KeyNotFoundException) { } // find method var argTypes = TypeHints.Select(t => t.FullSignature == "_" ? null : ctx.ResolveType(t)).ToArray(); var methods = ctx.ResolveMethodGroup(_Type, MemberName).Where(m => checkMethodArgs(argTypes, m)).ToArray(); if (methods.Length == 0) error(argTypes.Length == 0 ? CompilerMessages.TypeIdentifierNotFound : CompilerMessages.TypeMethodNotFound, _Type.Name, MemberName); if (methods.Length > 1) error(CompilerMessages.TypeMethodAmbiguous, _Type.Name, MemberName); _Method = methods[0]; if (_Method.ArgumentTypes.Length > 16) error(CompilerMessages.CallableTooManyArguments); _IsStatic = _Method.IsStatic; check(); }
private void resolve(Context ctx) { Action check = () => { if (Expression == null && !m_IsStatic) Error(CompilerMessages.DynamicMemberFromStaticContext, MemberName); if(m_Method == null && TypeHints.Count > 0) Error(CompilerMessages.TypeArgumentsForNonMethod, m_Type, MemberName); m_IsResolved = true; }; m_Type = StaticType != null ? ctx.ResolveType(StaticType) : Expression.GetExpressionType(ctx); // special case: array length if (m_Type.IsArray && MemberName == "Length") { check(); return; } // check for field try { m_Field = ctx.ResolveField(m_Type, MemberName); m_IsStatic = m_Field.IsStatic; check(); return; } catch (KeyNotFoundException) { } // check for property try { m_Property = ctx.ResolveProperty(m_Type, MemberName); if(!m_Property.CanGet) Error(CompilerMessages.PropertyNoGetter, m_Type, MemberName); m_IsStatic = m_Property.IsStatic; check(); return; } catch (KeyNotFoundException) { } var argTypes = TypeHints.Select(t => t.FullSignature == "_" ? null : ctx.ResolveType(t)).ToArray(); var methods = ctx.ResolveMethodGroup(m_Type, MemberName).Where(m => checkMethodArgs(ctx, argTypes, m)).ToArray(); if (methods.Length == 0) Error(argTypes.Length == 0 ? CompilerMessages.TypeIdentifierNotFound : CompilerMessages.TypeMethodNotFound, m_Type.Name, MemberName); if (methods.Length > 1) Error(CompilerMessages.TypeMethodAmbiguous, m_Type.Name, MemberName); m_Method = methods[0]; if (m_Method.ArgumentTypes.Length > 16) Error(CompilerMessages.CallableTooManyArguments); m_IsStatic = m_Method.IsStatic; check(); }