{
    "<class>": {
        "code-generator": "./class-tag",
        "open-tag-only": true
    },
    "<else>": {
        "node-factory": "./else-tag",
        "attributes": {},
        "autocomplete": [
            {
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#ifelse-ifelse"
            }
        ]
    },
    "<else-if>": {
        "node-factory": "./else-if-tag",
        "attributes": {},
        "autocomplete": [
            {
                "snippet": "else-if(${1:condition})",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#ifelse-ifelse"
            },
            {
                "snippet": "else-if",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#ifelse-ifelse"
            }
        ]
    },
    "<for>": {
        "code-generator": "./for-tag",
        "attributes": {
            "of": "expression",
            "in": "expression",
            "to": "expression",
            "from": "expression",
            "step": "expression"
        },
        "autocomplete": [
            {
                "snippet": "for|${1:value}, ${2:index}| of=\"${3:array}\"",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#for"
            },
            {
                "snippet": "for|${1:name}, ${2:value}| in=\"${3:object}\"",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#property-looping"
            },
            {
                "snippet": "for|${1:index}| from=\"${2:number}\" to=\"${3:number}\" step=\"${4:number}\"",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#range-looping"
            }
        ]
    },
    "<if>": {
        "node-factory": "./if-tag",
        "attributes": {},
        "autocomplete": [
            {
                "snippet": "if(${1:condition})",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#ifelse-ifelse"
            },
            {
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#ifelse-ifelse"
            }
        ]
    },
    "<import>": {
        "code-generator": "./import-tag",
        "no-output": true,
        "parse-options": {
            "relaxRequireCommas": true
        }
    },
    "<include-html>": {
        "code-generator": "./include-html-tag",
        "autocomplete": [
            {
                "displayText": "include-html(<path>)",
                "snippet": "include-html(${1:\"./foo.html\"})",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#includes"
            },
            {
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#includes"
            }
        ]
    },
    "<include-text>": {
        "code-generator": "./include-text-tag",
        "autocomplete": [
            {
                "displayText": "include-text(<path>)",
                "snippet": "include-text(${1:\"./foo.txt\"})",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#includes"
            },
            {
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#includes"
            }
        ]
    },
    "<macro>": {
        "node-factory": "./macro-tag",
        "autocomplete": [
            {
                "displayText": "macro|<params>| name=\"<name>\"",
                "snippet": "macro|${2:param1, param2}| name=\"${1:name}\"",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#macros"
            },
            {
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#macros"
            }
        ],
        "no-output": true
    },
    "<marko>": {
        "deprecated": true,
        "code-generator": "./marko-tag",
        "open-tag-only": true,
        "@no-browser-rerender": "boolean"
    },
    "<marko-preserve-whitespace>": {
        "deprecated": true,
        "code-generator": "./marko-preserve-whitespace-tag",
        "preserve-whitespace": true,
        "autocomplete": [
            {
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#whitespace"
            }
        ]
    },
    "<module-code>": {
        "code-generator": "./module-code-tag",
        "preserve-whitespace": true,
        "autocomplete": []
    },
    "<static>": {
        "transformer": {
            "path": "./static-tag",
            "priority": -1
        },
        "no-output": true,
        "parse-options": {
            "ignoreAttributes": true
        }
    },
    "<while>": {
        "code-generator": "./while-tag",
        "autocomplete": [
            {
                "snippet": "while(${1:condition})",
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#looping"
            },
            {
                "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#looping"
            }
        ]
    },
    "<await>": {
        "transformer": "./await/transformer",
        "renderer": "./await/renderer",
        "@_provider": "expression",
        "@_name": "string",
        "@timeout": "integer",
        "@name": {
            "type": "string",
            "description": "Name of await",
            "autocomplete": [
                {
                    "snippet": "name=\"${1:name}\""
                },
                {}
            ]
        },
        "@client-reorder": {
            "type": "boolean",
            "description": "Use JavaScript on client to move async fragment into the proper place."
        },
        "@show-after": {
            "type": "string"
        },
        "autocomplete": [
            {
                "snippet": "await(${1:promise})",
                "descriptionMoreURL": "http://markojs.com/docs/marko/async-taglib/#<code>&ltawait><code>"
            }
        ]
    },
    "<await-reorderer>": {
        "renderer": "./await/reorderer-renderer",
        "autocomplete": [
            {
                "snippet": "await-reorderer",
                "descriptionMoreURL": "http://markojs.com/docs/marko/async-taglib/#<code>&ltawait-reorderer><code>"
            }
        ]
    },
    "<*>": {
        "@body-only-if": {
            "type": "statement",
            "autocomplete": [
                {
                    "snippet": "body-only-if(${1:condition})",
                    "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#body-only-if"
                },
                {
                    "descriptionMoreURL": "http://markojs.com/docs/marko/language-guide/#body-only-if"
                }
            ]
        },
        "transformer": {
            "path": "./core-transformer",
            "priority": 0
        }
    }
}
