any 3:2 multi-map group: any pairing of the 3 with the 2 is valid, one is shown
all 3:1 all-to-all group: each of the 3 corresponds to the 1
inserted
deleted
updated
moved
click a highlight to reveal its counterpart
Code view:
A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.
Before
1//@target: ES5
2interface SymbolConstructor {
3 foo: string;
4}
5var Symbol: SymbolConstructor;
6
7var obj = {
…lines 8–11 unchanged (4 lines)
After
1//@target: ES5, ES2015
2interface SymbolConstructor {
3 foo: string;
4}
5var Symbol: SymbolConstructor;
6
7var obj = {
…lines 8–11 unchanged (4 lines)
Before
1//@target: ES5
2interface SymbolConstructor {
3 foo: string;
4}
5var Symbol: SymbolConstructor;
6
7var obj = {
…lines 8–11 unchanged (4 lines)
After
1//@target: ES5, ES2015
2interface SymbolConstructor {
3 foo: string;
4}
5var Symbol: SymbolConstructor;
6
7var obj = {
…lines 8–11 unchanged (4 lines)
Before
program
comment "//@target: ES5"
interface_declaration
interface "interface"
type_identifier "SymbolConstructor"
interface_body
{ "{"
property_signature
property_identifier "foo"
type_annotation
: ":"
predefined_type
string "string"
; ";"
} "}"
variable_declaration
var "var"
variable_declarator
identifier "Symbol"
type_annotation
: ":"
type_identifier "SymbolConstructor"
; ";"
variable_declaration
var "var"
variable_declarator
identifier "obj"
= "="
object
{ "{"
paircomputed_property_name
[ "["
member_expression
identifier "Symbol"
. "."
property_identifier "foo"
] "]"
: ":"
number "0"
} "}"
expression_statementsubscript_expression
identifier "obj"
[ "["
member_expression
identifier "Symbol"
. "."
property_identifier "foo"
] "]"
; ";"
After
program
comment "//@target: ES5, ES2015"
interface_declaration
interface "interface"
type_identifier "SymbolConstructor"
interface_body
{ "{"
property_signature
property_identifier "foo"
type_annotation
: ":"
predefined_type
string "string"
; ";"
} "}"
variable_declaration
var "var"
variable_declarator
identifier "Symbol"
type_annotation
: ":"
type_identifier "SymbolConstructor"
; ";"
variable_declaration
var "var"
variable_declarator
identifier "obj"
= "="
object
{ "{"
paircomputed_property_name
[ "["
member_expression
identifier "Symbol"
. "."
property_identifier "foo"
] "]"
: ":"
number "0"
} "}"
expression_statementsubscript_expression
identifier "obj"
[ "["
member_expression
identifier "Symbol"
. "."
property_identifier "foo"
] "]"
; ";"
Keybindings
j / k
next / previous visible node (tree panels)
h / l
collapse / expand the focused node
g / G
jump to first / last visible node
Tab
switch focus between Before/After panels
/
search: jump to next node whose text contains a given string
a
jump the other panel to this node's mapped counterpart
i
hide identical matches, showing only inserted/deleted/updated nodes and their ancestors
v
cycle the view: split / code only / tree only
p
cycle what the code view renders: the node mapping, then each human painting
r
mark this fixture as reviewed, or forget the mark (kept in this browser only)