diff --git a/qt/org.eclipse.cdt.qt.core/acorn-qml/index.js b/qt/org.eclipse.cdt.qt.core/acorn-qml/index.js index 32c4d1dfd90..ce774dcf2b9 100644 --- a/qt/org.eclipse.cdt.qt.core/acorn-qml/index.js +++ b/qt/org.eclipse.cdt.qt.core/acorn-qml/index.js @@ -13,12 +13,12 @@ // This will only be visible globally if we are in a browser environment var acornQML; -(function(mod) { +(function (mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS return module.exports = mod(require("./inject.js"), require("acorn")); if (typeof define == "function" && define.amd) // AMD return define(["./inject.js", "acorn/dist/acorn"], mod); acornQML = mod(injectQML, acorn); // Plain browser env -})(function(injectQML, acorn) { - return injectQML(acorn); +})(function (injectQML, acorn) { + return injectQML(acorn); }) \ No newline at end of file diff --git a/qt/org.eclipse.cdt.qt.core/acorn-qml/inject.js b/qt/org.eclipse.cdt.qt.core/acorn-qml/inject.js index c176fd9af7b..03592ab5e4f 100644 --- a/qt/org.eclipse.cdt.qt.core/acorn-qml/inject.js +++ b/qt/org.eclipse.cdt.qt.core/acorn-qml/inject.js @@ -13,517 +13,561 @@ // This will only be visible globally if we are in a browser environment var injectQML; -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS +(function (mod) { + if (typeof exports === "object" && typeof module === "object") // CommonJS return module.exports = mod(); - if (typeof define == "function" && define.amd) // AMD + if (typeof define === "function" && define.amd) // AMD return define([], mod); injectQML = mod(); // Plain browser env -})(function() { - return function(acorn) { - // Acorn token types - var tt = acorn.tokTypes; +})(function () { + return function (acorn) { + // Acorn token types + var tt = acorn.tokTypes; - // QML token types - var qtt = {}; - var keywords = {}; + // QML token types + var qtt = {}; + var keywords = {}; - /* - * Shorthand for defining keywords in the 'keywords' variable with the following - * format: - * keywords[name].isPrimitive : if this is a primitive type - * keywords[name].isQMLContextual : if this is a contextual keyword for QML - * - * Also stores the token's name in qtt._ for easy referencing later. None - * of these keywords will be tokenized and, as such, are allowed to be used in - * JavaScript expressions by acorn. The 'isQMLContextual' boolean in keywords refers - * to those contextual keywords that are also contextual in QML's parser rules such - * as 'color', 'list', 'alias', etc. - */ - function kw(name, options) { - if (options === undefined) - options = {}; - qtt["_" + name] = name; - keywords[name] = {}; - keywords[name].isPrimitive = options.isPrimitive ? true : false; - keywords[name].isQMLContextual = options.isQMLContextual ? true : false; - } + /* + * Shorthand for defining keywords in the 'keywords' variable with the following + * format: + * keywords[name].isPrimitive : if this is a primitive type + * keywords[name].isQMLContextual : if this is a contextual keyword for QML + * + * Also stores the token's name in qtt._ for easy referencing later. None + * of these keywords will be tokenized and, as such, are allowed to be used in + * JavaScript expressions by acorn. The 'isQMLContextual' boolean in keywords refers + * to those contextual keywords that are also contextual in QML's parser rules such + * as 'color', 'list', 'alias', etc. + */ + function kw(name, options) { + if (options === undefined) + options = {}; + qtt["_" + name] = name; + keywords[name] = {}; + keywords[name].isPrimitive = options.isPrimitive ? true : false; + keywords[name].isQMLContextual = options.isQMLContextual ? true : false; + } - // QML keywords - kw("import"); - kw("pragma"); - kw("property", { isQMLContextual : true }); - kw("readonly", { isQMLContextual : true }); - kw("signal", { isQMLContextual : true }); - kw("as"); - kw("boolean", { isPrimitive: true }); - kw("double", { isPrimitive: true }); - kw("int", { isPrimitive: true }); - kw("alias", { isQMLContextual: true }); - kw("list", { isPrimitive: true, isQMLContextual: true }); - kw("color", { isPrimitive: true, isQMLContextual: true }); - kw("real", { isPrimitive: true, isQMLContextual: true }); - kw("string", { isPrimitive: true, isQMLContextual: true }); - kw("url", { isPrimitive: true, isQMLContextual: true }); + // QML keywords + kw("import"); + kw("pragma"); + kw("property", { isQMLContextual: true }); + kw("readonly", { isQMLContextual: true }); + kw("signal", { isQMLContextual: true }); + kw("as"); + kw("boolean", { isPrimitive: true }); + kw("double", { isPrimitive: true }); + kw("int", { isPrimitive: true }); + kw("alias", { isQMLContextual: true }); + kw("list", { isPrimitive: true, isQMLContextual: true }); + kw("color", { isPrimitive: true, isQMLContextual: true }); + kw("real", { isPrimitive: true, isQMLContextual: true }); + kw("string", { isPrimitive: true, isQMLContextual: true }); + kw("url", { isPrimitive: true, isQMLContextual: true }); - // Future reserved words - kw("transient"); - kw("synchronized"); - kw("abstract"); - kw("volatile"); - kw("native"); - kw("goto"); - kw("byte"); - kw("long"); - kw("char"); - kw("short"); - kw("float"); + // Future reserved words + kw("transient"); + kw("synchronized"); + kw("abstract"); + kw("volatile"); + kw("native"); + kw("goto"); + kw("byte"); + kw("long"); + kw("char"); + kw("short"); + kw("float"); - // QML parser methods - var pp = acorn.Parser.prototype; + // QML parser methods + var pp = acorn.Parser.prototype; - /* - * Parses a set of QML Header Statements which can either be of - * the type import or pragma - */ - pp.qml_parseHeaderStatements = function() { - var node = this.startNode() - node.statements = []; + /* + * Parses a set of QML Header Statements which can either be of + * the type import or pragma + */ + pp.qml_parseHeaderStatements = function () { + var node = this.startNode() + node.statements = []; - var loop = true; - while (loop) { - if (this.type === tt._import || this.isContextual(qtt._import)) { - var qmlImport = this.qml_parseImportStatement(); - node.statements.push(qmlImport); - } else if (this.isContextual(qtt._pragma)) { - var qmlPragma = this.qml_parsePragmaStatement(); - node.statements.push(qmlPragma); - } else { - loop = false; - } - } + var loop = true; + while (loop) { + if (this.type === tt._import || this.isContextual(qtt._import)) { + var qmlImport = this.qml_parseImportStatement(); + node.statements.push(qmlImport); + } else if (this.isContextual(qtt._pragma)) { + var qmlPragma = this.qml_parsePragmaStatement(); + node.statements.push(qmlPragma); + } else { + loop = false; + } + } - if (node.statements.length > 0) { - return this.finishNode(node, "QMLHeaderStatements"); - } - return undefined; - } + return this.finishNode(node, "QMLHeaderStatements"); + } - /* - * Parses a QML Pragma statement of the form: - * 'pragma' - */ - pp.qml_parsePragmaStatement = function() { - var node = this.startNode(); - this.next(); - node.identifier = this.parseIdent(false); - this.semicolon(); - return this.finishNode(node, "QMLPragmaStatement"); - } + /* + * Parses a QML Pragma statement of the form: + * 'pragma' + */ + pp.qml_parsePragmaStatement = function () { + var node = this.startNode(); + this.expectContextual(qtt._pragma); + node.id = this.parseIdent(false); + this.semicolon(); + return this.finishNode(node, "QMLPragmaStatement"); + } - /* - * Parses a QML Import statement of the form: - * 'import' [as ] - * 'import' [as ] - * - * as specified by http://doc.qt.io/qt-5/qtqml-syntax-imports.html - */ - pp.qml_parseImportStatement = function() { - var node = this.startNode(); - this.next(); + /* + * Parses a QML Import statement of the form: + * 'import' [as ] + * 'import' [as ] + * + * as specified by http://doc.qt.io/qt-5/qtqml-syntax-imports.html + */ + pp.qml_parseImportStatement = function () { + var node = this.startNode(); - // The type of import varies solely on the next token - switch(this.type) { - case tt.name: - node.module = this.qml_parseModule(); - break; - case tt.string: - node.directoryPath = this.parseLiteral(this.value); - break; - default: - this.unexpected(); - break; - } + if (!this.eat(tt._import) && !this.eatContextual(qtt._import)) { + this.unexpected(); + } - // Parse the qualifier, if any - if (this.isContextual(qtt._as)) { - node.qualifier = this.qml_parseQualifier(); - } + switch (this.type) { + case tt.name: + node.module = this.qml_parseModule(); + node.directory = null; + break; + case tt.string: + node.module = null; + node.directory = this.parseLiteral(this.value); + break; + default: + this.unexpected(); + } - this.semicolon(); - return this.finishNode(node, "QMLImportStatement"); - }; + // Parse the qualifier, if any + if (this.isContextual(qtt._as)) { + node.qualifier = this.qml_parseQualifier(); + } + this.semicolon(); - /* - * Parses a QML Module of the form: - * - */ - pp.qml_parseModule = function() { - var node = this.startNode(); + return this.finishNode(node, "QMLImportStatement"); + }; - node.qualifiedId = this.qml_parseQualifiedId(); - if (this.type === tt.num) { - node.version = this.qml_parseVersionLiteral(); - } else { - this.unexpected(); - } + /* + * Parses a QML Module of the form: + * ['as' ]? + */ + pp.qml_parseModule = function () { + var node = this.startNode(); - return this.finishNode(node, "QMLModule"); - }; + node.id = this.qml_parseQualifiedId(false); + if (this.type === tt.num) { + node.version = this.qml_parseVersionLiteral(); + } else { + this.unexpected(); + } - /* - * Parses a QML Version Literal which consists of a major and minor - * version separated by a '.' - */ - pp.qml_parseVersionLiteral = function() { - var node = this.startNode(); + return this.finishNode(node, "QMLModule"); + }; - node.raw = this.input.slice(this.start, this.end); - node.value = this.value; - var matches; - if (matches = /(\d+)\.(\d+)/.exec(node.raw)) { - node.major = parseInt(matches[1]); - node.minor = parseInt(matches[2]); - } else { - this.raise(this.start, "QML module must specify major and minor version"); - } + /* + * Parses a QML Version Literal which consists of a major and minor + * version separated by a '.' + */ + pp.qml_parseVersionLiteral = function () { + var node = this.startNode(); - this.next(); - return this.finishNode(node, "QMLVersionLiteral"); - } + node.raw = this.input.slice(this.start, this.end); + node.value = this.value; + var matches; + if (matches = /(\d+)\.(\d+)/.exec(node.raw)) { + node.major = parseInt(matches[1]); + node.minor = parseInt(matches[2]); + this.next(); + } else { + this.raise(this.start, "QML module must specify major and minor version"); + } - /* - * Parses a QML Qualifier of the form: - * 'as' - */ - pp.qml_parseQualifier = function() { - var node = this.startNode(); - this.next(); - node.identifier = this.qml_parseIdent(false); - return this.finishNode(node, "QMLQualifier"); - } + return this.finishNode(node, "QMLVersionLiteral"); + } - /* - * Parses a QML Object Literal of the form: - * { ()* } - * - * http://doc.qt.io/qt-5/qtqml-syntax-basics.html#object-declarations - */ - pp.qml_parseObjectLiteral = function(node) { - if (!node) { - node = this.startNode(); - } - if (!node.qualifiedId) { - node.qualifiedId = this.qml_parseQualifiedId(); - } - node.block = this.qml_parseMemberBlock(); - return this.finishNode(node, "QMLObjectLiteral"); - } + /* + * Parses a QML Qualifier of the form: + * 'as' + */ + pp.qml_parseQualifier = function () { + var node = this.startNode(); + this.expectContextual(qtt._as); + node.id = this.qml_parseIdent(false); + return this.finishNode(node, "QMLQualifier"); + } - /* - * Parses a QML Member Block of the form: - * { * } - */ - pp.qml_parseMemberBlock = function() { - var node = this.startNode(); - this.expect(tt.braceL); - node.members = []; - while (!this.eat(tt.braceR)) { - node.members.push(this.qml_parseMember()); - } - return this.finishNode(node, "QMLMemberBlock"); - } + /* + * Parses a QML Object Literal of the form: + * { ()* } + * + * http://doc.qt.io/qt-5/qtqml-syntax-basics.html#object-declarations + */ + pp.qml_parseObjectLiteral = function (node) { + if (!node) { + node = this.startNode(); + } + if (!node.id) { + node.id = this.qml_parseQualifiedId(false); + } + node.block = this.qml_parseMemberBlock(); + return this.finishNode(node, "QMLObjectLiteral"); + } - /* - * Parses a QML Member which can be one of the following: - * - a QML Property Binding - * - a Property Declaration (or Alias) - * - a QML Object Literal - * - a JavaScript Function Declaration - * - a Signal Definition - */ - pp.qml_parseMember = function() { - var node = this.startNode(); + /* + * Parses a QML Member Block of the form: + * { * } + */ + pp.qml_parseMemberBlock = function () { + var node = this.startNode(); + this.expect(tt.braceL); + node.members = []; + while (!this.eat(tt.braceR)) { + node.members.push(this.qml_parseMember()); + } + return this.finishNode(node, "QMLMemberBlock"); + } - if (this.type === tt._default - || this.isContextual(qtt._default) - || this.isContextual(qtt._readonly) - || this.isContextual(qtt._property)) { - return this.qml_parsePropertyDeclaration(node); - } else if (this.isContextual(qtt._signal)) { - return this.qml_parseSignalDefinition(node); - } else if (this.type === tt._function) { - return this.parseFunctionStatement(node); - } + /* + * Parses a QML Member which can be one of the following: + * - a QML Property Binding + * - a Property Declaration (or Alias) + * - a QML Object Literal + * - a JavaScript Function Declaration + * - a Signal Definition + */ + pp.qml_parseMember = function () { + if (this.type === tt._default || this.isContextual(qtt._default) || this.isContextual(qtt._readonly) || this.isContextual(qtt._property)) { + return this.qml_parsePropertyDeclaration(); + } else if (this.isContextual(qtt._signal)) { + return this.qml_parseSignalDefinition(); + } else if (this.type === tt._function) { + return this.parseFunctionStatement(); + } + return this.qml_parseObjectLiteralOrPropertyBinding(); + } - node.qualifiedId = this.qml_parseQualifiedId(); - switch(this.type) { - case tt.braceL: - return this.qml_parseObjectLiteral(node); - case tt.colon: - return this.qml_parseProperty(node); - } + /* + * Parses a QML Object Literal or Property Binding depending on the tokens found. + */ + pp.qml_parseObjectLiteralOrPropertyBinding = function (node) { + if (!node) { + node = this.startNode(); + } + if (!node.id) { + node.id = this.qml_parseQualifiedId(false); + } + switch (this.type) { + case tt.braceL: + return this.qml_parseObjectLiteral(node); + case tt.colon: + return this.qml_parsePropertyBinding(node); + } + this.unexpected(); + } - this.unexpected(); - } + /* + * Parses a QML Property of the form: + * + */ + pp.qml_parsePropertyBinding = function (node) { + if (!node) { + node = this.startNode(); + } + if (!node.id) { + node.id = this.qml_parseQualifiedId(false); + } + this.expect(tt.colon); + node.expr = this.qml_parsePropertyAssignment(); + return this.finishNode(node, "QMLPropertyBinding"); + } - /* - * Parses a QML Property of the form: - * - */ - pp.qml_parseProperty = function(node) { - if (!node) { - node = this.startNode(); - } - if (!node.qualifiedId) { - node.qualifiedId = this.qml_parseQualifiedId(); - } - node.binding = this.qml_parseBinding(); - return this.finishNode(node, "QMLProperty"); - } + /* + * Parses a QML Signal Definition of the form: + * 'signal' [( [',' ]* )]? + */ + pp.qml_parseSignalDefinition = function () { + var node = this.startNode(); - /* - * Parses a QML Signal Definition of the form: - * 'signal' [( [',' ]* )]? - */ - pp.qml_parseSignalDefinition = function(node) { - if (!node) { - node = this.startNode(); - } - this.next(); - node.identifier = this.qml_parseIdent(false); - node.parameters = []; - if (this.type === tt.parenL) { - this.next(); - if (this.type !== tt.parenR) { - do { - var paramNode = this.startNode(); - paramNode.type = this.qml_parseIdent(false); - paramNode.identifier = this.qml_parseIdent(false); - node.parameters.push(paramNode); - } while(this.eat(tt.comma)); - } - if (!this.eat(tt.parenR)) { - this.unexpected(); - } - } - this.semicolon(); - return this.finishNode(node, "QMLSignalDefinition"); - } + // Parse as a qualified id in case this is not a signal definition + var signal = this.qml_parseQualifiedId(true); + if (signal.parts.length === 1) { + if (signal.name !== qtt._signal) { + this.unexpected(); + } - /* - * Parses a QML Property Declaration (or Alias) of the form: - * ['default'|'readonly'] 'property' [] - */ - pp.qml_parsePropertyDeclaration = function(node) { - node["default"] = false; - node["readonly"] = false; + if (this.type === tt.colon || this.type === tt.braceL) { + // This is a property binding or object literal + node.id = signal; + return this.qml_parseObjectLiteralOrPropertyBinding(node); + } + } else { + // Signal keyword is a qualified ID. This is not a signal definition + node.id = signal; + return this.qml_parseObjectLiteralOrPropertyBinding(node); + } - if (this.type === tt._default || this.isContextual(qtt._default)) { - node["default"] = true; - this.next(); - } else if (this.eatContextual(qtt._readonly)) { - node["readonly"] = true; - } - this.expectContextual(qtt._property); - node.typeInfo = this.qml_parseType(); - node.identifier = this.qml_parseIdent(false); - if (this.type !== tt.colon) { - this.semicolon(); - } else { - node.binding = this.qml_parseBinding(); - } + node.id = this.qml_parseIdent(false); + this.qml_parseSignalParams(node); + this.semicolon(); + return this.finishNode(node, "QMLSignalDefinition"); + } - if (node.typeInfo.type === qtt._alias) { - node.typeInfo = undefined; - return this.finishNode(node, "QMLPropertyAlias"); - } - return this.finishNode(node, "QMLPropertyDeclaration"); - } + /* + * Parses QML Signal Parameters of the form: + * [( [',' ]* )]? + */ + pp.qml_parseSignalParams = function (node) { + node.params = []; + if (this.eat(tt.parenL)) { + if (!this.eat(tt.parenR)) { + do { + var param = this.startNode(); + param.kind = this.qml_parseIdent(false); + param.id = this.qml_parseIdent(false); + node.params.push(this.finishNode(param, "QMLParameter")); + } while (this.eat(tt.comma)); + this.expect(tt.parenR); + } + } + } - /* - * Parses a QML Binding of the form: - * ':' (|) - */ - pp.qml_parseBinding = function() { - var node = this.startNode(); - this.expect(tt.colon); + /* + * Parses a QML Property Declaration (or Alias) of the form: + * ['default'|'readonly'] 'property' [] + */ + pp.qml_parsePropertyDeclaration = function () { + var node = this.startNode(); - // TODO: solve ambiguity where a QML Object Literal starts with a - // Qualified Id that looks very similar to a MemberExpression in - // JavaScript. For now, we just won't parse statements like: - // test: QMLObject { } - // test: QMLObject.QualifiedId { } + // Parse 'default' or 'readonly' + node["default"] = false; + node["readonly"] = false; + if (this.eat(tt._default) || this.eatContextual(qtt._default)) { + node["default"] = true; + } else if (this.isContextual(qtt._readonly)) { + // Parse as a qualified id in case this is not a property declaration + var readonly = this.qml_parseQualifiedId(true); + if (readonly.parts.length === 1) { + if (this.type === tt.colon || this.type === tt.braceL) { + // This is a property binding or object literal. + node.id = readonly; + return this.qml_parseObjectLiteralOrPropertyBinding(node); + } + node["readonly"] = true; + } else { + // Readonly keyword is a qualified ID. This is not a property declaration. + node.id = readonly; + return this.qml_parseObjectLiteralOrPropertyBinding(node); + } + } - if (this.type === tt.braceL) { - node.block = this.qml_parseStatementBlock(); - return this.finishNode(node, "QMLBinding"); - } - node.expr = this.parseExpression(false); - this.semicolon(); - return this.finishNode(node, "QMLBinding"); - } + // Parse as a qualified id in case this is not a property declaration + var property = this.qml_parseQualifiedId(true); + if (property.parts.length === 1 || node["default"] || node["readonly"]) { + if (property.name !== qtt._property) { + this.unexpected(); + } - /* - * Parses a QML Statement Block of the form: - * { * } - */ - pp.qml_parseStatementBlock = function() { - var node = this.startNode(); - this.expect(tt.braceL); - node.statements = []; - while(!this.eat(tt.braceR)) { - node.statements.push(this.parseStatement(true, false)); - } - return this.finishNode(node, "QMLStatementBlock"); - } + if (this.type === tt.colon || this.type === tt.braceL) { + // This is a property binding or object literal. + node["default"] = undefined; + node["readonly"] = undefined; + node.id = property; + return this.qml_parseObjectLiteralOrPropertyBinding(node); + } + } else { + // Property keyword is a qualified ID. This is not a property declaration. + node["default"] = undefined; + node["readonly"] = undefined; + node.id = property; + return this.qml_parseObjectLiteralOrPropertyBinding(node); + } - /* - * Parses a QML Type which can be either a Qualified ID or a primitive type keyword. - * Returns a node of type qtt._alias if the type keyword parsed was "alias". - */ - pp.qml_parseType = function() { - var node = this.startNode(); + node.kind = this.qml_parseKind(); + node.id = this.qml_parseIdent(false); + if (!this.eat(tt.colon)) { + node.init = null; + this.semicolon(); + } else { + node.init = this.qml_parsePropertyAssignment(); + } - if (this.type === tt.name || this.type === tt._var) { - var value = this.value; - if (this.qml_eatPrimitiveType(value)) { - node.isPrimitive = true; - node.primitive = value; - } else if (this.eatContextual(qtt._alias)) { - return this.finishNode(node, qtt._alias); - } else { - node.isPrimitive = false; - node.qualifiedId = this.qml_parseQualifiedId(); - } - } else { - this.unexpected(); - } + return this.finishNode(node, "QMLPropertyDeclaration"); + } - return this.finishNode(node, "QMLType"); - } + /* + * Parses one of the following possibilities for a QML Property assignment: + * - JavaScript Expression + * - QML JavaScript Statement Block + * - QML Object Literal + */ + pp.qml_parsePropertyAssignment = function () { + // TODO: solve ambiguity where a QML Object Literal starts with a + // Qualified Id that looks very similar to a MemberExpression in + // JavaScript. For now, we just won't parse statements like: + // test: QMLObject { } + // test: QMLObject.QualifiedId { } - /* - * Parses a Qualified ID of the form: - * ('.' )* - */ - pp.qml_parseQualifiedId = function() { - var node = this.startNode(); + if (this.type === tt.braceL) { + return this.qml_parseStatementBlock(); + } else { + var node = this.parseExpression(false); + this.semicolon(); + return node; + } + } - node.parts = []; - if (!this.qml_isIdent(this.type, this.value)) { - this.unexpected(); - } - var id = this.value; - this.next(); - node.parts.push(id); - while(this.type === tt.dot) { - id += '.'; - this.next(); - if (!this.qml_isIdent(this.type, this.value)) { - this.unexpected(); - } - id += this.value; - node.parts.push(this.value); - this.next(); - } - node.raw = id; + /* + * Parses a QML Statement Block of the form: + * { * } + */ + pp.qml_parseStatementBlock = function () { + var node = this.startNode(); + this.expect(tt.braceL); + node.statements = []; + while (!this.eat(tt.braceR)) { + node.statements.push(this.parseStatement(true, false)); + } + return this.finishNode(node, "QMLStatementBlock"); + } - return this.finishNode(node, "QMLQualifiedID"); - } + /* + * Parses a QML Type which can be either a Qualified ID or a primitive type keyword. + * Returns a node of type qtt._alias if the type keyword parsed was "alias". + */ + pp.qml_parseKind = function () { + if (this.type === tt.name || this.type === tt._var) { + var value = this.value; + if (this.qml_eatPrimitiveType(value)) { + return value; + } else if (this.eatContextual(qtt._alias)) { + return qtt._alias; + } else { + return this.qml_parseQualifiedId(false); + } + } + this.unexpected(); + } - /* - * Parses an Identifier in a QML Context. That is, this method uses 'isQMLContextual' - * to throw an error if a non-contextual QML keyword is found. - */ - pp.qml_parseIdent = function(liberal) { - // Check for non-contextual QML keywords - if (this.type === tt.name) { - for (var key in keywords) { - if (!keywords[key].isQMLContextual && this.isContextual(key)) { - this.unexpected(); - } - } - } - return this.parseIdent(liberal); - } + /* + * Parses a Qualified ID of the form: + * ('.' )* + * + * If 'liberal' is true then this method will allow non-contextual QML keywords as + * identifiers. + */ + pp.qml_parseQualifiedId = function (liberal) { + var node = this.startNode(); + node.parts = []; + node.parts.push(this.qml_parseIdent(liberal)); + while (this.eat(tt.dot)) { + node.parts.push(this.qml_parseIdent(liberal)); + } - /* - * Returns whether or not a given token type and name can be a QML Identifier. - * Uses the 'isQMLContextual' boolean of 'keywords' to determine this. - */ - pp.qml_isIdent = function(type, name) { - if (type === tt.name) { - var key; - if (key = keywords[name]) { - return key.isQMLContextual - } - return true; - } - return false; - } + node.name = ""; + for (var i = 0; i < node.parts.length; i++) { + node.name += node.parts[i].name; + if (i < node.parts.length - 1) { + node.name += "."; + } + } - /* - * Returns whether or not the current token is a QML primitive type and consumes - * it as a side effect if it is. - */ - pp.qml_eatPrimitiveType = function(name) { - if (this.qml_isPrimitiveType(name)) { - this.next(); - return true; - } - return false; - } + return this.finishNode(node, "QMLQualifiedID"); + } - /* - * Returns whether or not the current token is a QML primitive type. - */ - pp.qml_isPrimitiveType = function(name) { - if (name === "var") { - return true; - } + /* + * Parses an Identifier in a QML Context. That is, this method uses 'isQMLContextual' + * to throw an error if a non-contextual QML keyword is found. + * + * If 'liberal' is true then this method will allow non-contextual QML keywords as + * identifiers. + */ + pp.qml_parseIdent = function (liberal) { + // Check for non-contextual QML keywords + if (this.type === tt.name) { + if (!liberal) { + for (var key in keywords) { + if (!keywords[key].isQMLContextual && this.isContextual(key)) { + this.unexpected(); + } + } + } + } + return this.parseIdent(liberal); + } - var key; - if (key = keywords[name]) { - return key.isPrimitive; - } - return false; - } + /* + * Returns whether or not a given token type and name can be a QML Identifier. + * Uses the 'isQMLContextual' boolean of 'keywords' to determine this. + */ + pp.qml_isIdent = function (type, name) { + if (type === tt.name) { + var key; + if (key = keywords[name]) { + return key.isQMLContextual + } + return true; + } + return false; + } - acorn.plugins.qml = function(instance) { + /* + * Returns whether or not the current token is a QML primitive type and consumes + * it as a side effect if it is. + */ + pp.qml_eatPrimitiveType = function (name) { + if (this.qml_isPrimitiveType(name)) { + this.next(); + return true; + } + return false; + } - // Extend acorn's 'parseTopLevel' method - instance.extend("parseTopLevel", function(nextMethod) { - return function(node) { - // Most of QML's constructs sit at the top-level of the parse tree, - // replacing JavaScripts top-level. Here we are parsing such things - // as the root object literal and header statements of QML. Eventually, - // these rules will delegate down to JavaScript expressions. - if (!node.body) { - node.body = []; - } + /* + * Returns whether or not the current token is a QML primitive type. + */ + pp.qml_isPrimitiveType = function (name) { + if (name === "var") { + return true; + } - var headerStmts = this.qml_parseHeaderStatements(); - if (headerStmts !== undefined) { - node.body.push(headerStmts); - } + var key; + if (key = keywords[name]) { + return key.isPrimitive; + } + return false; + } - if (this.type !== tt.eof) { - var objRoot = this.qml_parseObjectLiteral(); - if (objRoot !== undefined) { - node.body.push(objRoot); - } - } + acorn.plugins.qml = function (instance) { - if (!this.eat(tt.eof)) { - this.raise(this.pos, "Expected EOF after QML Root Object"); - } + // Extend acorn's 'parseTopLevel' method + instance.extend("parseTopLevel", function (nextMethod) { + return function (node) { + // Most of QML's constructs sit at the top-level of the parse tree, + // replacing JavaScripts top-level. Here we are parsing such things + // as the root object literal and header statements of QML. Eventually, + // these rules will delegate down to JavaScript expressions. + node.headerStatements = this.qml_parseHeaderStatements(); + node.rootObject = null; + if (this.type !== tt.eof) { + node.rootObject = this.qml_parseObjectLiteral(); + } - return this.finishNode(node, "Program"); - }; - }); - } + if (!this.eat(tt.eof)) { + this.raise(this.pos, "Expected EOF after QML Root Object"); + } - return acorn; - }; + return this.finishNode(node, "Program"); + }; + }); + } + + return acorn; + }; }) \ No newline at end of file diff --git a/qt/org.eclipse.cdt.qt.core/acorn-qml/package.json b/qt/org.eclipse.cdt.qt.core/acorn-qml/package.json index b1472b23fc3..580bc17315e 100644 --- a/qt/org.eclipse.cdt.qt.core/acorn-qml/package.json +++ b/qt/org.eclipse.cdt.qt.core/acorn-qml/package.json @@ -6,6 +6,6 @@ "test": "node test/run.js" }, "dependencies": { - "acorn": "^2.4.0" + "acorn": "^2.5.2" } } \ No newline at end of file diff --git a/qt/org.eclipse.cdt.qt.core/acorn-qml/test/run.js b/qt/org.eclipse.cdt.qt.core/acorn-qml/test/run.js index faa6b00112c..3cc28dc72c5 100644 --- a/qt/org.eclipse.cdt.qt.core/acorn-qml/test/run.js +++ b/qt/org.eclipse.cdt.qt.core/acorn-qml/test/run.js @@ -75,7 +75,7 @@ outputStats("Total", total); groupEnd(); if (total.failed && typeof process === "object") { - process.stdout.write("", function() { + process.stdout.write("", function () { process.exit(1); }); } \ No newline at end of file diff --git a/qt/org.eclipse.cdt.qt.core/acorn-qml/test/tests-qml.js b/qt/org.eclipse.cdt.qt.core/acorn-qml/test/tests-qml.js index 3a1d0940147..275f9436462 100644 --- a/qt/org.eclipse.cdt.qt.core/acorn-qml/test/tests-qml.js +++ b/qt/org.eclipse.cdt.qt.core/acorn-qml/test/tests-qml.js @@ -18,135 +18,137 @@ var testFixture = { 'qml-header-statements': { // -------------------------- Import -------------------------- - 'import QtQuick 2.2': [ - { - type: "QMLHeaderStatements", - range: [0, 18], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 18 } - }, - statements: [ - { - type: "QMLImportStatement", - range: [0, 18], + 'import QtQuick 2.2': { + type: "QMLHeaderStatements", + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + statements: [ + { + type: "QMLImportStatement", + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + module: { + type: "QMLModule", + range: [7, 18], loc: { - start: { line: 1, column: 0 }, + start: { line: 1, column: 7 }, end: { line: 1, column: 18 } }, - module: { - type: "QMLModule", - range: [7, 18], + id: { + type: "QMLQualifiedID", + range: [7, 14], loc: { start: { line: 1, column: 7 }, - end: { line: 1, column: 18 } + end: { line: 1, column: 14 } }, - qualifiedId: { - type: "QMLQualifiedID", + parts: [{ + type: "Identifier", range: [7, 14], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 14 } }, - parts: [ "QtQuick" ], - raw: "QtQuick" + name: "QtQuick" + }], + name: "QtQuick" + }, + version: { + type: "QMLVersionLiteral", + range: [15, 18], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 18 } }, - version: { - type: "QMLVersionLiteral", - range: [15, 18], - loc: { - start: { line: 1, column: 15 }, - end: { line: 1, column: 18 } - }, - value: 2.2, - major: 2, - minor: 2, - raw: "2.2" - } + value: 2.2, + major: 2, + minor: 2, + raw: "2.2" } } - ] - } - ], + } + ] + }, - 'import "./file.js"': [ - { - type: "QMLHeaderStatements", - range: [0, 18], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 18 } - }, - statements: [ - { - type: "QMLImportStatement", - range: [0, 18], + 'import "./file.js"': { + type: "QMLHeaderStatements", + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + statements: [ + { + type: "QMLImportStatement", + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + directory: { + type:"Literal", + range: [7, 18], loc: { - start: { line: 1, column: 0 }, + start: { line: 1, column: 7 }, end: { line: 1, column: 18 } }, - directoryPath: { - type:"Literal", - range: [7, 18], - loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 18 } - }, - value: "./file.js", - raw: "\"./file.js\"" - } + value: "./file.js", + raw: "\"./file.js\"" } - ] - } - ], + } + ] + }, - 'import "./file.js" as MyModule': [ - { - type: "QMLHeaderStatements", - range: [0, 30], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 30 } - }, - statements: [ - { - type: "QMLImportStatement", - range: [0, 30], + 'import "./file.js" as MyModule': { + type: "QMLHeaderStatements", + range: [0, 30], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 30 } + }, + statements: [ + { + type: "QMLImportStatement", + range: [0, 30], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 30 } + }, + directory: { + type:"Literal", + range: [7, 18], loc: { - start: { line: 1, column: 0 }, + start: { line: 1, column: 7 }, + end: { line: 1, column: 18 } + }, + value: "./file.js", + raw: "\"./file.js\"" + }, + qualifier: { + type: "QMLQualifier", + range: [19, 30], + loc: { + start: { line: 1, column: 19 }, end: { line: 1, column: 30 } }, - directoryPath: { - type:"Literal", - range: [7, 18], + id: { + type:"Identifier", + range: [22, 30], loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 18 } - }, - value: "./file.js", - raw: "\"./file.js\"" - }, - qualifier: { - type: "QMLQualifier", - range: [19, 30], - loc: { - start: { line: 1, column: 19 }, + start: { line: 1, column: 22 }, end: { line: 1, column: 30 } }, - identifier: { - type:"Identifier", - range: [22, 30], - loc: { - start: { line: 1, column: 22 }, - end: { line: 1, column: 30 } - }, - name: "MyModule" - } + name: "MyModule" } } - ] - } - ], + } + ] + }, 'import QtQuick ver': "Unexpected token (1:15)", @@ -154,270 +156,309 @@ var testFixture = { 'import QtQuick 1': "QML module must specify major and minor version (1:15)", - 'import QtQuick 2.2\nimport "./file.js"': [ - { - type: "QMLHeaderStatements", - range: [0, 37], - loc: { - start: { line: 1, column: 0 }, - end: { line: 2, column: 18 } - }, - statements: [ - { - type: "QMLImportStatement", - range: [0, 18], + 'import QtQuick 2.2\nimport "./file.js"': { + type: "QMLHeaderStatements", + range: [0, 37], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 18 } + }, + statements: [ + { + type: "QMLImportStatement", + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + module: { + type: "QMLModule", + range: [7, 18], loc: { - start: { line: 1, column: 0 }, + start: { line: 1, column: 7 }, end: { line: 1, column: 18 } }, - module: { - type: "QMLModule", - range: [7, 18], + id: { + type: "QMLQualifiedID", + range: [7, 14], loc: { start: { line: 1, column: 7 }, - end: { line: 1, column: 18 } + end: { line: 1, column: 14 } }, - qualifiedId: { - type: "QMLQualifiedID", + parts: [{ + type: "Identifier", range: [7, 14], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 14 } }, - parts: [ "QtQuick" ], - raw: "QtQuick" + name: "QtQuick" + }], + name: "QtQuick" + }, + version: { + type: "QMLVersionLiteral", + range: [15, 18], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 18 } }, - version: { - type: "QMLVersionLiteral", - range: [15, 18], - loc: { - start: { line: 1, column: 15 }, - end: { line: 1, column: 18 } - }, - value: 2.2, - major: 2, - minor: 2, - raw: "2.2" - } + value: 2.2, + major: 2, + minor: 2, + raw: "2.2" } + } + }, + { + type: "QMLImportStatement", + range: [19, 37], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 18 } }, - { - type: "QMLImportStatement", - range: [19, 37], + directory: { + type:"Literal", + range: [26, 37], loc: { - start: { line: 2, column: 0 }, + start: { line: 2, column: 7 }, end: { line: 2, column: 18 } }, - directoryPath: { - type:"Literal", - range: [26, 37], - loc: { - start: { line: 2, column: 7 }, - end: { line: 2, column: 18 } - }, - value: "./file.js", - raw: "\"./file.js\"" - } + value: "./file.js", + raw: "\"./file.js\"" } - ] - } - ], + } + ] + }, - 'import QtQuick 2.2;import "./file.js"': [ - { - type: "QMLHeaderStatements", - range: [0, 37], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 37 } - }, - statements: [ - { - type: "QMLImportStatement", - range: [0, 19], + 'import QtQuick 2.2;import "./file.js"': { + type: "QMLHeaderStatements", + range: [0, 37], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 37 } + }, + statements: [ + { + type: "QMLImportStatement", + range: [0, 19], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 19 } + }, + module: { + type: "QMLModule", + range: [7, 18], loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 19 } + start: { line: 1, column: 7 }, + end: { line: 1, column: 18 } }, - module: { - type: "QMLModule", - range: [7, 18], + id: { + type: "QMLQualifiedID", + range: [7, 14], loc: { start: { line: 1, column: 7 }, - end: { line: 1, column: 18 } + end: { line: 1, column: 14 } }, - qualifiedId: { - type: "QMLQualifiedID", + parts: [{ + type: "Identifier", range: [7, 14], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 14 } }, - parts: [ "QtQuick" ], - raw: "QtQuick" - }, - version: { - type: "QMLVersionLiteral", - range: [15, 18], - loc: { - start: { line: 1, column: 15 }, - end: { line: 1, column: 18 } - }, - value: 2.2, - major: 2, - minor: 2, - raw: "2.2" - } - } - }, - { - type: "QMLImportStatement", - range: [19, 37], - loc: { - start: { line: 1, column: 19 }, - end: { line: 1, column: 37 } + name: "QtQuick" + }], + name: "QtQuick" }, - directoryPath: { - type:"Literal", - range: [26, 37], + version: { + type: "QMLVersionLiteral", + range: [15, 18], loc: { - start: { line: 1, column: 26 }, - end: { line: 1, column: 37 } + start: { line: 1, column: 15 }, + end: { line: 1, column: 18 } }, - value: "./file.js", - raw: "\"./file.js\"" + value: 2.2, + major: 2, + minor: 2, + raw: "2.2" } } - ] - } - ], - - 'import Module 1.0 as MyModule': [ - { - type: "QMLHeaderStatements", - range: [0, 29], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 29 } }, - statements: [ - { - type: "QMLImportStatement", - range: [0, 29], + { + type: "QMLImportStatement", + range: [19, 37], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 37 } + }, + directory: { + type:"Literal", + range: [26, 37], loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 29 } + start: { line: 1, column: 26 }, + end: { line: 1, column: 37 } }, - module: { - type: "QMLModule", - range: [7, 17], + value: "./file.js", + raw: "\"./file.js\"" + } + } + ] + }, + + 'import Module 1.0 as MyModule': { + type: "QMLHeaderStatements", + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + }, + statements: [ + { + type: "QMLImportStatement", + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + }, + module: { + type: "QMLModule", + range: [7, 17], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 17 } + }, + id: { + type: "QMLQualifiedID", + range: [7, 13], loc: { start: { line: 1, column: 7 }, - end: { line: 1, column: 17 } + end: { line: 1, column: 13 } }, - qualifiedId: { - type: "QMLQualifiedID", + parts: [{ + type: "Identifier", range: [7, 13], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 13 } }, - parts: [ "Module" ], - raw: "Module" - }, - version: { - type: "QMLVersionLiteral", - range: [14, 17], - loc: { - start: { line: 1, column: 14 }, - end: { line: 1, column: 17 } - }, - value: 1, - major: 1, - minor: 0, - raw: "1.0" - } + name: "Module" + }], + name: "Module" }, - qualifier: { - type: "QMLQualifier", - range: [18, 29], + version: { + type: "QMLVersionLiteral", + range: [14, 17], loc: { - start: { line: 1, column: 18 }, + start: { line: 1, column: 14 }, + end: { line: 1, column: 17 } + }, + value: 1, + major: 1, + minor: 0, + raw: "1.0" + } + }, + qualifier: { + type: "QMLQualifier", + range: [18, 29], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 29 } + }, + id: { + type:"Identifier", + range: [21, 29], + loc: { + start: { line: 1, column: 21 }, end: { line: 1, column: 29 } }, - identifier: { - type:"Identifier", - range: [21, 29], - loc: { - start: { line: 1, column: 21 }, - end: { line: 1, column: 29 } - }, - name: "MyModule" - } + name: "MyModule" } } - ] - } - ], + } + ] + }, - 'import Qualified.Id.Test 1.0': [ - { - type: "QMLHeaderStatements", - range: [0, 28], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 28 } - }, - statements: [ - { - type: "QMLImportStatement", - range: [0, 28], + 'import Qualified.Id.Test 1.0': { + type: "QMLHeaderStatements", + range: [0, 28], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 28 } + }, + statements: [ + { + type: "QMLImportStatement", + range: [0, 28], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 28 } + }, + module: { + type: "QMLModule", + range: [7, 28], loc: { - start: { line: 1, column: 0 }, + start: { line: 1, column: 7 }, end: { line: 1, column: 28 } }, - module: { - type: "QMLModule", - range: [7, 28], + id: { + type: "QMLQualifiedID", + range: [7, 24], loc: { start: { line: 1, column: 7 }, + end: { line: 1, column: 24 } + }, + parts: [ + { + type: "Identifier", + range: [7, 16], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 16 } + }, + name: "Qualified" + }, + { + type: "Identifier", + range: [17, 19], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 19 } + }, + name: "Id" + }, + { + type: "Identifier", + range: [20, 24], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 24 } + }, + name: "Test" + } + ], + name: "Qualified.Id.Test" + }, + version: { + type: "QMLVersionLiteral", + range: [25, 28], + loc: { + start: { line: 1, column: 25 }, end: { line: 1, column: 28 } }, - qualifiedId: { - type: "QMLQualifiedID", - range: [7, 24], - loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 24 } - }, - parts: [ - "Qualified", - "Id", - "Test" - ], - raw: "Qualified.Id.Test" - }, - version: { - type: "QMLVersionLiteral", - range: [25, 28], - loc: { - start: { line: 1, column: 25 }, - end: { line: 1, column: 28 } - }, - value: 1, - major: 1, - minor: 0, - raw: "1.0" - } + value: 1, + major: 1, + minor: 0, + raw: "1.0" } } - ] - } - ], + } + ] + }, // -------------------------- Pragma -------------------------- - 'pragma Singleton': [ - { + 'pragma Singleton': { type: "QMLHeaderStatements", range: [0, 16], loc: { @@ -432,7 +473,7 @@ var testFixture = { start: { line: 1, column: 0 }, end: { line: 1, column: 16 } }, - identifier: { + id: { type: "Identifier", range: [7, 16], loc: { @@ -443,301 +484,579 @@ var testFixture = { } } ] - } - ], + }, - 'pragma Singleton\npragma Other': [ - { - type: "QMLHeaderStatements", - range: [0, 29], - loc: { - start: { line: 1, column: 0 }, - end: { line: 2, column: 12 } - }, - statements: [ - { - type: "QMLPragmaStatement", - range: [0, 16], + 'pragma Singleton\npragma Other': { + type: "QMLHeaderStatements", + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 12 } + }, + statements: [ + { + type: "QMLPragmaStatement", + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + }, + id: { + type: "Identifier", + range: [7, 16], loc: { - start: { line: 1, column: 0 }, + start: { line: 1, column: 7 }, end: { line: 1, column: 16 } }, - identifier: { - type: "Identifier", - range: [7, 16], - loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 16 } - }, - name: "Singleton" - } + name: "Singleton" + } + }, + { + type: "QMLPragmaStatement", + range: [17, 29], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 12 } }, - { - type: "QMLPragmaStatement", - range: [17, 29], + id: { + type: "Identifier", + range: [24, 29], loc: { - start: { line: 2, column: 0 }, + start: { line: 2, column: 7 }, end: { line: 2, column: 12 } }, - identifier: { - type: "Identifier", - range: [24, 29], - loc: { - start: { line: 2, column: 7 }, - end: { line: 2, column: 12 } - }, - name: "Other" - } + name: "Other" } - ] - } - ], + } + ] + }, - 'pragma Singleton;pragma Other': [ - { - type: "QMLHeaderStatements", - range: [0, 29], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 29 } - }, - statements: [ - { - type: "QMLPragmaStatement", - range: [0, 17], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 17 } - }, - identifier: { - type: "Identifier", - range: [7, 16], - loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 16 } - }, - name: "Singleton" - } + 'pragma Singleton;pragma Other': { + type: "QMLHeaderStatements", + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + }, + statements: [ + { + type: "QMLPragmaStatement", + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } }, - { - type: "QMLPragmaStatement", - range: [17, 29], + id: { + type: "Identifier", + range: [7, 16], loc: { - start: { line: 1, column: 17 }, + start: { line: 1, column: 7 }, + end: { line: 1, column: 16 } + }, + name: "Singleton" + } + }, + { + type: "QMLPragmaStatement", + range: [17, 29], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 29 } + }, + id: { + type: "Identifier", + range: [24, 29], + loc: { + start: { line: 1, column: 24 }, end: { line: 1, column: 29 } }, - identifier: { - type: "Identifier", - range: [24, 29], - loc: { - start: { line: 1, column: 24 }, - end: { line: 1, column: 29 } - }, - name: "Other" - } + name: "Other" } - ] - } - ], + } + ] + } }, // ---------------------- Object Literals --------------------- 'qml-object-literal': { - 'Window {}': [ - { - type: "QMLObjectLiteral", - range: [0, 9], + 'Window {}': { + type: "QMLObjectLiteral", + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 6], loc: { start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + parts: [{ + type: "Identifier", + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + name: "Window" + }], + name: "Window" + }, + block: { + type: "QMLMemberBlock", + range: [7, 9], + loc: { + start: { line: 1, column: 7 }, end: { line: 1, column: 9 } }, - qualifiedId: { - type: "QMLQualifiedID", - range: [0, 6], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 6 } - }, - parts: [ "Window" ], - raw: "Window" - }, - block: { - type: "QMLMemberBlock", - range: [7, 9], - loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 9 } - }, - members: [] - } + members: [] } - ], + }, - 'QtQuick.Window {}': [ - { - type: "QMLObjectLiteral", - range: [0, 17], + 'QtQuick.Window {}': { + type: "QMLObjectLiteral", + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 14], loc: { start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + }, + parts: [ + { + type: "Identifier", + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + }, + name: "QtQuick" + }, + { + type: "Identifier", + range: [8, 14], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 14 } + }, + name: "Window" + } + ], + name: "QtQuick.Window" + }, + block: { + type: "QMLMemberBlock", + range: [15, 17], + loc: { + start: { line: 1, column: 15 }, end: { line: 1, column: 17 } }, - qualifiedId: { - type: "QMLQualifiedID", - range: [0, 14], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 14 } - }, - parts: [ "QtQuick", "Window" ], - raw: "QtQuick.Window" - }, - block: { - type: "QMLMemberBlock", - range: [15, 17], - loc: { - start: { line: 1, column: 15 }, - end: { line: 1, column: 17 } - }, - members: [] - } + members: [] } - ], + }, - 'Window {Button {}}': [ - { - type: "QMLObjectLiteral", - range: [0, 18], + 'property {}': { + type: "QMLObjectLiteral", + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 8], loc: { start: { line: 1, column: 0 }, - end: { line: 1, column: 18 } + end: { line: 1, column: 8 } }, - qualifiedId: { - type: "QMLQualifiedID", + parts: [{ + type: "Identifier", + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + }, + name: "property" + }], + name: "property" + }, + block: { + type: "QMLMemberBlock", + range: [9, 11], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 11 } + }, + members: [] + } + }, + + 'readonly {}': { + type: "QMLObjectLiteral", + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + }, + parts: [{ + type: "Identifier", + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + }, + name: "readonly" + }], + name: "readonly" + }, + block: { + type: "QMLMemberBlock", + range: [9, 11], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 11 } + }, + members: [] + } + }, + + 'signal {}': { + type: "QMLObjectLiteral", + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + parts: [{ + type: "Identifier", range: [0, 6], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 6 } }, - parts: [ "Window" ], - raw: "Window" + name: "signal" + }], + name: "signal" + }, + block: { + type: "QMLMemberBlock", + range: [7, 9], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 9 } }, - block: { - type: "QMLMemberBlock", - range: [7, 18], + members: [] + } + }, + + 'alias {}': { + type: "QMLObjectLiteral", + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + }, + parts: [{ + type: "Identifier", + range: [0, 5], loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 18 } + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } }, - members: [ - { - type: "QMLObjectLiteral", - range: [8, 17], + name: "alias" + }], + name: "alias" + }, + block: { + type: "QMLMemberBlock", + range: [6, 8], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 8 } + }, + members: [] + } + }, + + 'list {}': { + type: "QMLObjectLiteral", + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + }, + parts: [{ + type: "Identifier", + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + }, + name: "list" + }], + name: "list" + }, + block: { + type: "QMLMemberBlock", + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + }, + members: [] + } + }, + + 'color {}': { + type: "QMLObjectLiteral", + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + }, + parts: [{ + type: "Identifier", + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + }, + name: "color" + }], + name: "color" + }, + block: { + type: "QMLMemberBlock", + range: [6, 8], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 8 } + }, + members: [] + } + }, + + 'real {}': { + type: "QMLObjectLiteral", + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + }, + parts: [{ + type: "Identifier", + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + }, + name: "real" + }], + name: "real" + }, + block: { + type: "QMLMemberBlock", + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + }, + members: [] + } + }, + + 'string {}': { + type: "QMLObjectLiteral", + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + parts: [{ + type: "Identifier", + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + name: "string" + }], + name: "string" + }, + block: { + type: "QMLMemberBlock", + range: [7, 9], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 9 } + }, + members: [] + } + }, + + 'url {}': { + type: "QMLObjectLiteral", + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + }, + parts: [{ + type: "Identifier", + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + }, + name: "url" + }], + name: "url" + }, + block: { + type: "QMLMemberBlock", + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + }, + members: [] + } + }, + + 'Window {Button {}}': { + type: "QMLObjectLiteral", + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + id: { + type: "QMLQualifiedID", + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + parts: [{ + type: "Identifier", + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + name: "Window" + }], + name: "Window" + }, + block: { + type: "QMLMemberBlock", + range: [7, 18], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 18 } + }, + members: [ + { + type: "QMLObjectLiteral", + range: [8, 17], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 17 } + }, + id: { + type: "QMLQualifiedID", + range: [8, 14], loc: { start: { line: 1, column: 8 }, - end: { line: 1, column: 17 } + end: { line: 1, column: 14 } }, - qualifiedId: { - type: "QMLQualifiedID", + parts: [{ + type: "Identifier", range: [8, 14], loc: { start: { line: 1, column: 8 }, end: { line: 1, column: 14 } }, - parts: [ "Button" ], - raw: "Button" - }, - block: { - type: "QMLMemberBlock", - range: [15, 17], - loc: { - start: { line: 1, column: 15 }, - end: { line: 1, column: 17 } - }, - members: [] - } - } - ] - } - } - ], - - 'import QtQuick 2.3;\nWindow {}': [ - { - type: "QMLHeaderStatements", - range: [0, 19], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 19 } - }, - statements: [ - { - type: "QMLImportStatement", - range: [0, 19], - loc: { - start: { line: 1, column: 0 }, - end: { line: 1, column: 19 } + name: "Button" + }], + name: "Button" }, - module: { - type: "QMLModule", - range: [7, 18], + block: { + type: "QMLMemberBlock", + range: [15, 17], loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 18 } + start: { line: 1, column: 15 }, + end: { line: 1, column: 17 } }, - qualifiedId: { - type: "QMLQualifiedID", - range: [7, 14], - loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 14 } - }, - parts: [ "QtQuick" ], - raw: "QtQuick" - }, - version: { - type: "QMLVersionLiteral", - range: [15, 18], - loc: { - start: { line: 1, column: 15 }, - end: { line: 1, column: 18 } - }, - value: 2.3, - major: 2, - minor: 3, - raw: "2.3" - } + members: [] } } ] - }, - { - type: "QMLObjectLiteral", - range: [20, 29], - loc: { - start: { line: 2, column: 0 }, - end: { line: 2, column: 9 } - }, - qualifiedId: { - type: "QMLQualifiedID", - range: [20, 26], - loc: { - start: { line: 2, column: 0 }, - end: { line: 2, column: 6 } - }, - parts: [ "Window" ], - raw: "Window" - }, - block: { - type: "QMLMemberBlock", - range: [27, 29], - loc: { - start: { line: 2, column: 7 }, - end: { line: 2, column: 9 } - }, - members: [] - } } - ], + } }, // ------------------ QML Root Object Members ----------------- @@ -754,17 +1073,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 15], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 15 } - }, - isPrimitive: true, - primitive: "var" - }, - identifier: { + kind: "var", + id: { type: "Identifier", range: [16, 17], loc: { @@ -773,23 +1083,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [17, 20], + init: { + type: "Literal", + range: [19, 20], loc: { - start: { line: 1, column: 17 }, + start: { line: 1, column: 19 }, end: { line: 1, column: 20 } }, - expr: { - type: "Literal", - range: [19, 20], - loc: { - start: { line: 1, column: 19 }, - end: { line: 1, column: 20 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -804,17 +1106,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 19], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 19 } - }, - isPrimitive: true, - primitive: "boolean" - }, - identifier: { + kind: "boolean", + id: { type: "Identifier", range: [20, 21], loc: { @@ -823,23 +1116,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [21, 24], + init: { + type: "Literal", + range: [23, 24], loc: { - start: { line: 1, column: 21 }, + start: { line: 1, column: 23 }, end: { line: 1, column: 24 } }, - expr: { - type: "Literal", - range: [23, 24], - loc: { - start: { line: 1, column: 23 }, - end: { line: 1, column: 24 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -854,17 +1139,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 18], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 18 } - }, - isPrimitive: true, - primitive: "double" - }, - identifier: { + kind: "double", + id: { type: "Identifier", range: [19, 20], loc: { @@ -873,23 +1149,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [20, 23], + init: { + type: "Literal", + range: [22, 23], loc: { - start: { line: 1, column: 20 }, + start: { line: 1, column: 22 }, end: { line: 1, column: 23 } }, - expr: { - type: "Literal", - range: [22, 23], - loc: { - start: { line: 1, column: 22 }, - end: { line: 1, column: 23 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -904,17 +1172,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 15], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 15 } - }, - isPrimitive: true, - primitive: "int" - }, - identifier: { + kind: "int", + id: { type: "Identifier", range: [16, 17], loc: { @@ -923,23 +1182,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [17, 20], + init: { + type: "Literal", + range: [19, 20], loc: { - start: { line: 1, column: 17 }, + start: { line: 1, column: 19 }, end: { line: 1, column: 20 } }, - expr: { - type: "Literal", - range: [19, 20], - loc: { - start: { line: 1, column: 19 }, - end: { line: 1, column: 20 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -954,17 +1205,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 16], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 16 } - }, - isPrimitive: true, - primitive: "list" - }, - identifier: { + kind: "list", + id: { type: "Identifier", range: [17, 18], loc: { @@ -973,23 +1215,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [18, 21], + init: { + type: "Literal", + range: [20, 21], loc: { - start: { line: 1, column: 18 }, + start: { line: 1, column: 20 }, end: { line: 1, column: 21 } }, - expr: { - type: "Literal", - range: [20, 21], - loc: { - start: { line: 1, column: 20 }, - end: { line: 1, column: 21 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -1004,17 +1238,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 17], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 17 } - }, - isPrimitive: true, - primitive: "color" - }, - identifier: { + kind: "color", + id: { type: "Identifier", range: [18, 19], loc: { @@ -1023,23 +1248,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [19, 22], + init: { + type: "Literal", + range: [21, 22], loc: { - start: { line: 1, column: 19 }, + start: { line: 1, column: 21 }, end: { line: 1, column: 22 } }, - expr: { - type: "Literal", - range: [21, 22], - loc: { - start: { line: 1, column: 21 }, - end: { line: 1, column: 22 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -1054,17 +1271,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 16], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 16 } - }, - isPrimitive: true, - primitive: "real" - }, - identifier: { + kind: "real", + id: { type: "Identifier", range: [17, 18], loc: { @@ -1073,23 +1281,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [18, 21], + init: { + type: "Literal", + range: [20, 21], loc: { - start: { line: 1, column: 18 }, + start: { line: 1, column: 20 }, end: { line: 1, column: 21 } }, - expr: { - type: "Literal", - range: [20, 21], - loc: { - start: { line: 1, column: 20 }, - end: { line: 1, column: 21 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -1104,17 +1304,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 18], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 18 } - }, - isPrimitive: true, - primitive: "string" - }, - identifier: { + kind: "string", + id: { type: "Identifier", range: [19, 20], loc: { @@ -1123,23 +1314,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [20, 23], + init: { + type: "Literal", + range: [22, 23], loc: { - start: { line: 1, column: 20 }, + start: { line: 1, column: 22 }, end: { line: 1, column: 23 } }, - expr: { - type: "Literal", - range: [22, 23], - loc: { - start: { line: 1, column: 22 }, - end: { line: 1, column: 23 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -1154,17 +1337,8 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", - range: [12, 15], - loc: { - start: { line: 1, column: 12 }, - end: { line: 1, column: 15 } - }, - isPrimitive: true, - primitive: "url" - }, - identifier: { + kind: "url", + id: { type: "Identifier", range: [16, 17], loc: { @@ -1173,23 +1347,15 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [17, 20], + init: { + type: "Literal", + range: [19, 20], loc: { - start: { line: 1, column: 17 }, + start: { line: 1, column: 19 }, end: { line: 1, column: 20 } }, - expr: { - type: "Literal", - range: [19, 20], - loc: { - start: { line: 1, column: 19 }, - end: { line: 1, column: 20 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -1204,26 +1370,25 @@ var testFixture = { }, default: false, readonly: false, - typeInfo: { - type: "QMLType", + kind: { + type: "QMLQualifiedID", range: [12, 20], loc: { start: { line: 1, column: 12 }, end: { line: 1, column: 20 } }, - isPrimitive: false, - qualifiedId: { - type: "QMLQualifiedID", + parts: [{ + type: "Identifier", range: [12, 20], loc: { start: { line: 1, column: 12 }, end: { line: 1, column: 20 } }, - parts: [ "QtObject" ], - raw: "QtObject" - } + name: "QtObject" + }], + name: "QtObject" }, - identifier: { + id: { type: "Identifier", range: [21, 22], loc: { @@ -1232,30 +1397,22 @@ var testFixture = { }, name: "w" }, - binding: { - type: "QMLBinding", - range: [22, 25], + init: { + type: "Literal", + range: [24, 25], loc: { - start: { line: 1, column: 22 }, + start: { line: 1, column: 24 }, end: { line: 1, column: 25 } }, - expr: { - type: "Literal", - range: [24, 25], - loc: { - start: { line: 1, column: 24 }, - end: { line: 1, column: 25 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], 'a{ property alias c: color }': [ { - type: "QMLPropertyAlias", + type: "QMLPropertyDeclaration", range: [3, 26], loc: { start: { line: 1, column: 3 }, @@ -1263,7 +1420,8 @@ var testFixture = { }, default: false, readonly: false, - identifier: { + kind: "alias", + id: { type: "Identifier", range: [18, 19], loc: { @@ -1272,22 +1430,14 @@ var testFixture = { }, name: "c" }, - binding: { - type: "QMLBinding", - range: [19, 26], + init: { + type: "Identifier", + range: [21, 26], loc: { - start: { line: 1, column: 19 }, + start: { line: 1, column: 21 }, end: { line: 1, column: 26 } }, - expr: { - type: "Identifier", - range: [21, 26], - loc: { - start: { line: 1, column: 21 }, - end: { line: 1, column: 26 } - }, - name: "color" - } + name: "color" } } ], @@ -1298,78 +1448,98 @@ var testFixture = { // --------------------- Property Bindings -------------------- 'a{ w: 3 }': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [3, 7], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 7 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [3, 4], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 4 } }, - parts: [ "w" ], - raw: "w" + parts: [{ + type: "Identifier", + range: [3, 4], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 4 } + }, + name: "w" + }], + name: "w" }, - binding: { - type: "QMLBinding", - range: [4, 7], + expr: { + type: "Literal", + range: [6, 7], loc: { - start: { line: 1, column: 4 }, + start: { line: 1, column: 6 }, end: { line: 1, column: 7 } }, - expr: { - type: "Literal", - range: [6, 7], - loc: { - start: { line: 1, column: 6 }, - end: { line: 1, column: 7 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], 'a{ x.y.z: 3 }': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [3, 11], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 11 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [3, 8], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 8 } }, - parts: [ "x", "y", "z" ], - raw: "x.y.z" + parts: [ + { + type: "Identifier", + range: [3, 4], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 4 } + }, + name: "x" + }, + { + type: "Identifier", + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + }, + name: "y" + }, + { + type: "Identifier", + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + }, + name: "z" + } + ], + name: "x.y.z" }, - binding: { - type: "QMLBinding", - range: [8, 11], + expr: { + type: "Literal", + range: [10, 11], loc: { - start: { line: 1, column: 8 }, + start: { line: 1, column: 10 }, end: { line: 1, column: 11 } }, - expr: { - type: "Literal", - range: [10, 11], - loc: { - start: { line: 1, column: 10 }, - end: { line: 1, column: 11 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], @@ -1388,315 +1558,549 @@ var testFixture = { 'a{ alias: 3 }': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [3, 11], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 11 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [3, 8], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 8 } }, - parts: [ "alias" ], - raw: "alias" + parts: [{ + type: "Identifier", + range: [3, 8], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 8 } + }, + name: "alias" + }], + name: "alias" }, - binding: { - type: "QMLBinding", - range: [8, 11], + expr: { + type: "Literal", + range: [10, 11], loc: { - start: { line: 1, column: 8 }, + start: { line: 1, column: 10 }, end: { line: 1, column: 11 } }, - expr: { - type: "Literal", - range: [10, 11], - loc: { - start: { line: 1, column: 10 }, - end: { line: 1, column: 11 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], 'a{ list: 3 }': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [3, 10], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 10 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [3, 7], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 7 } }, - parts: [ "list" ], - raw: "list" + parts: [{ + type: "Identifier", + range: [3, 7], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 7 } + }, + name: "list" + }], + name: "list" }, - binding: { - type: "QMLBinding", - range: [7, 10], + expr: { + type: "Literal", + range: [9, 10], loc: { - start: { line: 1, column: 7 }, + start: { line: 1, column: 9 }, end: { line: 1, column: 10 } }, - expr: { - type: "Literal", - range: [9, 10], - loc: { - start: { line: 1, column: 9 }, - end: { line: 1, column: 10 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], - // TODO: solve ambiguity to properly pass these 3 tests - 'a{ property: 3 }': "Unexpected token (1:11)", - 'a{ readonly: 3 }': "Unexpected token (1:11)", - 'a{ signal: 3 }': "Unexpected token (1:9)", - - 'a{ color: 3 }': [ + 'a{ property: 3 }': [ { - type: "QMLProperty", - range: [3, 11], + type: "QMLPropertyBinding", + range: [3, 14], loc: { start: { line: 1, column: 3 }, - end: { line: 1, column: 11 } + end: { line: 1, column: 14 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", - range: [3, 8], + range: [3, 11], loc: { start: { line: 1, column: 3 }, - end: { line: 1, column: 8 } - }, - parts: [ "color" ], - raw: "color" - }, - binding: { - type: "QMLBinding", - range: [8, 11], - loc: { - start: { line: 1, column: 8 }, end: { line: 1, column: 11 } }, - expr: { - type: "Literal", - range: [10, 11], + parts: [{ + type: "Identifier", + range: [3, 11], loc: { - start: { line: 1, column: 10 }, + start: { line: 1, column: 3 }, end: { line: 1, column: 11 } }, - value: 3, - raw: "3" - } + name: "property" + }], + name: "property" + }, + expr: { + type: "Literal", + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + }, + value: 3, + raw: "3" } } ], - 'a{ real: 3 }': [ + 'a{ readonly: 3 }': [ { - type: "QMLProperty", - range: [3, 10], + type: "QMLPropertyBinding", + range: [3, 14], loc: { start: { line: 1, column: 3 }, - end: { line: 1, column: 10 } + end: { line: 1, column: 14 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", - range: [3, 7], + range: [3, 11], loc: { start: { line: 1, column: 3 }, - end: { line: 1, column: 7 } + end: { line: 1, column: 11 } }, - parts: [ "real" ], - raw: "real" - }, - binding: { - type: "QMLBinding", - range: [7, 10], - loc: { - start: { line: 1, column: 7 }, - end: { line: 1, column: 10 } - }, - expr: { - type: "Literal", - range: [9, 10], + parts: [{ + type: "Identifier", + range: [3, 11], loc: { - start: { line: 1, column: 9 }, - end: { line: 1, column: 10 } + start: { line: 1, column: 3 }, + end: { line: 1, column: 11 } }, - value: 3, - raw: "3" - } + name: "readonly" + }], + name: "readonly" + }, + expr: { + type: "Literal", + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + }, + value: 3, + raw: "3" } } ], - 'a{ string: 3 }': [ + 'a{ signal: 3 }': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [3, 12], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 12 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [3, 9], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 9 } }, - parts: [ "string" ], - raw: "string" + parts: [{ + type: "Identifier", + range: [3, 9], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 9 } + }, + name: "signal" + }], + name: "signal" }, - binding: { - type: "QMLBinding", - range: [9, 12], + expr: { + type: "Literal", + range: [11, 12], loc: { - start: { line: 1, column: 9 }, + start: { line: 1, column: 11 }, end: { line: 1, column: 12 } }, - expr: { - type: "Literal", - range: [11, 12], + value: 3, + raw: "3" + } + } + ], + + 'a{ color: 3 }': [ + { + type: "QMLPropertyBinding", + range: [3, 11], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 11 } + }, + id: { + type: "QMLQualifiedID", + range: [3, 8], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 8 } + }, + parts: [{ + type: "Identifier", + range: [3, 8], loc: { - start: { line: 1, column: 11 }, - end: { line: 1, column: 12 } + start: { line: 1, column: 3 }, + end: { line: 1, column: 8 } }, - value: 3, - raw: "3" - } + name: "color" + }], + name: "color" + }, + expr: { + type: "Literal", + range: [10, 11], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 11 } + }, + value: 3, + raw: "3" + } + } + ], + + 'a{ real: 3 }': [ + { + type: "QMLPropertyBinding", + range: [3, 10], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 10 } + }, + id: { + type: "QMLQualifiedID", + range: [3, 7], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 7 } + }, + parts: [{ + type: "Identifier", + range: [3, 7], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 7 } + }, + name: "real" + }], + name: "real" + }, + expr: { + type: "Literal", + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + }, + value: 3, + raw: "3" + } + } + ], + + 'a{ string: 3 }': [ + { + type: "QMLPropertyBinding", + range: [3, 12], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 12 } + }, + id: { + type: "QMLQualifiedID", + range: [3, 9], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 9 } + }, + parts: [{ + type: "Identifier", + range: [3, 9], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 9 } + }, + name: "string" + }], + name: "string" + }, + expr: { + type: "Literal", + range: [11, 12], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 12 } + }, + value: 3, + raw: "3" } } ], 'a{ url: 3 }': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [3, 9], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 9 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [3, 6], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 6 } }, - parts: [ "url" ], - raw: "url" + parts: [{ + type: "Identifier", + range: [3, 6], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 6 } + }, + name: "url" + }], + name: "url" }, - binding: { - type: "QMLBinding", - range: [6, 9], + expr: { + type: "Literal", + range: [8, 9], loc: { - start: { line: 1, column: 6 }, + start: { line: 1, column: 8 }, end: { line: 1, column: 9 } }, - expr: { - type: "Literal", - range: [8, 9], - loc: { - start: { line: 1, column: 8 }, - end: { line: 1, column: 9 } - }, - value: 3, - raw: "3" - } + value: 3, + raw: "3" } } ], 'a{ onClicked: Qt.quit(0) }': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [3, 24], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 24 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [3, 12], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 12 } }, - parts: [ "onClicked" ], - raw: "onClicked" + parts: [{ + type: "Identifier", + range: [3, 12], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 12 } + }, + name: "onClicked" + }], + name: "onClicked" }, - binding: { - type: "QMLBinding", - range: [12, 24], + expr: { + type: "CallExpression", + range: [14, 24], loc: { - start: { line: 1, column: 12 }, + start: { line: 1, column: 14 }, end: { line: 1, column: 24 } }, - expr: { - type: "CallExpression", - range: [14, 24], + callee: { + type: "MemberExpression", + range: [14, 21], loc: { start: { line: 1, column: 14 }, - end: { line: 1, column: 24 } + end: { line: 1, column: 21 } }, - callee: { - type: "MemberExpression", - range: [14, 21], + object: { + type: "Identifier", + range: [14, 16], loc: { start: { line: 1, column: 14 }, + end: { line: 1, column: 16 } + }, + name: "Qt" + }, + property: { + type: "Identifier", + range: [17, 21], + loc: { + start: { line: 1, column: 17 }, end: { line: 1, column: 21 } }, - object: { - type: "Identifier", - range: [14, 16], - loc: { - start: { line: 1, column: 14 }, - end: { line: 1, column: 16 } - }, - name: "Qt" - }, - property: { - type: "Identifier", - range: [17, 21], - loc: { - start: { line: 1, column: 17 }, - end: { line: 1, column: 21 } - }, - name: "quit" - }, - computed: false + name: "quit" }, - arguments: [ - { - type: "Literal", - range: [22, 23], - loc: { - start: { line: 1, column: 22 }, - end: { line: 1, column: 23 } - }, - value: 0, - raw: "0" - } - ] - } + computed: false + }, + arguments: [ + { + type: "Literal", + range: [22, 23], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 23 } + }, + value: 0, + raw: "0" + } + ] + } + } + ], + + 'a{ property {} }': [ + { + type: "QMLObjectLiteral", + range: [3, 14], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 14 } + }, + id: { + type: "QMLQualifiedID", + range: [3, 11], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 11 } + }, + parts: [ + { + type: "Identifier", + range: [3, 11], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 11 } + }, + name: "property" + } + ], + name: "property" + }, + block: { + type: "QMLMemberBlock", + range: [12, 14], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 14 } + }, + members: [] + } + } + ], + + 'a{ readonly {} }': [ + { + type: "QMLObjectLiteral", + range: [3, 14], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 14 } + }, + default: false, + readonly: false, + id: { + type: "QMLQualifiedID", + range: [3, 11], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 11 } + }, + parts: [ + { + type: "Identifier", + range: [3, 11], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 11 } + }, + name: "readonly" + } + ], + name: "readonly" + }, + block: { + type: "QMLMemberBlock", + range: [12, 14], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 14 } + }, + members: [] + } + } + ], + + 'a{ signal {} }': [ + { + type: "QMLObjectLiteral", + range: [3, 12], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 12 } + }, + id: { + type: "QMLQualifiedID", + range: [3, 9], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 9 } + }, + parts: [ + { + type: "Identifier", + range: [3, 9], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 9 } + }, + name: "signal" + } + ], + name: "signal" + }, + block: { + type: "QMLMemberBlock", + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + }, + members: [] } } ], @@ -1704,380 +2108,380 @@ var testFixture = { // ------------------- Contextual Keywords -------------------- 'a{b:pragma}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 10], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 10 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 10], + expr: { + type: "Identifier", + range: [4, 10], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 10 } }, - expr: { - type: "Identifier", - range: [4, 10], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 10 } - }, - name: "pragma" - } + name: "pragma" } } ], 'a{b:property}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 12], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 12 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" - }, - binding: { - type: "QMLBinding", - range: [3, 12], - loc: { - start: { line: 1, column: 3 }, - end: { line: 1, column: 12 } - }, - expr: { + parts: [{ type: "Identifier", - range: [4, 12], + range: [2, 3], loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 12 } + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } }, - name: "property" - } + name: "b" + }], + name: "b" + }, + expr: { + type: "Identifier", + range: [4, 12], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 12 } + }, + name: "property" } } ], 'a{b:readonly}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 12], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 12 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 12], + expr: { + type: "Identifier", + range: [4, 12], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 12 } }, - expr: { - type: "Identifier", - range: [4, 12], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 12 } - }, - name: "readonly" - } + name: "readonly" } } ], 'a{b:signal}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 10], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 10 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 10], + expr: { + type: "Identifier", + range: [4, 10], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 10 } }, - expr: { - type: "Identifier", - range: [4, 10], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 10 } - }, - name: "signal" - } + name: "signal" } } ], 'a{b:alias}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 9], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 9 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 9], + expr: { + type: "Identifier", + range: [4, 9], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 9 } }, - expr: { - type: "Identifier", - range: [4, 9], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 9 } - }, - name: "alias" - } + name: "alias" } } ], 'a{b:list}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 8], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 8 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 8], + expr: { + type: "Identifier", + range: [4, 8], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 8 } }, - expr: { - type: "Identifier", - range: [4, 8], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 8 } - }, - name: "list" - } + name: "list" } } ], 'a{b:color}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 9], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 9 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 9], + expr: { + type: "Identifier", + range: [4, 9], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 9 } }, - expr: { - type: "Identifier", - range: [4, 9], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 9 } - }, - name: "color" - } + name: "color" } } ], 'a{b:real}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 8], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 8 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 8], + expr: { + type: "Identifier", + range: [4, 8], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 8 } }, - expr: { - type: "Identifier", - range: [4, 8], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 8 } - }, - name: "real" - } + name: "real" } } ], 'a{b:string}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 10], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 10 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 10], + expr: { + type: "Identifier", + range: [4, 10], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 10 } }, - expr: { - type: "Identifier", - range: [4, 10], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 10 } - }, - name: "string" - } + name: "string" } } ], 'a{b:url}': [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [2, 7], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 7 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [2, 3], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 3 } }, - parts: [ "b" ], - raw: "b" + parts: [{ + type: "Identifier", + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + }, + name: "b" + }], + name: "b" }, - binding: { - type: "QMLBinding", - range: [3, 7], + expr: { + type: "Identifier", + range: [4, 7], loc: { - start: { line: 1, column: 3 }, + start: { line: 1, column: 4 }, end: { line: 1, column: 7 } }, - expr: { - type: "Identifier", - range: [4, 7], - loc: { - start: { line: 1, column: 4 }, - end: { line: 1, column: 7 } - }, - name: "url" - } + name: "url" } } ], @@ -2091,7 +2495,7 @@ var testFixture = { start: { line: 1, column: 3 }, end: { line: 1, column: 11 } }, - identifier: { + id: { type: "Identifier", range: [10, 11], loc: { @@ -2100,7 +2504,7 @@ var testFixture = { }, name: "b" }, - parameters: [] + params: [] } ], @@ -2112,7 +2516,7 @@ var testFixture = { start: { line: 1, column: 3 }, end: { line: 1, column: 14 } }, - identifier: { + id: { type: "Identifier", range: [10, 11], loc: { @@ -2121,7 +2525,7 @@ var testFixture = { }, name: "b" }, - parameters: [] + params: [] } ], @@ -2133,7 +2537,7 @@ var testFixture = { start: { line: 1, column: 3 }, end: { line: 1, column: 24 } }, - identifier: { + id: { type: "Identifier", range: [10, 11], loc: { @@ -2142,9 +2546,15 @@ var testFixture = { }, name: "b" }, - parameters: [ + params: [ { - type: { + type: "QMLParameter", + range: [ 13, 23 ], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 23 } + }, + kind: { type: "Identifier", range: [13, 17], loc: { @@ -2153,14 +2563,7 @@ var testFixture = { }, name: "type" }, - range: [ 13, 0 ], - loc: { - start: { - line: 1, - column: 13 - } - }, - identifier: { + id: { type: "Identifier", range: [18, 23], loc: { @@ -2182,7 +2585,7 @@ var testFixture = { start: { line: 1, column: 3 }, end: { line: 1, column: 54 } }, - identifier: { + id: { type: "Identifier", range: [10, 11], loc: { @@ -2191,9 +2594,15 @@ var testFixture = { }, name: "b" }, - parameters: [ + params: [ { - type: { + type: "QMLParameter", + range: [ 13, 25 ], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 25 } + }, + kind: { type: "Identifier", range: [13, 18], loc: { @@ -2202,14 +2611,7 @@ var testFixture = { }, name: "type1" }, - loc: { - start: { - line: 1, - column: 13 - } - }, - range: [ 13, 0 ], - identifier: { + id: { type: "Identifier", range: [19, 25], loc: { @@ -2220,7 +2622,13 @@ var testFixture = { } }, { - type: { + type: "QMLParameter", + range: [ 27, 39 ], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 39 } + }, + kind: { type: "Identifier", range: [27, 32], loc: { @@ -2229,17 +2637,7 @@ var testFixture = { }, name: "type2" }, - loc: { - start: { - line: 1, - column: 27 - } - }, - range: [ - 27, - 0 - ], - identifier: { + id: { type: "Identifier", range: [33, 39], loc: { @@ -2250,7 +2648,13 @@ var testFixture = { } }, { - type: { + type: "QMLParameter", + range: [ 41, 53 ], + loc: { + start: { line: 1, column: 41 }, + end: { line: 1, column: 53 } + }, + kind: { type: "Identifier", range: [41, 46], loc: { @@ -2259,17 +2663,7 @@ var testFixture = { }, name: "type3" }, - loc: { - start: { - line: 1, - column: 41 - } - }, - range: [ - 41, - 0 - ], - identifier: { + id: { type: "Identifier", range: [47, 53], loc: { @@ -2282,6 +2676,82 @@ var testFixture = { ] } ], + + 'a{ id: test }': [ + { + type: "QMLPropertyBinding", + range: [3, 11], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 11 } + }, + id: { + type: "QMLQualifiedID", + range: [3, 5], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 5 } + }, + parts: [{ + type: "Identifier", + range: [3, 5], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 5 } + }, + name: "id" + }], + name: "id" + }, + expr: { + type: "Identifier", + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + }, + name: "test" + } + } + ], + + 'a{ id: test; }': [ + { + type: "QMLPropertyBinding", + range: [3, 12], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 12 } + }, + id: { + type: "QMLQualifiedID", + range: [3, 5], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 5 } + }, + parts: [{ + type: "Identifier", + range: [3, 5], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 5 } + }, + name: "id" + }], + name: "id" + }, + expr: { + type: "Identifier", + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + }, + name: "test" + } + } + ] }, // ----------------------- QML Examples ----------------------- @@ -2289,8 +2759,9 @@ var testFixture = { // Hello World 'import QtQuick 2.3\nimport QtQuick.Window 2.2\n\tWindow {\n\tvisible: true\n\n\tMouseArea {\n\t\tanchors.fill: parent\n\t\tonClicked: {\n\t\t\tQt.quit();\n\t\t}\n\t}\n\t\tText {\n\t\t\ttext: qsTr("Hello World")\n\t\t\tanchors.centerIn: parent\n\t}\n}': - [ - { + { + type: "Program", + headerStatements: { type: "QMLHeaderStatements", range: [0, 44], loc: { @@ -2312,15 +2783,25 @@ var testFixture = { start: { line: 1, column: 7 }, end: { line: 1, column: 18 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [7, 14], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 14 } }, - parts: [ "QtQuick" ], - raw: "QtQuick" + parts: [ + { + type: "Identifier", + range: [7, 14], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 14 } + }, + name: "QtQuick" + } + ], + name: "QtQuick" }, version: { type: "QMLVersionLiteral", @@ -2350,15 +2831,34 @@ var testFixture = { start: { line: 2, column: 7 }, end: { line: 2, column: 25 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [26, 40], loc: { start: { line: 2, column: 7 }, end: { line: 2, column: 21 } }, - parts: [ "QtQuick", "Window" ], - raw: "QtQuick.Window" + parts: [ + { + type: "Identifier", + range: [26, 33], + loc: { + start: { line: 2, column: 7 }, + end: { line: 2, column: 14 } + }, + name: "QtQuick" + }, + { + type: "Identifier", + range: [34, 40], + loc: { + start: { line: 2, column: 15 }, + end: { line: 2, column: 21 } + }, + name: "Window" + } + ], + name: "QtQuick.Window" }, version: { type: "QMLVersionLiteral", @@ -2376,22 +2876,32 @@ var testFixture = { } ] }, - { + rootObject: { type: "QMLObjectLiteral", range: [46, 213], loc: { start: { line: 3, column: 1 }, end: { line: 16, column: 1 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [46, 52], loc: { start: { line: 3, column: 1 }, end: { line: 3, column: 7 } }, - parts: [ "Window" ], - raw: "Window" + parts: [ + { + type: "Identifier", + range: [46, 52], + loc: { + start: { line: 3, column: 1 }, + end: { line: 3, column: 7 } + }, + name: "Window" + } + ], + name: "Window" }, block: { type: "QMLMemberBlock", @@ -2402,39 +2912,41 @@ var testFixture = { }, members: [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [56, 69], loc: { start: { line: 4, column: 1 }, end: { line: 4, column: 14 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [56, 63], loc: { start: { line: 4, column: 1 }, end: { line: 4, column: 8 } }, - parts: [ "visible" ], - raw: "visible" + parts: [ + { + type: "Identifier", + range: [56, 63], + loc: { + start: { line: 4, column: 1 }, + end: { line: 4, column: 8 } + }, + name: "visible" + } + ], + name: "visible" }, - binding: { - type: "QMLBinding", - range: [63, 69], + expr: { + type: "Literal", + range: [65, 69], loc: { - start: { line: 4, column: 8 }, + start: { line: 4, column: 10 }, end: { line: 4, column: 14 } }, - expr: { - type: "Literal", - range: [65, 69], - loc: { - start: { line: 4, column: 10 }, - end: { line: 4, column: 14 } - }, - value: true, - raw: "true" - } + value: true, + raw: "true" } }, { @@ -2444,15 +2956,25 @@ var testFixture = { start: { line: 6, column: 1 }, end: { line: 11, column: 2 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [72, 81], loc: { start: { line: 6, column: 1 }, end: { line: 6, column: 10 } }, - parts: [ "MouseArea" ], - raw: "MouseArea" + parts: [ + { + type: "Identifier", + range: [72, 81], + loc: { + start: { line: 6, column: 1 }, + end: { line: 6, column: 10 } + }, + name: "MouseArea" + } + ], + name: "MouseArea" }, block: { type: "QMLMemberBlock", @@ -2463,118 +2985,131 @@ var testFixture = { }, members: [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [86, 106], loc: { start: { line: 7, column: 2 }, end: { line: 7, column: 22 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [86, 98], loc: { start: { line: 7, column: 2 }, end: { line: 7, column: 14 } }, - parts: [ "anchors", "fill" ], - raw: "anchors.fill" + parts: [ + { + type: "Identifier", + range: [86, 93], + loc: { + start: { line: 7, column: 2 }, + end: { line: 7, column: 9 } + }, + name: "anchors" + }, + { + type: "Identifier", + range: [94, 98], + loc: { + start: { line: 7, column: 10 }, + end: { line: 7, column: 14 } + }, + name: "fill" + } + ], + name: "anchors.fill" }, - binding: { - type: "QMLBinding", - range: [98, 106], + expr: { + type: "Identifier", + range: [100, 106], loc: { - start: { line: 7, column: 14 }, + start: { line: 7, column: 16 }, end: { line: 7, column: 22 } }, - expr: { - type: "Identifier", - range: [100, 106], - loc: { - start: { line: 7, column: 16 }, - end: { line: 7, column: 22 } - }, - name: "parent" - } + name: "parent" } }, { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [109, 139], loc: { start: { line: 8, column: 2 }, end: { line: 10, column: 3 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [109, 118], loc: { start: { line: 8, column: 2 }, end: { line: 8, column: 11 } }, - parts: [ "onClicked" ], - raw: "onClicked" + parts: [ + { + type: "Identifier", + range: [109, 118], + loc: { + start: { line: 8, column: 2 }, + end: { line: 8, column: 11 } + }, + name: "onClicked" + } + ], + name: "onClicked" }, - binding: { - type: "QMLBinding", - range: [118, 139], + expr: { + type: "QMLStatementBlock", + range: [120, 139], loc: { - start: { line: 8, column: 11 }, + start: { line: 8, column: 13 }, end: { line: 10, column: 3 } }, - block: { - type: "QMLStatementBlock", - range: [120, 139], - loc: { - start: { line: 8, column: 13 }, - end: { line: 10, column: 3 } - }, - statements: [ - { - type: "ExpressionStatement", - range: [125, 135], + statements: [ + { + type: "ExpressionStatement", + range: [125, 135], + loc: { + start: { line: 9, column: 3 }, + end: { line: 9, column: 13 } + }, + expression: { + type: "CallExpression", + range: [125, 134], loc: { start: { line: 9, column: 3 }, - end: { line: 9, column: 13 } + end: { line: 9, column: 12 } }, - expression: { - type: "CallExpression", - range: [125, 134], + callee: { + type: "MemberExpression", + range: [125, 132], loc: { start: { line: 9, column: 3 }, - end: { line: 9, column: 12 } + end: { line: 9, column: 10 } }, - callee: { - type: "MemberExpression", - range: [125, 132], + object: { + type: "Identifier", + range: [125, 127], loc: { start: { line: 9, column: 3 }, + end: { line: 9, column: 5 } + }, + name: "Qt" + }, + property: { + type: "Identifier", + range: [128, 132], + loc: { + start: { line: 9, column: 6 }, end: { line: 9, column: 10 } }, - object: { - type: "Identifier", - range: [125, 127], - loc: { - start: { line: 9, column: 3 }, - end: { line: 9, column: 5 } - }, - name: "Qt" - }, - property: { - type: "Identifier", - range: [128, 132], - loc: { - start: { line: 9, column: 6 }, - end: { line: 9, column: 10 } - }, - name: "quit" - }, - computed: false + name: "quit" }, - arguments: [] - } + computed: false + }, + arguments: [] } - ] - } + } + ] } } ] @@ -2587,15 +3122,25 @@ var testFixture = { start: { line: 12, column: 2 }, end: { line: 15, column: 2 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [145, 149], loc: { start: { line: 12, column: 2 }, end: { line: 12, column: 6 } }, - parts: [ "Text" ], - raw: "Text" + parts: [ + { + type: "Identifier", + range: [145, 149], + loc: { + start: { line: 12, column: 2 }, + end: { line: 12, column: 6 } + }, + name: "Text" + } + ], + name: "Text" }, block: { type: "QMLMemberBlock", @@ -2606,93 +3151,106 @@ var testFixture = { }, members: [ { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [155, 180], loc: { start: { line: 13, column: 3 }, end: { line: 13, column: 28 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [155, 159], loc: { start: { line: 13, column: 3 }, end: { line: 13, column: 7 } }, - parts: [ "text" ], - raw: "text" + parts: [ + { + type: "Identifier", + range: [155, 159], + loc: { + start: { line: 13, column: 3 }, + end: { line: 13, column: 7 } + }, + name: "text" + } + ], + name: "text" }, - binding: { - type: "QMLBinding", - range: [159, 180], + expr: { + type: "CallExpression", + range: [161, 180], loc: { - start: { line: 13, column: 7 }, + start: { line: 13, column: 9 }, end: { line: 13, column: 28 } }, - expr: { - type: "CallExpression", - range: [161, 180], + callee: { + type: "Identifier", + range: [161, 165], loc: { start: { line: 13, column: 9 }, - end: { line: 13, column: 28 } + end: { line: 13, column: 13 } }, - callee: { - type: "Identifier", - range: [161, 165], + name: "qsTr" + }, + arguments: [ + { + type: "Literal", + range: [166, 179], loc: { - start: { line: 13, column: 9 }, - end: { line: 13, column: 13 } + start: { line: 13, column: 14 }, + end: { line: 13, column: 27 } }, - name: "qsTr" - }, - arguments: [ - { - type: "Literal", - range: [166, 179], - loc: { - start: { line: 13, column: 14 }, - end: { line: 13, column: 27 } - }, - value: "Hello World", - raw: "\"Hello World\"" - } - ] - } + value: "Hello World", + raw: "\"Hello World\"" + } + ] } }, { - type: "QMLProperty", + type: "QMLPropertyBinding", range: [184, 208], loc: { start: { line: 14, column: 3 }, end: { line: 14, column: 27 } }, - qualifiedId: { + id: { type: "QMLQualifiedID", range: [184, 200], loc: { start: { line: 14, column: 3 }, end: { line: 14, column: 19 } }, - parts: [ "anchors", "centerIn" ], - raw: "anchors.centerIn" + parts: [ + { + type: "Identifier", + range: [184, 191], + loc: { + start: { line: 14, column: 3 }, + end: { line: 14, column: 10 } + }, + name: "anchors" + }, + { + type: "Identifier", + range: [192, 200], + loc: { + start: { line: 14, column: 11 }, + end: { line: 14, column: 19 } + }, + name: "centerIn" + } + ], + name: "anchors.centerIn" }, - binding: { - type: "QMLBinding", - range: [200, 208], + expr: { + type: "Identifier", + range: [202, 208], loc: { - start: { line: 14, column: 19 }, + start: { line: 14, column: 21 }, end: { line: 14, column: 27 } }, - expr: { - type: "Identifier", - range: [202, 208], - loc: { - start: { line: 14, column: 21 }, - end: { line: 14, column: 27 } - }, - name: "parent" - } + name: "parent" } } ] @@ -2701,7 +3259,7 @@ var testFixture = { ] } } - ] + } } }; @@ -2723,18 +3281,45 @@ for (var heading in testFixture) { } else { // Expected test result holds an AST switch (heading) { + case 'qml-header-statements': + test(code, { + type: "Program", + headerStatements: tst[code], + rootObject: null + }, { + ecmaVersion: 6, + locations: true, + ranges: true, + }); + break; + case 'qml-object-literal': + test(code, { + type: "Program", + headerStatements: { + type: "QMLHeaderStatements", + range: [0, 0], + }, + rootObject: tst[code] + }, { + ecmaVersion: 6, + locations: true, + ranges: true, + }); + break; case 'qml-root-obj-members': test(code, { type: "Program", - body: [ - { - type: "QMLObjectLiteral", - block: { - type: "QMLMemberBlock", - members: tst[code] - } + headerStatements: { + type: "QMLHeaderStatements", + range: [0, 0], + }, + rootObject: { + type: "QMLObjectLiteral", + block: { + type: "QMLMemberBlock", + members: tst[code] } - ] + } }, { ecmaVersion: 6, locations: true, @@ -2742,10 +3327,7 @@ for (var heading in testFixture) { }); break; default: - test(code, { - type: "Program", - body: tst[code] - }, { + test(code, tst[code], { ecmaVersion: 6, locations: true, ranges: true, diff --git a/qt/org.eclipse.cdt.qt.core/acorn-qml/walk/walk.js b/qt/org.eclipse.cdt.qt.core/acorn-qml/walk/walk.js index a753f3e3f07..b048b580b7a 100644 --- a/qt/org.eclipse.cdt.qt.core/acorn-qml/walk/walk.js +++ b/qt/org.eclipse.cdt.qt.core/acorn-qml/walk/walk.js @@ -10,67 +10,52 @@ *******************************************************************************/ 'use strict'; -(function(mod) { +(function (mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS return mod(require("acorn/walk")); if (typeof define == "function" && define.amd) // AMD - return define([ "acorn/dist/walk" ], mod); + return define(["acorn/dist/walk"], mod); mod(acorn.walk); // Plain browser env -})(function(walk) { - function skipThrough(node, st, c) { c(node, st) } - function ignore(node, st, c) {} +})(function (walk) { + function skipThrough(node, st, c) { + c(node, st) + } - var base = walk.base; - base["Program"] = function(node, st, c) { - for (var i = 0; i < node.body.length; i++) { - var nodeBody = node.body[i]; - if (node.body[i].type === "QMLObjectLiteral") { - c(node.body[i], st, "QMLRootObject"); - } else { - c(node.body[i], st); - } - } - } - base["QMLHeaderStatements"] = function(node, st, c) { - for (var i = 0; i < node.statements.length; i++) { - c(node.statements[i], st, "QMLHeaderStatement"); - } - } - base["QMLHeaderStatement"] = skipThrough; - base["QMLImportStatement"] = function(node, st, c) { - c(node.module, st); - } - base["QMLModule"] = ignore; - base["QMLPragmaStatement"] = ignore; - base["QMLRootObject"] = skipThrough; - base["QMLObjectLiteral"] = function(node, st, c) { - c(node.block, st); - } - base["QMLMemberBlock"] = function(node, st, c) { - for (var i = 0; i < node.members.length; i++) { - c(node.members[i], st, "QMLMember"); - } - } - base["QMLMember"] = skipThrough; - base["QMLPropertyDeclaration"] = function(node, st, c) { - c(node.identifier, st, "Pattern"); - c(node.binding, st); - } - base["QMLSignalDefinition"] = ignore; - base["QMLProperty"] = function(node, st, c) { - // c(node.qualifiedId, st) - c(node.binding, st); - } - base["QMLBinding"] = function(node, st, c) { - if (node.block) { - c(node.block, st); - } else { - c(node.expr, st, "Expression"); - } - } - base["QMLStatementBlock"] = function(node, st, c) { - for (var i = 0; i < node.statements.length; i++) { - c(node.statements[i], st, "Statement"); - } - } + function ignore(node, st, c) {} + + var base = walk.base; + base["Program"] = function (node, st, c) { + c(node.headerStatements, st); + c(node.rootObject, st, "QMLRootObject"); + }; + base["QMLHeaderStatements"] = function (node, st, c) { + for (var i = 0; i < node.statements.length; i++) { + c(node.statements[i], st, "QMLHeaderStatement"); + } + }; + base["QMLHeaderStatement"] = skipThrough; + base["QMLImportStatement"] = ignore; + base["QMLPragmaStatement"] = ignore; + base["QMLRootObject"] = skipThrough; + base["QMLObjectLiteral"] = function (node, st, c) { + c(node.block, st); + }; + base["QMLMemberBlock"] = function (node, st, c) { + for (var i = 0; i < node.members.length; i++) { + c(node.members[i], st, "QMLMember"); + } + }; + base["QMLMember"] = skipThrough; + base["QMLPropertyDeclaration"] = function (node, st, c) { + c(node.binding, st); + }; + base["QMLSignalDefinition"] = ignore; + base["QMLPropertyBinding"] = function (node, st, c) { + c(node.binding, st); + }; + base["QMLStatementBlock"] = function (node, st, c) { + for (var i = 0; i < node.statements.length; i++) { + c(node.statements[i], st, "Statement"); + } + }; }) \ No newline at end of file