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