import { parseExpressionAt } from 'acorn';

const literals = {
	true: true,
	false: false,
	null: null
};

export default function readExpression ( parser ) {
	const start = parser.index;

	const name = parser.readUntil( /\s*}}/ );
	if ( name && /^[a-z]+$/.test( name ) ) {
		const end = start + name.length;

		if ( name in literals ) {
			return {
				type: 'Literal',
				start,
				end,
				value: literals[ name ],
				raw: name
			};
		}

		return {
			type: 'Identifier',
			start,
			end: start + name.length,
			name
		};
	}

	parser.index = start;

	try {
		const node = parseExpressionAt( parser.template, parser.index );
		parser.index = node.end;

		return node;
	} catch ( err ) {
		parser.acornError( err );
	}
}

@@ -58,51 +58,78 @@
 s = 
-%7B%0A%09
+new Map(%5B%0A%09%5B '
 true
-:
+',
  true
+ %5D
 ,%0A%09
+%5B '
 false
-:
+',
  false
+ %5D
 ,%0A%09
+%5B '
 null
-:
+',
  null
-%0A%7D
+ %5D%0A%5D)
 ;%0A%0Ae
@@ -341,24 +341,16 @@
 f ( 
-name in 
 literals
  ) %7B
@@ -345,16 +345,28 @@
 literals
+.has( name )
  ) %7B%0A%09%09%09
@@ -438,16 +438,20 @@
 rals
-%5B
+.get(
  name 
-%5D
+)
 ,%0A%09%09

use a map to avoid false positives