mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-09-10 12:03:16 +02:00
Bug 480238 - QML Parser based on Acorn
Added a new plugin 'org.eclipse.cdt.qt.core.acorn' which houses the new acorn-qml parser. Change-Id: I7b456ecec97d44e10ca7e259523b5262c67c538d Signed-off-by: Matthew Bastien <mbastien@blackberry.com>
This commit is contained in:
parent
508ee9fd44
commit
f8b769b2b3
16 changed files with 717 additions and 0 deletions
7
qt/org.eclipse.cdt.qt.core.acorn/.classpath
Normal file
7
qt/org.eclipse.cdt.qt.core.acorn/.classpath
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
28
qt/org.eclipse.cdt.qt.core.acorn/.project
Normal file
28
qt/org.eclipse.cdt.qt.core.acorn/.project
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.cdt.qt.core.acorn</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,7 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
10
qt/org.eclipse.cdt.qt.core.acorn/META-INF/MANIFEST.MF
Normal file
10
qt/org.eclipse.cdt.qt.core.acorn/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Bundle-ManifestVersion: 2
|
||||||
|
Bundle-Name: %pluginName
|
||||||
|
Bundle-SymbolicName: org.eclipse.cdt.qt.core.acorn
|
||||||
|
Bundle-Version: 2.0.0.qualifier
|
||||||
|
Bundle-Activator: org.eclipse.cdt.qt.core.acorn.Activator
|
||||||
|
Bundle-Vendor: %providerName
|
||||||
|
Require-Bundle: org.eclipse.core.runtime
|
||||||
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||||
|
Bundle-ActivationPolicy: lazy
|
1
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/.gitignore
vendored
Normal file
1
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/node_modules
|
81
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/bin/acorn-qml.js
Normal file
81
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/bin/acorn-qml.js
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2015 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
var path = require("path");
|
||||||
|
var fs = require("fs");
|
||||||
|
var acorn = require("..");
|
||||||
|
|
||||||
|
var infile, parsed, tokens, options = {}, silent = false, compact = false, tokenize = false;
|
||||||
|
|
||||||
|
function help(status) {
|
||||||
|
var print = (status == 0) ? console.log : console.error;
|
||||||
|
print("usage: " + path.basename(process.argv[1]) + "[--ecma3|--ecma5|--ecma6]");
|
||||||
|
print(" [--tokenize] [--locations] [---allow-hash-bang] [--compact] [--silent] [--module] [--help] [--] infile");
|
||||||
|
process.exit(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 2; i < process.argv.length; ++i) {
|
||||||
|
var arg = process.argv[i];
|
||||||
|
if (arg[0] != "-" && !infile) infile = arg;
|
||||||
|
else if (arg == "--" && !infile && i + 2 == process.argv.length)
|
||||||
|
infile = process.argv[++i];
|
||||||
|
else if (arg == "--ecma3")
|
||||||
|
options.ecmaVersion = 3;
|
||||||
|
else if (arg == "--ecma5")
|
||||||
|
options.ecmaVersion = 5;
|
||||||
|
else if (arg == "--ecma6")
|
||||||
|
options.ecmaVersion = 6;
|
||||||
|
else if (arg == "--ecma7")
|
||||||
|
options.ecmaVersion = 7;
|
||||||
|
else if (arg == "--locations")
|
||||||
|
options.locations = true;
|
||||||
|
else if (arg == "--allow-hash-bang")
|
||||||
|
options.allowHashBang = true;
|
||||||
|
else if (arg == "--silent")
|
||||||
|
silent = true;
|
||||||
|
else if (arg == "--compact")
|
||||||
|
compact = true;
|
||||||
|
else if (arg == "--help")
|
||||||
|
help(0);
|
||||||
|
else if (arg == "--tokenize")
|
||||||
|
tokenize = true;
|
||||||
|
else if (arg == "--module")
|
||||||
|
options.sourceType = 'module';
|
||||||
|
else
|
||||||
|
help(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable qml parser
|
||||||
|
options.plugins = { qml: true }
|
||||||
|
|
||||||
|
try {
|
||||||
|
var code = fs.readFileSync(infile, "utf8");
|
||||||
|
|
||||||
|
if (!tokenize)
|
||||||
|
parsed = acorn.parse(code, options);
|
||||||
|
else {
|
||||||
|
var get = acorn.tokenize(code, options);
|
||||||
|
tokens = [];
|
||||||
|
while (true) {
|
||||||
|
var token = get();
|
||||||
|
tokens.push(token);
|
||||||
|
if (token.type.type == "eof")
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
console.log(e.message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!silent)
|
||||||
|
console.log(JSON.stringify(tokenize ? tokens : parsed, null, compact ? null : 2));
|
13
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/index.js
Normal file
13
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/index.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2015 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = require('./inject')(require('acorn'));
|
185
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/inject.js
Normal file
185
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/inject.js
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2015 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = function(acorn) {
|
||||||
|
|
||||||
|
// Define QML token types
|
||||||
|
var tt = acorn.tokTypes;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Shorthand for defining keywords in tt (acorn.tokTypes). Creates a new key in
|
||||||
|
* tt with the label _<keywordName>.
|
||||||
|
*/
|
||||||
|
function kw(name, options) {
|
||||||
|
if (options === undefined)
|
||||||
|
options = {};
|
||||||
|
options.keyword = name;
|
||||||
|
tt["_" + name] = new acorn.TokenType(name, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define QML keywords
|
||||||
|
kw("property");
|
||||||
|
kw("readonly");
|
||||||
|
kw("color");
|
||||||
|
kw("pragma");
|
||||||
|
kw("as");
|
||||||
|
|
||||||
|
// Define QML token contexts
|
||||||
|
var tc = acorn.tokContexts;
|
||||||
|
|
||||||
|
// TODO: Add QML contexts (one such example is so we can parse keywords as identifiers)
|
||||||
|
|
||||||
|
// QML parser methods
|
||||||
|
var pp = acorn.Parser.prototype;
|
||||||
|
|
||||||
|
pp.qml_parseHeaderStatements = function() {
|
||||||
|
var node = this.startNode()
|
||||||
|
node.statements = [];
|
||||||
|
|
||||||
|
loop: {
|
||||||
|
switch (this.type) {
|
||||||
|
case tt._import:
|
||||||
|
var qmlImport = this.qml_parseImportStatement();
|
||||||
|
node.statements.push(qmlImport);
|
||||||
|
break loop;
|
||||||
|
case tt._pragma:
|
||||||
|
// TODO: parse QML pragma statement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.finishNode(node, "QMLHeaderStatements")
|
||||||
|
}
|
||||||
|
|
||||||
|
pp.qml_parseImportStatement = function() {
|
||||||
|
var node = this.startNode();
|
||||||
|
|
||||||
|
// Advance to the next token since this method should only be called
|
||||||
|
// when the current token is 'import'
|
||||||
|
this.next();
|
||||||
|
node.module = this.qml_parseModuleIdentifier();
|
||||||
|
// TODO: parse the 'as Identifier' portion of an import statement
|
||||||
|
this.semicolon();
|
||||||
|
return this.finishNode(node, "QMLImportStatement");
|
||||||
|
};
|
||||||
|
|
||||||
|
pp.qml_parseModuleIdentifier = function() {
|
||||||
|
var node = this.startNode();
|
||||||
|
|
||||||
|
// Parse the qualified id/string
|
||||||
|
if (this.type == tt.name)
|
||||||
|
node.qualifiedId = this.qml_parseQualifiedId();
|
||||||
|
else if (this.type == tt.string) {
|
||||||
|
node.file = this.value;
|
||||||
|
this.next();
|
||||||
|
} else
|
||||||
|
this.unexpected();
|
||||||
|
|
||||||
|
// Parse the version number
|
||||||
|
if (this.type == tt.num) {
|
||||||
|
node.version = this.parseLiteral(this.value);
|
||||||
|
// TODO: check that version number has major and minor
|
||||||
|
} else
|
||||||
|
this.unexpected();
|
||||||
|
return this.finishNode(node, "QMLModuleIdentifier");
|
||||||
|
};
|
||||||
|
|
||||||
|
pp.qml_parseQualifiedId = function() {
|
||||||
|
var id = this.value;
|
||||||
|
this.next();
|
||||||
|
while(this.type == tt.dot) {
|
||||||
|
id += '.';
|
||||||
|
this.next();
|
||||||
|
if (this.type == tt.name)
|
||||||
|
id += this.value;
|
||||||
|
else
|
||||||
|
this.unexpected();
|
||||||
|
this.next();
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns a TokenType that matches the given word or undefined if
|
||||||
|
* no such TokenType could be found.
|
||||||
|
*
|
||||||
|
* Uses contextual information to determine whether or not a keyword
|
||||||
|
* such as 'color' is being used as an identifier. If this is found
|
||||||
|
* to be the case, tt.name is returned.
|
||||||
|
*/
|
||||||
|
pp.qml_getTokenType = function(word) {
|
||||||
|
// TODO: use context to determine if this is an identifier or
|
||||||
|
// a keyword (color, real, etc. can be used as identifiers)
|
||||||
|
switch(word) {
|
||||||
|
case "property":
|
||||||
|
return tt._property;
|
||||||
|
case "readonly":
|
||||||
|
return tt._readonly;
|
||||||
|
case "import":
|
||||||
|
// Make sure that 'import' is recognized as a keyword
|
||||||
|
// regardless of ecma version set in acorn.
|
||||||
|
return tt._import;
|
||||||
|
case "color":
|
||||||
|
return tt._color;
|
||||||
|
case "pragma":
|
||||||
|
return tt._pragma;
|
||||||
|
case "as":
|
||||||
|
return tt._as;
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
acorn.plugins.qml = function(instance) {
|
||||||
|
|
||||||
|
// 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 = [];
|
||||||
|
|
||||||
|
var headerStmts = this.qml_parseHeaderStatements();
|
||||||
|
node.body.push(headerStmts)
|
||||||
|
|
||||||
|
// TODO: Parse QML object root
|
||||||
|
|
||||||
|
// TODO: don't call acorn's parseTopLevel method once the above are working
|
||||||
|
return nextMethod.call(this, node);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Extend acorn's 'readWord' method
|
||||||
|
instance.extend("readWord", function(nextMethod) {
|
||||||
|
return function() {
|
||||||
|
// Parse a word and attempt to match it to a QML keyword
|
||||||
|
var word = this.readWord1();
|
||||||
|
var type = this.qml_getTokenType(word);
|
||||||
|
|
||||||
|
if (type !== undefined)
|
||||||
|
return this.finishToken(type, word);
|
||||||
|
|
||||||
|
// If we were unable to find a QML keyword, call acorn's implementation
|
||||||
|
// of the readWord method. Since we don't have access to _tokentype, and
|
||||||
|
// subsequently _tokentype.keywords, we can't look for JavaScript keyword
|
||||||
|
// matches ourselves. This is unfortunate because we have to move the parser
|
||||||
|
// backwards and let readWord call readWord1 a second time for every word
|
||||||
|
// that is not a QML keyword.
|
||||||
|
this.pos -= word.length;
|
||||||
|
return nextMethod.call(this);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return acorn
|
||||||
|
};
|
11
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/package.json
Normal file
11
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/package.json
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "acorn-qml",
|
||||||
|
"description": "QML Parser",
|
||||||
|
"version": "2.4.0",
|
||||||
|
"scripts": {
|
||||||
|
"test": "node test/run.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"acorn": "^2.4.0"
|
||||||
|
}
|
||||||
|
}
|
118
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/test/driver.js
Normal file
118
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/test/driver.js
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2015 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
var tests = [];
|
||||||
|
|
||||||
|
exports.test = function(code, ast, options) {
|
||||||
|
tests.push({code: code, ast: ast, options: options});
|
||||||
|
};
|
||||||
|
exports.testFail = function(code, message, options) {
|
||||||
|
tests.push({code: code, error: message, options: options});
|
||||||
|
};
|
||||||
|
exports.testAssert = function(code, assert, options) {
|
||||||
|
tests.push({code: code, assert: assert, options: options});
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.runTests = function(config, callback) {
|
||||||
|
var parse = config.parse;
|
||||||
|
|
||||||
|
for (var i = 0; i < tests.length; ++i) {
|
||||||
|
var test = tests[i];
|
||||||
|
if (config.filter && !config.filter(test)) continue;
|
||||||
|
try {
|
||||||
|
var testOpts = test.options || {locations: true};
|
||||||
|
var expected = {};
|
||||||
|
if (expected.onComment = testOpts.onComment) {
|
||||||
|
testOpts.onComment = []
|
||||||
|
}
|
||||||
|
if (expected.onToken = testOpts.onToken) {
|
||||||
|
testOpts.onToken = [];
|
||||||
|
}
|
||||||
|
testOpts.plugins = { qml: true };
|
||||||
|
var ast = parse(test.code, testOpts);
|
||||||
|
if (test.error) {
|
||||||
|
if (config.loose) {
|
||||||
|
callback("ok", test.code);
|
||||||
|
} else {
|
||||||
|
callback("fail", test.code, "Expected error message: " + test.error + "\nBut parsing succeeded.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (test.assert) {
|
||||||
|
var error = test.assert(ast);
|
||||||
|
if (error) callback("fail", test.code,
|
||||||
|
"\n Assertion failed:\n " + error);
|
||||||
|
else callback("ok", test.code);
|
||||||
|
} else {
|
||||||
|
var mis = misMatch(test.ast, ast);
|
||||||
|
for (var name in expected) {
|
||||||
|
if (mis) break;
|
||||||
|
if (expected[name]) {
|
||||||
|
mis = misMatch(expected[name], testOpts[name]);
|
||||||
|
testOpts[name] = expected[name];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mis) callback("fail", test.code, mis);
|
||||||
|
else callback("ok", test.code);
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
if (!(e instanceof SyntaxError)) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
if (test.error) {
|
||||||
|
if (e.message == test.error) callback("ok", test.code);
|
||||||
|
else callback("fail", test.code,
|
||||||
|
"Expected error message: " + test.error + "\nGot error message: " + e.message);
|
||||||
|
} else {
|
||||||
|
callback("error", test.code, e.stack || e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function ppJSON(v) { return v instanceof RegExp ? v.toString() : JSON.stringify(v, null, 2); }
|
||||||
|
function addPath(str, pt) {
|
||||||
|
if (str.charAt(str.length-1) == ")")
|
||||||
|
return str.slice(0, str.length-1) + "/" + pt + ")";
|
||||||
|
return str + " (" + pt + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
var misMatch = exports.misMatch = function(exp, act) {
|
||||||
|
if (!exp || !act || (typeof exp != "object") || (typeof act != "object")) {
|
||||||
|
if (exp !== act) return ppJSON(exp) + " !== " + ppJSON(act);
|
||||||
|
} else if (exp instanceof RegExp || act instanceof RegExp) {
|
||||||
|
var left = ppJSON(exp), right = ppJSON(act);
|
||||||
|
if (left !== right) return left + " !== " + right;
|
||||||
|
} else if (exp.splice) {
|
||||||
|
if (!act.slice) return ppJSON(exp) + " != " + ppJSON(act);
|
||||||
|
if (act.length != exp.length) return "array length mismatch " + exp.length + " != " + act.length;
|
||||||
|
for (var i = 0; i < act.length; ++i) {
|
||||||
|
var mis = misMatch(exp[i], act[i]);
|
||||||
|
if (mis) return addPath(mis, i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var prop in exp) {
|
||||||
|
var mis = misMatch(exp[prop], act[prop]);
|
||||||
|
if (mis) return addPath(mis, prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function mangle(ast) {
|
||||||
|
if (typeof ast != "object" || !ast) return;
|
||||||
|
if (ast.slice) {
|
||||||
|
for (var i = 0; i < ast.length; ++i) mangle(ast[i]);
|
||||||
|
} else {
|
||||||
|
var loc = ast.start && ast.end && {start: ast.start, end: ast.end};
|
||||||
|
if (loc) { delete ast.start; delete ast.end; }
|
||||||
|
for (var name in ast) if (ast.hasOwnProperty(name)) mangle(ast[name]);
|
||||||
|
if (loc) ast.loc = loc;
|
||||||
|
}
|
||||||
|
}
|
81
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/test/run.js
Normal file
81
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/test/run.js
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2015 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
var driver = require("./driver.js");
|
||||||
|
require("./tests-qml.js");
|
||||||
|
|
||||||
|
function group(name) {
|
||||||
|
if (typeof console === "object" && console.group) {
|
||||||
|
console.group(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function groupEnd() {
|
||||||
|
if (typeof console === "object" && console.groupEnd) {
|
||||||
|
console.groupEnd(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function log(title, message) {
|
||||||
|
if (typeof console === "object") console.log(title, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
var stats, modes = {
|
||||||
|
Normal: {
|
||||||
|
config: {
|
||||||
|
parse: require("..").parse
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function report(state, code, message) {
|
||||||
|
if (state != "ok") {++stats.failed; log(code, message);}
|
||||||
|
++stats.testsRun;
|
||||||
|
}
|
||||||
|
|
||||||
|
group("Errors");
|
||||||
|
|
||||||
|
for (var name in modes) {
|
||||||
|
group(name);
|
||||||
|
var mode = modes[name];
|
||||||
|
stats = mode.stats = {testsRun: 0, failed: 0};
|
||||||
|
var t0 = +new Date;
|
||||||
|
driver.runTests(mode.config, report);
|
||||||
|
mode.stats.duration = +new Date - t0;
|
||||||
|
groupEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
groupEnd();
|
||||||
|
|
||||||
|
function outputStats(name, stats) {
|
||||||
|
log(name + ":", stats.testsRun + " tests run in " + stats.duration + "ms; " +
|
||||||
|
(stats.failed ? stats.failed + " failures." : "all passed."));
|
||||||
|
}
|
||||||
|
|
||||||
|
var total = {testsRun: 0, failed: 0, duration: 0};
|
||||||
|
|
||||||
|
group("Stats");
|
||||||
|
|
||||||
|
for (var name in modes) {
|
||||||
|
var stats = modes[name].stats;
|
||||||
|
outputStats(name + " parser", stats);
|
||||||
|
for (var key in stats) total[key] += stats[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
outputStats("Total", total);
|
||||||
|
|
||||||
|
groupEnd();
|
||||||
|
|
||||||
|
if (total.failed && typeof process === "object") {
|
||||||
|
process.stdout.write("", function() {
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
}
|
72
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/test/tests-qml.js
Normal file
72
qt/org.eclipse.cdt.qt.core.acorn/acorn-qml/test/tests-qml.js
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2015 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
var testFixture = {
|
||||||
|
'QML': {
|
||||||
|
'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: "QMLModuleIdentifier",
|
||||||
|
qualifiedId: "QtQuick",
|
||||||
|
range: [7, 18],
|
||||||
|
loc: {
|
||||||
|
start: { line: 1, column: 7 },
|
||||||
|
end: { line: 1, column: 18 }
|
||||||
|
},
|
||||||
|
version: {
|
||||||
|
type: "Literal",
|
||||||
|
range: [15, 18],
|
||||||
|
loc: {
|
||||||
|
start: { line: 1, column: 15 },
|
||||||
|
end: { line: 1, column: 18 }
|
||||||
|
},
|
||||||
|
value: 2.2,
|
||||||
|
raw: "2.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof exports !== "undefined") {
|
||||||
|
var test = require("./driver.js").test;
|
||||||
|
var testFail = require("./driver.js").testFail;
|
||||||
|
var tokTypes = require("../").tokTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var ns in testFixture) {
|
||||||
|
ns = testFixture[ns];
|
||||||
|
for (var code in ns) {
|
||||||
|
test(code, {
|
||||||
|
type: 'Program',
|
||||||
|
body: [ns[code]]
|
||||||
|
}, {
|
||||||
|
ecmaVersion: 6,
|
||||||
|
locations: true,
|
||||||
|
ranges: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
4
qt/org.eclipse.cdt.qt.core.acorn/build.properties
Normal file
4
qt/org.eclipse.cdt.qt.core.acorn/build.properties
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
source.. = src/
|
||||||
|
output.. = bin/
|
||||||
|
bin.includes = META-INF/,\
|
||||||
|
.
|
8
qt/org.eclipse.cdt.qt.core.acorn/plugin.properties
Normal file
8
qt/org.eclipse.cdt.qt.core.acorn/plugin.properties
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Copyright (c) 2013 QNX Software Systems and others.
|
||||||
|
# All rights reserved. This program and the accompanying materials
|
||||||
|
# are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
# which accompanies this distribution, and is available at
|
||||||
|
# http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
|
||||||
|
pluginName=C/C++ Qt Acorn QML Parser
|
||||||
|
providerName=Eclipse CDT
|
51
qt/org.eclipse.cdt.qt.core.acorn/pom.xml
Normal file
51
qt/org.eclipse.cdt.qt.core.acorn/pom.xml
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.eclipse.cdt</groupId>
|
||||||
|
<artifactId>cdt-parent</artifactId>
|
||||||
|
<version>8.8.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<version>2.0.0-SNAPSHOT</version>
|
||||||
|
<artifactId>org.eclipse.cdt.qt.core.acorn</artifactId>
|
||||||
|
<packaging>eclipse-plugin</packaging>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>generate-parsers</id>
|
||||||
|
<phase>generate-sources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<target>
|
||||||
|
<ant antfile="${basedir}/build.xml" target="build"/>
|
||||||
|
</target>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>clean-parsers</id>
|
||||||
|
<phase>clean</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<target>
|
||||||
|
<ant antfile="${basedir}/build.xml" target="clean"/>
|
||||||
|
</target>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2015 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.qt.core.acorn;
|
||||||
|
|
||||||
|
import org.osgi.framework.BundleActivator;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
|
||||||
|
public class Activator implements BundleActivator {
|
||||||
|
|
||||||
|
private static BundleContext context;
|
||||||
|
|
||||||
|
static BundleContext getContext() {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
|
||||||
|
*/
|
||||||
|
public void start(BundleContext bundleContext) throws Exception {
|
||||||
|
Activator.context = bundleContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
|
||||||
|
*/
|
||||||
|
public void stop(BundleContext bundleContext) throws Exception {
|
||||||
|
Activator.context = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue