mirror of
https://github.com/sveltejs/svelte.git
synced 2024-12-01 17:30:59 +01:00
then and catch block expect await, optional then block
This commit is contained in:
parent
dda9a53727
commit
a31fea139b
@ -163,54 +163,64 @@ export default function mustache(parser: Parser) {
|
||||
} else if (parser.eat(':then')) {
|
||||
// TODO DRY out this and the next section
|
||||
const pending_block = parser.current();
|
||||
if (pending_block.type === 'PendingBlock') {
|
||||
pending_block.end = start;
|
||||
parser.stack.pop();
|
||||
const await_block = parser.current();
|
||||
|
||||
if (!parser.eat('}')) {
|
||||
parser.require_whitespace();
|
||||
await_block.value = parser.read_identifier();
|
||||
parser.allow_whitespace();
|
||||
parser.eat('}', true);
|
||||
}
|
||||
|
||||
const then_block: TemplateNode = {
|
||||
start,
|
||||
end: null,
|
||||
type: 'ThenBlock',
|
||||
children: [],
|
||||
skip: false
|
||||
};
|
||||
|
||||
await_block.then = then_block;
|
||||
parser.stack.push(then_block);
|
||||
if (pending_block.type !== 'PendingBlock') {
|
||||
parser.error({
|
||||
code: `invalid-then-placement`,
|
||||
message: 'Cannot have an {:then} block outside an {#await ...} block'
|
||||
});
|
||||
}
|
||||
|
||||
pending_block.end = start;
|
||||
parser.stack.pop();
|
||||
const await_block = parser.current();
|
||||
|
||||
if (!parser.eat('}')) {
|
||||
parser.require_whitespace();
|
||||
await_block.value = parser.read_identifier();
|
||||
parser.allow_whitespace();
|
||||
parser.eat('}', true);
|
||||
}
|
||||
|
||||
const then_block: TemplateNode = {
|
||||
start,
|
||||
end: null,
|
||||
type: 'ThenBlock',
|
||||
children: [],
|
||||
skip: false
|
||||
};
|
||||
|
||||
await_block.then = then_block;
|
||||
parser.stack.push(then_block);
|
||||
} else if (parser.eat(':catch')) {
|
||||
const then_block = parser.current();
|
||||
if (then_block.type === 'ThenBlock') {
|
||||
then_block.end = start;
|
||||
parser.stack.pop();
|
||||
const await_block = parser.current();
|
||||
|
||||
if (!parser.eat('}')) {
|
||||
parser.require_whitespace();
|
||||
await_block.error = parser.read_identifier();
|
||||
parser.allow_whitespace();
|
||||
parser.eat('}', true);
|
||||
}
|
||||
|
||||
const catch_block: TemplateNode = {
|
||||
start,
|
||||
end: null,
|
||||
type: 'CatchBlock',
|
||||
children: [],
|
||||
skip: false
|
||||
};
|
||||
|
||||
await_block.catch = catch_block;
|
||||
parser.stack.push(catch_block);
|
||||
const block = parser.current();
|
||||
if (block.type !== 'ThenBlock' && block.type !== 'PendingBlock') {
|
||||
parser.error({
|
||||
code: `invalid-catch-placement`,
|
||||
message: 'Cannot have an {:catch} block outside an {#await ...} block'
|
||||
});
|
||||
}
|
||||
|
||||
block.end = start;
|
||||
parser.stack.pop();
|
||||
const await_block = parser.current();
|
||||
|
||||
if (!parser.eat('}')) {
|
||||
parser.require_whitespace();
|
||||
await_block.error = parser.read_identifier();
|
||||
parser.allow_whitespace();
|
||||
parser.eat('}', true);
|
||||
}
|
||||
|
||||
const catch_block: TemplateNode = {
|
||||
start,
|
||||
end: null,
|
||||
type: 'CatchBlock',
|
||||
children: [],
|
||||
skip: false
|
||||
};
|
||||
|
||||
await_block.catch = catch_block;
|
||||
parser.stack.push(catch_block);
|
||||
} else if (parser.eat('#')) {
|
||||
// {#if foo}, {#each foo} or {#await foo}
|
||||
let type;
|
||||
|
5
test/parser/samples/await-catch/input.svelte
Normal file
5
test/parser/samples/await-catch/input.svelte
Normal file
@ -0,0 +1,5 @@
|
||||
{#await thePromise}
|
||||
<p>loading...</p>
|
||||
{:catch theError}
|
||||
<p>oh no! {theError.message}</p>
|
||||
{/await}
|
168
test/parser/samples/await-catch/output.json
Normal file
168
test/parser/samples/await-catch/output.json
Normal file
@ -0,0 +1,168 @@
|
||||
{
|
||||
"html": {
|
||||
"start": 0,
|
||||
"end": 99,
|
||||
"type": "Fragment",
|
||||
"children": [
|
||||
{
|
||||
"start": 0,
|
||||
"end": 99,
|
||||
"type": "AwaitBlock",
|
||||
"expression": {
|
||||
"type": "Identifier",
|
||||
"start": 8,
|
||||
"end": 18,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 8
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 18
|
||||
}
|
||||
},
|
||||
"name": "thePromise"
|
||||
},
|
||||
"value": null,
|
||||
"error": "theError",
|
||||
"pending": {
|
||||
"start": 19,
|
||||
"end": 39,
|
||||
"type": "PendingBlock",
|
||||
"children": [
|
||||
{
|
||||
"start": 19,
|
||||
"end": 21,
|
||||
"type": "Text",
|
||||
"raw": "\n\t",
|
||||
"data": "\n\t"
|
||||
},
|
||||
{
|
||||
"start": 21,
|
||||
"end": 38,
|
||||
"type": "Element",
|
||||
"name": "p",
|
||||
"attributes": [],
|
||||
"children": [
|
||||
{
|
||||
"start": 24,
|
||||
"end": 34,
|
||||
"type": "Text",
|
||||
"raw": "loading...",
|
||||
"data": "loading..."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start": 38,
|
||||
"end": 39,
|
||||
"type": "Text",
|
||||
"raw": "\n",
|
||||
"data": "\n"
|
||||
}
|
||||
],
|
||||
"skip": false
|
||||
},
|
||||
"then": {
|
||||
"start": null,
|
||||
"end": null,
|
||||
"type": "ThenBlock",
|
||||
"children": [],
|
||||
"skip": true
|
||||
},
|
||||
"catch": {
|
||||
"start": 39,
|
||||
"end": 91,
|
||||
"type": "CatchBlock",
|
||||
"children": [
|
||||
{
|
||||
"start": 56,
|
||||
"end": 58,
|
||||
"type": "Text",
|
||||
"raw": "\n\t",
|
||||
"data": "\n\t"
|
||||
},
|
||||
{
|
||||
"start": 58,
|
||||
"end": 90,
|
||||
"type": "Element",
|
||||
"name": "p",
|
||||
"attributes": [],
|
||||
"children": [
|
||||
{
|
||||
"start": 61,
|
||||
"end": 68,
|
||||
"type": "Text",
|
||||
"raw": "oh no! ",
|
||||
"data": "oh no! "
|
||||
},
|
||||
{
|
||||
"start": 68,
|
||||
"end": 86,
|
||||
"type": "MustacheTag",
|
||||
"expression": {
|
||||
"type": "MemberExpression",
|
||||
"start": 69,
|
||||
"end": 85,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 4,
|
||||
"column": 12
|
||||
},
|
||||
"end": {
|
||||
"line": 4,
|
||||
"column": 28
|
||||
}
|
||||
},
|
||||
"object": {
|
||||
"type": "Identifier",
|
||||
"start": 69,
|
||||
"end": 77,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 4,
|
||||
"column": 12
|
||||
},
|
||||
"end": {
|
||||
"line": 4,
|
||||
"column": 20
|
||||
}
|
||||
},
|
||||
"name": "theError"
|
||||
},
|
||||
"property": {
|
||||
"type": "Identifier",
|
||||
"start": 78,
|
||||
"end": 85,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 4,
|
||||
"column": 21
|
||||
},
|
||||
"end": {
|
||||
"line": 4,
|
||||
"column": 28
|
||||
}
|
||||
},
|
||||
"name": "message"
|
||||
},
|
||||
"computed": false
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"start": 90,
|
||||
"end": 91,
|
||||
"type": "Text",
|
||||
"raw": "\n",
|
||||
"data": "\n"
|
||||
}
|
||||
],
|
||||
"skip": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
10
test/parser/samples/error-catch-without-await/error.json
Normal file
10
test/parser/samples/error-catch-without-await/error.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"code": "invalid-catch-placement",
|
||||
"message": "Cannot have an {:catch} block outside an {#await ...} block",
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 7,
|
||||
"character": 7
|
||||
},
|
||||
"pos": 7
|
||||
}
|
@ -0,0 +1 @@
|
||||
{:catch theValue}
|
10
test/parser/samples/error-then-without-await/error.json
Normal file
10
test/parser/samples/error-then-without-await/error.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"code": "invalid-then-placement",
|
||||
"message": "Cannot have an {:then} block outside an {#await ...} block",
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 6,
|
||||
"character": 6
|
||||
},
|
||||
"pos": 6
|
||||
}
|
@ -0,0 +1 @@
|
||||
{:then theValue}
|
Loading…
Reference in New Issue
Block a user