 fnDefinition = (node) ->
   words = inside node
   [keyword, paramList, defs...] = words
-  params = if paramList? then inside paramList else []
+  params = if Array.isArray(paramList) then inside paramList else undefined
   defs ?= []
   for def, i in defs
     if matchNode '::', def

labelWhere = (wheres) ->
  for [name, def] in wheres
    labelNames name
    if matchNode 'fn', def
      labelRecursiveCall def, name.token
  return

labelParams = (ast, params) ->
  paramNames = (token for {token} in params)
  mapTokens paramNames, ast, (word) ->
    word.label = 'param' unless word.label

labelRecursiveCall = (ast, fnname) ->
  mapTokens [fnname], ast, (word) ->
    word.label = 'recurse'

typeDatas = (ast) ->
  macro 'data', ast, (node) ->

    {params, body, wheres} = fnDefinition node
    labelFnBody body
    labelWhere wheres
    labelParams node, params if params?
    node

labelFnBody = (node) ->
