Exemple #1
0
 public virtual void VisitInstanceFunctionCall(BoundInstanceFunctionCall x)
 {
     Accept(x.Instance);
     VisitRoutineCall(x);
 }
 public virtual void VisitInstanceFunctionCall(BoundInstanceFunctionCall x)
 {
     Accept(x.Instance);
     VisitRoutineCall(x);
 }
 public virtual TResult VisitInstanceFunctionCall(BoundInstanceFunctionCall x) => VisitRoutineCall(x);
        public override void VisitInstanceFunctionCall(BoundInstanceFunctionCall x)
        {

            Accept(x.Instance);
            Accept(x.Name.NameExpression);

            VisitRoutineCall(x);

            if (x.Name.IsDirect)
            {
                var typeref = TypeCtx.GetTypes(x.Instance.TypeRefMask);
                if (typeref.Count > 1)
                {
                    // TODO: some common base ?
                }

                if (typeref.Count == 1)
                {
                    var classtype = typeref.Where(t => t.IsObject).AsImmutable().SingleOrDefault();
                    if (classtype != null)
                    {
                        var type = (NamedTypeSymbol)_model.GetType(classtype.QualifiedName);
                        if (type != null)
                        {
                            var candidates = type.LookupMethods(x.Name.NameValue.Name.Value);
                            var args = x.ArgumentsInSourceOrder.Select(a => a.Value.TypeRefMask).ToArray();
                            x.TargetMethod = new OverloadsList(candidates.ToArray()).Resolve(this.TypeCtx, args, this.TypeCtx.ContainingType);
                        }
                    }
                }
            }

            VisitRoutineCallEpilogue(x);
        }