# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Elementary building blocks:

# Empty
" "

# Tokens
"("
")"
"["
"]"
"{"
"}"
":"
";"
"."
"..."
"?"
"++"
"--"
"=>"
"!"
"="
"|="
"^="
"&="
"<<="
">>="
">>>="
"+="
"-="
"*="
"/="
"%="
"**="
","
"||"
"&&"
"|"
"^"
"&"
"<<"
">>"
">>>"
"+"
"-"
"*"
"/"
"%"
"**"
"=="
"!="
"==="
"!=="
"<"
">"
"<="
">="
"!"
"~"

# Keywords, contextual keywords, literals, reserved words.
"__proto__"
"anonymous"
"arguments"
"as"
"async"
"await"
"break"
"case"
"catch"
"class"
"const"
"constructor"
"continue"
"debugger"
"default"
"delete"
"do"
"else"
"enum"
"eval"
"export"
"extends"
"false"
"finally"
"for"
"from"
"function"
"get"
"if"
"import"
"in"
"instanceof"
"let"
"name"
"new"
"null"
"of"
"prototype"
"return"
"sent"
"set"
"static"
"super"
"switch"
"target"
"this"
"throw"
"true"
"try"
"typeof"
"undefined"
"var"
"void"
"while"
"with"

# TODO(marja): Add names of known classes.

# Separators
"\n"
"; "
$0 "\n"
$0 "; "

$0 "," $1
"(" $0 ")"

# Identifiers
"foo"
"bar"
"a"
"b"
"c"

# Other literals
"0"
"0.0"

# TODO(marja): Add strings and numbers! And quotes.

# Other meaningful words from the spec
"new.target"

# More complicated building blocks

# Block, object, or binding pattern
"{" $0 "}"
"{" $0 ": " $1 "}"

# Array or array binding pattern
"[" $0 "]"

# Rest element or rest parameter
"..."
"..." $0

# Variable declarations
"let" $0 "=" $1 ";"
"const " $0 "=" $1 ";"
"var" $0 "=" $1 ";"

# Return statements
"return" $0
"return" $0 ";"

# If statements
"if (" $0 ")" $1
"if (" $0 ") {" $1 "}"
"if (" $0 ") {" $1 "} else {" $2 "}"
"if (" $0 ")" $1 "else" $2

# Iteration statements
"do" $0 "while (" $1 ");"
"for (" $0 ")" $1
"for (" $0 ") {" $1 " }"
"for (" $0 "in" $1 ")" $2
"for (" $0 "in" $1 ") {" $2 "}"
"for (" $0 "of" $1 ")" $2
"for (" $0 "of" $1 ") {" $2 "}"
"for (" $0 ";" $1 ";" $2 ")" $3
"for (" $0 ";" $1 ";" $2 ") {" $3 "}"
"for await (" $0 ")" $1
"for await (" $0 ") {" $1 " }"
"for await (" $0 "in" $1 ")" $2
"for await (" $0 "in" $1 ") {" $2 "}"
"for await (" $0 "of" $1 ")" $2
"for await (" $0 "of" $1 ") {" $2 "}"
"for await (" $0 ";" $1 ";" $2 ")" $3
"for await (" $0 ";" $1 ";" $2 ") {" $3 "}"
"while (" $0 ")" $1
"while (" $0 ") {" $1 "}"
"continue"
"continue;"
"continue" $0
"break"
"break;"
"break" $0

# With statements
"with (" $0 ")" $1
"with (" $0 ") {" $1 "}"

# Switch statements
"switch (" $0 ")" $1
"switch (" $0 ") {" $1 "}"
"case" $0 ": " $1
"case" $0 ": {" $1 "}"
"default :" $0

# Try-catch statements
"try" $0 "catch (" $1 ")" $2
"try {" $0 "} catch (" $1 ") {" $2 "}"
"try" $0 "finally (" $1 ")" $2
"try {" $0 "} finally (" $1 ") {" $2 "}"
"try" $0 "catch (" $1 ")" $2 "finally" $3
"try {" $0 "} catch (" $1 ") {" $2 "} finally {" $3 "}"

# Functions and arrow functions
"function" $0 "(" $1 ") {" $2 "}"
"function" "(" $0 ") {" $1 "}"
$0 "=>" $1
$0 "=> {" $1 "}"
"(" $0 ") => {" $1 "}"
"(" $0 ") =>" $1

# Strict functions and arrow functions
"function" $0 "(" $1 ") { 'use strict';" $2 "}"
"function" "(" $0 ") { 'use strict';" $1 "}"
$0 "=> { 'use strict';" $1 "}"
"(" $0 ") => { 'use strict'; " $1 "}"

# Methods
$0 "(" $1 ") {" $1 "}"
"get" $0 "(" $1 ") {" $1 "}"
"set" $0 "(" $1 ") {" $1 "}"
"static" $0 "(" $1 ") {" $1 "}"
"static get" $0 "(" $1 ") {" $1 "}"
"static set" $0 "(" $1 ") {" $1 "}"

# Generators
"*" $0 "(" $1 ") {" $2 "}"
"function *" $0 "(" $1 ") {" $2 "}"
"function * (" $1 ") {" $2 "}"
"yield" $0
"yield *" $0

# Strict generators
"function *" $0 "(" $1 ") {'use strict'; " $2 "}"
"function * (" $1 ") { 'use strict'; " $2 "}"

# Classes
"class" $0 "{" $1 "}"
"class" $0 "extends" $1 "{" $2 "}"

# Async functions, async methods, async arrow functions
"async function" $0 "(" $1 ") {" $2 "}"
"async function" "(" $0 ") {" $1 "}"
"async" $0 "(" $1 ") {" $2 "}"
"async" $0 "=>" $1
"async" $0 "=> {" $1 "}"
"async(" $0 ") => {" $1 "}"
"async(" $0 ") =>" $1
"await" $0

# Strict async functions.
"async function" $0 "(" $1 ") { 'use strict'; " $2 "}"
"async function" "(" $0 ") { 'use strict'; " $1 "}"
"async" $0 "(" $1 ") { 'use strict'; " $2 "}"
"async" $0 "=> { 'use strict'; " $1 "}"
"async(" $0 ") => { 'use strict';" $1 "}"

# Call expressions
$0 "[" $1 "]"
$0 "(" $1 ")"

# Template literals
"`foo`"
$0 "`foo`"
# TODO(marja): add more

# Strict directive
"'use strict';"

# Regexps
"/foo/"
# TODO(marja): add more

# Conditional expression
$0 "?" $1 ":" $2
$0 "?" $1 ":" $2 ";"

# Assignment expressions
$0 "=" $1
$0 "=" $1 ";"

# Import / export (for modules)
"import" $0 ";"
"export" $0 ";"

# Misc.
"eval('');"

