Esempio n. 1
0
        Access(ExpressionNodeInfo info, ISymbol symbol, bool implicitThis, IEntity target)
            : base(info.SetKind(AccessKind(info.Context, symbol)))
        {
            cx.TrapWriter.Writer.expr_access(this, target);

            if (implicitThis && !symbol.IsStatic)
            {
                This.CreateImplicit(cx, Entities.Type.Create(cx, symbol.ContainingType), Location, this, -1);
            }
        }
Esempio n. 2
0
        private Access(ExpressionNodeInfo info, ISymbol symbol, bool implicitThis, IEntity target)
            : base(info.SetKind(AccessKind(info.Context, symbol)))
        {
            if (!(target is null))
            {
                Context.TrapWriter.Writer.expr_access(this, target);
            }

            if (implicitThis && !symbol.IsStatic)
            {
                This.CreateImplicit(Context, symbol.ContainingType, Location, this, -1);
            }
        }
        protected override void PopulateExpression(TextWriter trapFile)
        {
            if (IsNameof(Syntax))
            {
                PopulateArguments(trapFile, Syntax.ArgumentList, 0);
                return;
            }

            var    child      = -1;
            string?memberName = null;
            var    target     = TargetSymbol;

            switch (Syntax.Expression)
            {
            case MemberAccessExpressionSyntax memberAccess:
                memberName = memberAccess.Name.Identifier.Text;
                if (Syntax.Expression.Kind() == SyntaxKind.SimpleMemberAccessExpression)
                {
                    // Qualified method call; `x.M()`
                    Create(Context, memberAccess.Expression, this, child++);
                }
                else
                {
                    // Pointer member access; `x->M()`
                    Create(Context, Syntax.Expression, this, child++);
                }
                break;

            case MemberBindingExpressionSyntax memberBinding:
                // Conditionally qualified method call; `x?.M()`
                memberName = memberBinding.Name.Identifier.Text;
                Create(Context, FindConditionalQualifier(memberBinding), this, child++);
                MakeConditional(trapFile);
                break;

            case SimpleNameSyntax simpleName when(Kind == ExprKind.METHOD_INVOCATION):
                // Unqualified method call; `M()`
                memberName = simpleName.Identifier.Text;

                if (target is not null && !target.IsStatic)
                {
                    // Implicit `this` qualifier; add explicitly
                    if (Location.Symbol is not null &&
                        Context.GetModel(Syntax).GetEnclosingSymbol(Location.Symbol.SourceSpan.Start) is IMethodSymbol callingMethod)
                    {
                        This.CreateImplicit(Context, callingMethod.ContainingType, Location, this, child++);
                    }
Esempio n. 4
0
        protected override void PopulateExpression(TextWriter trapFile)
        {
            if (IsNameof(Syntax))
            {
                PopulateArguments(trapFile, Syntax.ArgumentList, 0);
                return;
            }

            var    child      = -1;
            string memberName = null;
            var    target     = TargetSymbol;

            switch (Syntax.Expression)
            {
            case MemberAccessExpressionSyntax memberAccess:
                memberName = memberAccess.Name.Identifier.Text;
                if (Syntax.Expression.Kind() == SyntaxKind.SimpleMemberAccessExpression)
                {
                    // Qualified method call; `x.M()`
                    Create(cx, memberAccess.Expression, this, child++);
                }
                else
                {
                    // Pointer member access; `x->M()`
                    Create(cx, Syntax.Expression, this, child++);
                }
                break;

            case MemberBindingExpressionSyntax memberBinding:
                // Conditionally qualified method call; `x?.M()`
                memberName = memberBinding.Name.Identifier.Text;
                Create(cx, FindConditionalQualifier(memberBinding), this, child++);
                MakeConditional(trapFile);
                break;

            case SimpleNameSyntax simpleName when(Kind == ExprKind.METHOD_INVOCATION):
                // Unqualified method call; `M()`
                memberName = simpleName.Identifier.Text;

                if (target != null && !target.IsStatic)
                {
                    // Implicit `this` qualifier; add explicitly

                    if (cx.GetModel(Syntax).GetEnclosingSymbol(Location.symbol.SourceSpan.Start) is IMethodSymbol callingMethod)
                    {
                        This.CreateImplicit(cx, callingMethod.ContainingType, Location, this, child++);
                    }
                    else
                    {
                        cx.ModelError(Syntax, "Couldn't determine implicit this type");
                    }
                }
                else
                {
                    // No implicit `this` qualifier
                    child++;
                }
                break;

            default:
                // Delegate or function pointer call; `d()`
                Create(cx, Syntax.Expression, this, child++);
                break;
            }

            var isDynamicCall = IsDynamicCall(info);

            if (isDynamicCall)
            {
                if (memberName != null)
                {
                    trapFile.dynamic_member_name(this, memberName);
                }
                else
                {
                    cx.ModelError(Syntax, "Unable to get name for dynamic call.");
                }
            }

            PopulateArguments(trapFile, Syntax.ArgumentList, child);

            if (target == null)
            {
                if (!isDynamicCall && !IsDelegateLikeCall(info))
                {
                    cx.ModelError(Syntax, "Unable to resolve target for call. (Compilation error?)");
                }
                return;
            }

            var targetKey = Method.Create(cx, target);

            trapFile.expr_call(this, targetKey);
        }