CallResolver handles the process of resolving a CallExpr or UnknownVarExpr to a method call or a field access.
Slots
- argsSource
-
Expr[] args
- baseSource
-
CType? base
-
private Void castForThisType()
If the epxression is a call which returns sys::This, then we need to insert an implicit cast.
-
private Void constantFolding()
If the epxression is a call, check for constant folding.
- curMethodSource
-
MethodDef? curMethod
- curTypeSource
-
TypeDef curType
-
private Str errSig()
- exprSource
-
NameExpr expr
-
private Void ffiCoercion()
If this field access or method call returns a type which isn't directly represented in the Fan type system, then implicitly coerce it
- findSource
-
Void find()
Find the method or field with the specified name.
- foundSource
-
CSlot? found
-
private Void insertImplicitThis()
If the call has no explicit target, and is a instance field or method, then we need to insert an implicit this.
- isStaticLiteralSource
-
Bool isStaticLiteral()
If this is a standalone name without a base target such as "Foo" and the name maps to a type name, then this is a type literal.
- isVarSource
-
Bool isVar
- locationSource
-
Location location
- makeSource
-
new make(Compiler compiler, TypeDef curType, MethodDef? curMethod, NameExpr expr)
Construct with NameExpr (base class of CallExpr and UnknownVarExpr)
- nameSource
-
Str name
- resolveSource
-
Expr resolve()
Resolve into a method call or field access
- resolveBaseSource
-
Void resolveBase()
Resolve the base type which defines the slot we are calling.
-
private Void resolveForeign()
If we have a FFI call, then give the foreign bridge a chance to resolve the method and deal with method overloading. Note at this point we've already resolved the call by name to some method (in the find step). But this callback gives the bridge a chance to resolve to the correct overloaded method. We need to this during ResolveExpr in order to infer local variables correctly.
-
private CallExpr resolveToCallExpr()
-
private Void resolveToExpr()
Compute the expression type the call itself (what gets left on the stack).
-
private FieldExpr resolveToFieldExpr()
- resultSource
-
Expr? result
-
private Void safeToNullable()
If the epxression is a safe call using "?.", then the resulting expression type is nullable.
- targetSource
-
Expr? target
- withBlockAddSource
-
Void withBlockAdd()
If we failed to resolve
with.expr
and the with target supports anadd
method, then attempt to resolve as a standaloneexpr
(no with base). If that works we assume this is syntax sugar forwith.add(expr)
- the CallExpr is created in ResolveExpr after the entire sub-expr has been processed.