   {ir: irCallTranslate, type, op, args}
 
 irCallTranslate = (ctx, {type, op, args}) ->
-  finalType = substitute ctx.substitution, type
+  finalType = addConstraintsFrom ctx, op, (substitute ctx.substitution, type)
   # log op, (printType type), printType finalType
   classParams =
     if op.ir is irReferenceTranslate and ctx.isMethod op.name, op.type

      ctx.addToDeferred
        name: name
        type: currentType
        deps: (map (({name}) -> name), deps)
      for dep in deps
        ctx.addToDeferred {name: dep.name, type: dep.type, reversed: name}
      ctx.assignType name, (new TempType type)
    else
      # Ready for typing since there are no missing dependencies
      inferType ctx, name, type, matched.tea.constraints, polymorphic

  precs: precs ? []
  assigns: assigns ? []

deferredToGraph = (deferred) ->
  nodes = newMap()
  findOrAdd = (name) ->
    lookupOrAdd nodes, name, {name: name, edges: []}
  for {name, deps} in deferred
    node = findOrAdd name
    for dep in deps
      node.edges.push findOrAdd dep.name
  (mapToArray nodes)

toNameSets = (vertexGroups) ->
