   # console.log (printType canonicalType)
   # console.log (JSON.stringify inferredType)
   # console.log (JSON.stringify type.type)
-  #ctx.extendSubstitution
+  #ctx.extendSubstitution substitutionFail message:
   # Shouldn't fail
   matchType inferredType.type, type.type#(substitute ctx.substitution, type).type
   # console.log "after", (printType inferredType.type)

  if _notEmpty invalidArgLabels
    return jsNoop()

  if nonLabeledArgs.length > positionalParams.length
    malformed ctx, call, "Too many arguments to #{operator.symbol}"
  extraParamNames = positionalParams[nonLabeledArgs.length..]
  extraParams = map token_, ("_#{n}" for n in extraParamNames)
  argsInOrder = sortCallArguments paramNames, labeledArgs, nonLabeledArgs, extraParams

  finalType = type#substitute ctx.substitution, type
  # allConstraints = (addConstraintsFrom ctx,
  #   {type, name: reference?.name, scopeIndex: reference?.scopeIndex}, finalType).constraints
  reducedConstraints =
    if reference
      constraintsFromReference ctx, {type, name: reference.name, scopeIndex: reference.scopeIndex}
