Tern
http://ternjs.net

Language challenges

Soundness?

eval(prompt("What next?"))
SpiderMonkey's inference algorithm
“Fast and Precise Hybrid
Type Inference
for JavaScript”
http://rfrn.org/~shu/drafts/ti.pdf
build
graph
capturing the
flow
of types
var x = "foo" // x :: string

var y = x     // y :: string
var x = "foo" // x :: string | bool
if (something()) x = false
var y = x     // y :: string | bool
var x = "foo"

var y = x
var x = "foo"
if (bar()) x = false
var y = x
var r = f("foo", "bar")
function f(x, y) { return x + y }
var r = f("foo", "bar")

var r = f("foo", "bar")
function f(x, y) { return x + y }
var r = f("foo", "bar")
function f(x, y) { return x + y }
var r = f("foo", "bar")
function f(x, y) { return x + y }
var r = f("foo", "bar")
function f(x, y) { return x + y }
var r = f("foo", "bar")
function f(x, y) { return x + y }
var r = f("foo", "bar")
function f(x, y) { return x + y }
var r = f("foo", "bar")
function f(x, y) { return x + y }
var o = {x: 10, y: 0}

var o = {x: 10, y: 0}
var h = o.y
var o = {x: 10, y: 0}
var h = o.y

Parametric Polymorphism

function lastOf(array) {
  return array[array.length - 1]
}

var num = lastOf([1, 2, 3])
var str = lastOf(["a", "b", "c"])

Run-time type manipulation

function extend(target, source) {
  for (var prop in source)
    target[prop] = source[prop]
  return target
}
Guessing
 
For Emacs, Vim, & ST
   install editor plug-in
   add .tern-project file
   go
Related Work
.Fin.
ternjs.net
github.com/marijnh/tern

marijnhaverbeke.nl
twitter.com/marijnjh