abstract class Inferencer extends Analyzer.InferencerContextErrors with Analyzer.InferCheckable
- Alphabetic
- By Inheritance
- Inferencer
- InferCheckable
- InferencerContextErrors
- AnyRef
- Any
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- Protected
Instance Constructors
- new Inferencer()
Abstract Value Members
- abstract def context: Analyzer.Context
Concrete Value Members
- object InferErrorGen
- Definition Classes
- InferencerContextErrors
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##(): Int
- Definition Classes
- AnyRef → Any
- def +(other: String): String
- Implicit
- This member is added by an implicit conversion from Analyzer.Inferencer toany2stringadd[Analyzer.Inferencer] performed by method any2stringadd in scala.Predef.
- Definition Classes
- any2stringadd
- def ->[B](y: B): (Analyzer.Inferencer, B)
- Implicit
- This member is added by an implicit conversion from Analyzer.Inferencer toArrowAssoc[Analyzer.Inferencer] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @inline()
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def adjustTypeArgs(tparams: List[Global.Symbol], tvars: List[Global.TypeVar], targs: List[Global.Type], restpe: Global.Type = WildcardType): Analyzer.AdjustedTypeArgs
Retract arguments that were inferred to Nothing because inference failed.
Retract arguments that were inferred to Nothing because inference failed. Correct types for repeated params.
We detect Nothing-due-to-failure by only retracting a parameter if either:
- it occurs in an invariant/contravariant position in
restpe
restpe == WildcardType
Retracted parameters are mapped to None. TODO:
- make sure the performance hit of storing these in a map is acceptable (it's going to be a small map in 90% of the cases, I think)
- refactor further up the callstack so that we don't have to do this post-factum adjustment?
Rewrite for repeated param types: Map T* entries to Seq[T].
- returns
map from tparams to inferred arg, if inference was successful, tparams that map to None are considered left undetermined type parameters that are inferred as
scala.Nothing
and that are not covariant inrestpe
are taken to be undetermined
- it occurs in an invariant/contravariant position in
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def checkAccessible(tree: Global.Tree, sym: Global.Symbol, pre: Global.Type, site: Global.Tree, isJava: Boolean): Global.Tree
Check that
sym
is defined and accessible as a member of treesite
with typepre
in current context.Check that
sym
is defined and accessible as a member of treesite
with typepre
in current context.- Note
PP: In case it's not abundantly obvious to anyone who might read this, the method does a lot more than "check" these things, as does nearly every method in the compiler, so don't act all shocked. This particular example "checks" its way to assigning both the symbol and type of the incoming tree, in addition to forcing lots of symbol infos on its way to transforming java raw types (but only of terms - why?) Note: pre is not refchecked -- moreover, refchecking the resulting tree may not refcheck pre, since pre may not occur in its type (callers should wrap the result in a TypeTreeWithDeferredRefCheck)
- def checkBounds(tree: Global.Tree, pre: Global.Type, owner: Global.Symbol, tparams: List[Global.Symbol], targs: List[Global.Type], prefix: String): Boolean
error if arguments not within bounds.
- def checkCheckable(tree: Global.Tree, P0: Global.Type, X0: Global.Type, inPattern: Boolean, canRemedy: Boolean = false): Unit
TODO: much better error positions.
TODO: much better error positions. Kind of stuck right now because they just pass us the one tree. TODO: Eliminate inPattern, canRemedy, which have no place here.
Instead of the canRemedy flag, annotate uncheckable types that have become checkable because of the availability of a class tag?
- Definition Classes
- InferCheckable
- def checkKindBounds(tparams: List[Global.Symbol], targs: List[Global.Type], pre: Global.Type, owner: Global.Symbol): List[String]
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- def eligibleForTupleConversion(formals: List[Global.Type], argsCount: Int): Boolean
- def eligibleForTupleConversion(paramsCount: Int, argsCount: Int, varargsTarget: Boolean): Boolean
True if the given parameter list can accept a tupled argument list, and the argument list can be tupled (based on its length.)
- def enhanceBounds(okparams: List[Global.Symbol], okargs: List[Global.Type], undets: List[Global.Symbol]): Unit
- def ensureFullyDefined(tp: Global.Type): Global.Type
- def ensuring(cond: (Analyzer.Inferencer) => Boolean, msg: => Any): Analyzer.Inferencer
- Implicit
- This member is added by an implicit conversion from Analyzer.Inferencer toEnsuring[Analyzer.Inferencer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- def ensuring(cond: (Analyzer.Inferencer) => Boolean): Analyzer.Inferencer
- Implicit
- This member is added by an implicit conversion from Analyzer.Inferencer toEnsuring[Analyzer.Inferencer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- def ensuring(cond: Boolean, msg: => Any): Analyzer.Inferencer
- Implicit
- This member is added by an implicit conversion from Analyzer.Inferencer toEnsuring[Analyzer.Inferencer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- def ensuring(cond: Boolean): Analyzer.Inferencer
- Implicit
- This member is added by an implicit conversion from Analyzer.Inferencer toEnsuring[Analyzer.Inferencer] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def explainTypes(tp1: Global.Type, tp2: Global.Type): Unit
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- def formatted(fmtstr: String): String
- Implicit
- This member is added by an implicit conversion from Analyzer.Inferencer toStringFormat[Analyzer.Inferencer] performed by method StringFormat in scala.Predef.
- Definition Classes
- StringFormat
- Annotations
- @inline()
- def freeTypeParamsOfTerms(tp: Global.Type): List[Global.Symbol]
Collects type parameters referred to in a type.
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def getContext: Analyzer.Context
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def inferArgumentInstance(tree: Global.Tree, undetparams: List[Global.Symbol], strictPt: Global.Type, lenientPt: Global.Type): Unit
Substitute free type variables
undetparams
of polymorphic argument expressiontree
, given two prototypesstrictPt
, andlenientPt
.Substitute free type variables
undetparams
of polymorphic argument expressiontree
, given two prototypesstrictPt
, andlenientPt
.strictPt
is the first attempt prototype where type parameters are left unchanged.lenientPt
is the fall-back prototype where type parameters are replaced byWildcardType
s. We try to instantiate first tostrictPt
and then, if this fails, tolenientPt
. If both attempts fail, an error is produced. - def inferConstructorInstance(tree: Global.Tree, undetparams: List[Global.Symbol], pt0: Global.Type): Unit
Substitute free type variables
undetparams
of type constructortree
in pattern, given prototypept
.Substitute free type variables
undetparams
of type constructortree
in pattern, given prototypept
.- tree
the constructor that needs to be instantiated
- undetparams
the undetermined type parameters
- pt0
the expected result type of the instance
- def inferExprAlternative(tree: Global.Tree, pt: Global.Type): Global.Tree
Assign
tree
the symbol and type of the alternative which matches prototypept
, if it exists.Assign
tree
the symbol and type of the alternative which matches prototypept
, if it exists. If several alternatives matchpt
, take parameterless one. If no alternative matchespt
, take the parameterless one anyway. - def inferExprInstance(tree: Global.Tree, tparams: List[Global.Symbol], pt: Global.Type = WildcardType, treeTp0: Global.Type = null, keepNothings: Boolean = true, useWeaklyCompatible: Boolean = false): List[Global.Symbol]
Infer type arguments
targs
fortparams
of polymorphic expression intree
, given prototypept
.Infer type arguments
targs
fortparams
of polymorphic expression intree
, given prototypept
.Substitute
tparams
totargs
intree
, after adjustment byadjustTypeArgs
, returning the type parameters that were not determined If passed, infers against specified typetreeTp
instead oftree.tp
. - def inferMethodAlternative(tree: Global.Tree, undetparams: List[Global.Symbol], argtpes0: List[Global.Type], pt0: Global.Type): Unit
Assign
tree
the type of an alternative which is applicable toargtpes
, and whose result type is compatible withpt
.Assign
tree
the type of an alternative which is applicable toargtpes
, and whose result type is compatible withpt
. If several applicable alternatives exist, drop the alternatives which use default arguments, then select the most specialized one. If no applicable alternative exists, and pt != WildcardType, try again with pt = WildcardType. Otherwise, if there is no best alternative, error.- argtpes0
contains the argument types. If an argument is named, as "a = 3", the corresponding type is
NamedType("a", Int)
. If the name of some NamedType does not exist in an alternative's parameter names, the type is replaces byUnit
, i.e. the argument is treated as an assignment expression.
- Note
Pre-condition
tree.tpe
is anOverloadedType
.
- def inferMethodInstance(fn: Global.Tree, undetParams: List[Global.Symbol], args: List[Global.Tree], pt0: Global.Type): List[Global.Symbol]
Substitute free type variables
undetparams
of applicationfn(args)
, given prototypept
.Substitute free type variables
undetparams
of applicationfn(args)
, given prototypept
.- fn
fn: the function that needs to be instantiated.
- undetParams
the parameters that need to be determined
- args
the actual arguments supplied in the call.
- pt0
the expected type of the function application
- returns
The type parameters that remain uninstantiated, and that thus have not been substituted.
- def inferModulePattern(pat: Global.Tree, pt: Global.Type): Unit
- def inferPolyAlternatives(tree: Global.Tree, argtypes: List[Global.Type]): Unit
Assign
tree
the type of all polymorphic alternatives which have the same number of type parameters as doesargtypes
with all argtypes are within the corresponding type parameter bounds.Assign
tree
the type of all polymorphic alternatives which have the same number of type parameters as doesargtypes
with all argtypes are within the corresponding type parameter bounds. If no such polymorphic alternative exist, error. - def inferTypedPattern(tree0: Global.Tree, pattp: Global.Type, pt0: Global.Type, canRemedy: Boolean): Global.Type
- def instantiateTypeVar(tvar: Global.TypeVar): Unit
- def intersect(tp1: Global.Type, tp2: Global.Type): Global.Type
Type intersection of simple type tp1 with general type tp2.
Type intersection of simple type tp1 with general type tp2. The result eliminates some redundancies.
- def isAsSpecific(ftpe1: Global.Type, ftpe2: Global.Type): Boolean
Is type
ftpe1
strictly more specific than typeftpe2
when both are alternatives in an overloaded function?Is type
ftpe1
strictly more specific than typeftpe2
when both are alternatives in an overloaded function?- See also
SLS (sec:overloading-resolution)
- def isCheckable(P0: Global.Type): Boolean
- Definition Classes
- InferCheckable
- def isCoercible(tp: Global.Type, pt: Global.Type): Boolean
- def isCompatibleArgs(tps: List[Global.Type], pts: List[Global.Type]): Boolean
- def isConservativelyCompatible(tp: Global.Type, pt: Global.Type): Boolean
- def isInProperSubClassOrObject(sym1: Global.Symbol, sym2: Global.Symbol): Boolean
is symbol
sym1
defined in a proper subclass of symbolsym2
? - final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def isInstantiatable(tvars: List[Global.TypeVar]): Boolean
- def isProperSubClassOrObject(sym1: Global.Symbol, sym2: Global.Symbol): Boolean
Is sym1 (or its companion class in case it is a module) a subclass of sym2 (or its companion class in case it is a module)?
- def isStrictlyMoreSpecific(ftpe1: Global.Type, ftpe2: Global.Type, sym1: Global.Symbol, sym2: Global.Symbol): Boolean
- def isUncheckable(P0: Global.Type): Boolean
- Definition Classes
- InferCheckable
- def isWeaklyCompatible(tp: Global.Type, pt: Global.Type): Boolean
- def makeFullyDefined(tp: Global.Type): Global.Type
Replace any (possibly bounded) wildcard types in type
tp
by existentially bound variables. - def methTypeArgs(fn: Global.Tree, tparams: List[Global.Symbol], formals: List[Global.Type], restpe: Global.Type, argtpes: List[Global.Type], pt: Global.Type): Analyzer.AdjustedTypeArgs
Return inferred type arguments, given type parameters, formal parameters, argument types, result type and expected result type.
Return inferred type arguments, given type parameters, formal parameters, argument types, result type and expected result type. If this is not possible, throw a
NoInstance
exception. Undetermined type arguments are represented bydefinitions.NothingTpe
. No check that inferred parameters conform to their bounds is made here.- fn
the function for reporting, may be empty
- tparams
the type parameters of the method
- formals
the value parameter types of the method
- restpe
the result type of the method
- argtpes
the argument types of the application
- pt
the expected return type of the application
- returns
@see adjustTypeArgs
- Exceptions thrown
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- def protoTypeArgs(tparams: List[Global.Symbol], formals: List[Global.Type], restpe: Global.Type, pt: Global.Type): List[Global.Type]
Return inferred proto-type arguments of function, given its type and value parameters and result type, and a prototype
pt
for the function result.Return inferred proto-type arguments of function, given its type and value parameters and result type, and a prototype
pt
for the function result. Type arguments need to be either determined precisely by the prototype, or they are maximized, if they occur only covariantly in the value parameter list. If instantiation of a type parameter fails, take WildcardType for the proto-type argument. - def setError[T <: Global.Tree](tree: T): T
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- def tupleIfNecessary(formals: List[Global.Type], argtpes: List[Global.Type]): List[Global.Type]
If the argument list needs to be tupled for the parameter list, a list containing the type of the tuple.
If the argument list needs to be tupled for the parameter list, a list containing the type of the tuple. Otherwise, the original argument list.
NOTE: we have to exclude repeated parameter types for overloading resolution like this: def f[T](x: T): T = x def f[T](x: T, xs: T*): T = x
In the process of deciding which ones is more specific, isApplicableToMethod would otherwise try T' = (T, T*)
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
Deprecated Value Members
- def →[B](y: B): (Analyzer.Inferencer, B)
- Implicit
- This member is added by an implicit conversion from Analyzer.Inferencer toArrowAssoc[Analyzer.Inferencer] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @deprecated
- Deprecated
(Since version 2.13.0) Use
->
instead. If you still wish to display it as one character, consider using a font with programming ligatures such as Fira Code.
The Scala compiler and reflection APIs.