1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

Qt - Include tern deps in build. Clean up some old files.

The tern deps were in node_modules which is gitignored. Created a
Makefile to copy those deps to a new directory and we check that in.

Also removed some files that were used to get ANTLR which we aren't
using. And cleaned out the commented out reload button from the
plugin.xml.

Change-Id: I09a5ecb298bbdd9272f9b4a7540d525edb55c4fa
This commit is contained in:
Doug Schaefer 2016-01-27 12:38:25 -05:00
parent 9e7b1ce856
commit 095dd5160e
14 changed files with 9028 additions and 112 deletions

View file

@ -1,2 +0,0 @@
/src-gen/
/antlr-4.5.1-complete.jar

View file

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="build">
<description>
Build file to generate the ANTLR 4 parsers and lexers
</description>
<target name="getAntlr">
<get src="http://www.antlr.org/download/antlr-4.5.1-complete.jar" dest="antlr-4.5.1-complete.jar" skipexisting="true"/>
</target>
<target name="build" depends="getAntlr">
<java classname="org.antlr.v4.Tool" fork="true">
<classpath>
<pathelement location="antlr-4.5.1-complete.jar"/>
<pathelement path="${java.class.path}"/>
</classpath>
<arg value="-o"/>
<arg value="src-gen/org/eclipse/cdt/internal/qt/core/qml/parser"/>
<arg value="-package"/>
<arg value="org.eclipse.cdt.internal.qt.core.qml.parser"/>
<arg value="ECMAScript.g4"/>
</java>
<java classname="org.antlr.v4.Tool" fork="true">
<classpath>
<pathelement location="antlr-4.5.1-complete.jar"/>
<pathelement path="${java.class.path}"/>
</classpath>
<arg value="-o"/>
<arg value="src-gen/org/eclipse/cdt/internal/qt/core/qml/parser"/>
<arg value="-package"/>
<arg value="org.eclipse.cdt.internal.qt.core.qml.parser"/>
<arg value="QML.g4"/>
</java>
</target>
<target name="clean">
<delete dir="src-gen"/>
<mkdir dir="src-gen"/>
</target>
</project>

View file

@ -45,23 +45,25 @@ public class QMLAnalyzer implements IQMLAnalyzer {
engine = new ScriptEngineManager().getEngineByName("nashorn");
invoke = (Invocable) engine;
load("/tern-qml/node_modules/acorn/dist/acorn.js");
load("/tern-qml/node_modules/acorn/dist/acorn_loose.js");
load("/tern-qml/node_modules/acorn/dist/walk.js");
load("/tern-qml/node_modules/acorn-qml/inject.js");
load("/tern-qml/node_modules/acorn-qml/index.js");
load("/tern-qml/node_modules/acorn-qml/loose/inject.js");
load("/tern-qml/node_modules/acorn-qml/loose/index.js");
load("/tern-qml/node_modules/acorn-qml/walk/index.js");
loadDep("/tern-qml/node_modules/acorn/dist/acorn.js");
loadDep("/tern-qml/node_modules/acorn/dist/acorn_loose.js");
loadDep("/tern-qml/node_modules/acorn/dist/walk.js");
load("/tern-qml/node_modules/tern/lib/signal.js");
load("/tern-qml/node_modules/tern/lib/tern.js");
load("/tern-qml/node_modules/tern/lib/def.js");
load("/tern-qml/node_modules/tern/lib/comment.js");
load("/tern-qml/node_modules/tern/lib/infer.js");
loadDep("/tern-qml/node_modules/tern/lib/signal.js");
loadDep("/tern-qml/node_modules/tern/lib/tern.js");
loadDep("/tern-qml/node_modules/tern/lib/def.js");
loadDep("/tern-qml/node_modules/tern/lib/comment.js");
loadDep("/tern-qml/node_modules/tern/lib/infer.js");
load("/acorn-qml/inject.js");
load("/acorn-qml/index.js");
load("/acorn-qml/loose/inject.js");
load("/acorn-qml/loose/index.js");
load("/acorn-qml/walk/index.js");
load("/tern-qml/qml.js");
load("/tern-qml/qml-nsh.js");
Bindings options = (Bindings) engine.eval("new Object()");
options.put("ecmaVersion", 5);
@ -113,6 +115,14 @@ public class QMLAnalyzer implements IQMLAnalyzer {
return engine.eval(new BufferedReader(new InputStreamReader(scriptURL.openStream(), StandardCharsets.UTF_8)));
}
private Object loadDep(String file) throws ScriptException, IOException {
try {
return load(file);
} catch (FileNotFoundException e) {
return load(file.replaceAll("^/tern-qml/node_modules/", "/tern-qml/dist/"));
}
}
private void waitUntilLoaded() {
synchronized (this) {
while (tern == null) {

View file

@ -1,4 +1 @@
/node_modules
/.settings
.project
.tern-project
/node_modules/

View file

@ -0,0 +1,18 @@
DIST = \
dist/acorn/dist/acorn.js \
dist/acorn/dist/acorn_loose.js \
dist/acorn/dist/walk.js \
dist/tern/lib/signal.js \
dist/tern/lib/tern.js \
dist/tern/lib/def.js \
dist/tern/lib/comment.js \
dist/tern/lib/infer.js
all: $(DIST)
dist/%: node_modules/%
@mkdir -p $(dir $@)
cp $^ $@
clean:
rm -fr dist

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,377 @@
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.acorn || (g.acorn = {})).walk = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
// AST walker module for Mozilla Parser API compatible trees
// A simple walk is one where you simply specify callbacks to be
// called on specific nodes. The last two arguments are optional. A
// simple use would be
//
// walk.simple(myTree, {
// Expression: function(node) { ... }
// });
//
// to do something with all expressions. All Parser API node types
// can be used to identify node types, as well as Expression,
// Statement, and ScopeBody, which denote categories of nodes.
//
// The base argument can be used to pass a custom (recursive)
// walker, and state can be used to give this walked an initial
// state.
"use strict";
exports.__esModule = true;
exports.simple = simple;
exports.ancestor = ancestor;
exports.recursive = recursive;
exports.findNodeAt = findNodeAt;
exports.findNodeAround = findNodeAround;
exports.findNodeAfter = findNodeAfter;
exports.findNodeBefore = findNodeBefore;
exports.make = make;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function simple(node, visitors, base, state, override) {
if (!base) base = exports.base;(function c(node, st, override) {
var type = override || node.type,
found = visitors[type];
base[type](node, st, c);
if (found) found(node, st);
})(node, state, override);
}
// An ancestor walk builds up an array of ancestor nodes (including
// the current node) and passes them to the callback as the state parameter.
function ancestor(node, visitors, base, state) {
if (!base) base = exports.base;
if (!state) state = [];(function c(node, st, override) {
var type = override || node.type,
found = visitors[type];
if (node != st[st.length - 1]) {
st = st.slice();
st.push(node);
}
base[type](node, st, c);
if (found) found(node, st);
})(node, state);
}
// A recursive walk is one where your functions override the default
// walkers. They can modify and replace the state parameter that's
// threaded through the walk, and can opt how and whether to walk
// their child nodes (by calling their third argument on these
// nodes).
function recursive(node, state, funcs, base, override) {
var visitor = funcs ? exports.make(funcs, base) : base;(function c(node, st, override) {
visitor[override || node.type](node, st, c);
})(node, state, override);
}
function makeTest(test) {
if (typeof test == "string") return function (type) {
return type == test;
};else if (!test) return function () {
return true;
};else return test;
}
var Found = function Found(node, state) {
_classCallCheck(this, Found);
this.node = node;this.state = state;
}
// Find a node with a given start, end, and type (all are optional,
// null can be used as wildcard). Returns a {node, state} object, or
// undefined when it doesn't find a matching node.
;
function findNodeAt(node, start, end, test, base, state) {
test = makeTest(test);
if (!base) base = exports.base;
try {
;(function c(node, st, override) {
var type = override || node.type;
if ((start == null || node.start <= start) && (end == null || node.end >= end)) base[type](node, st, c);
if ((start == null || node.start == start) && (end == null || node.end == end) && test(type, node)) throw new Found(node, st);
})(node, state);
} catch (e) {
if (e instanceof Found) return e;
throw e;
}
}
// Find the innermost node of a given type that contains the given
// position. Interface similar to findNodeAt.
function findNodeAround(node, pos, test, base, state) {
test = makeTest(test);
if (!base) base = exports.base;
try {
;(function c(node, st, override) {
var type = override || node.type;
if (node.start > pos || node.end < pos) return;
base[type](node, st, c);
if (test(type, node)) throw new Found(node, st);
})(node, state);
} catch (e) {
if (e instanceof Found) return e;
throw e;
}
}
// Find the outermost matching node after a given position.
function findNodeAfter(node, pos, test, base, state) {
test = makeTest(test);
if (!base) base = exports.base;
try {
;(function c(node, st, override) {
if (node.end < pos) return;
var type = override || node.type;
if (node.start >= pos && test(type, node)) throw new Found(node, st);
base[type](node, st, c);
})(node, state);
} catch (e) {
if (e instanceof Found) return e;
throw e;
}
}
// Find the outermost matching node before a given position.
function findNodeBefore(node, pos, test, base, state) {
test = makeTest(test);
if (!base) base = exports.base;
var max = undefined;(function c(node, st, override) {
if (node.start > pos) return;
var type = override || node.type;
if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node)) max = new Found(node, st);
base[type](node, st, c);
})(node, state);
return max;
}
// Used to create a custom walker. Will fill in all missing node
// type properties with the defaults.
function make(funcs, base) {
if (!base) base = exports.base;
var visitor = {};
for (var type in base) visitor[type] = base[type];
for (var type in funcs) visitor[type] = funcs[type];
return visitor;
}
function skipThrough(node, st, c) {
c(node, st);
}
function ignore(_node, _st, _c) {}
// Node walkers.
var base = {};
exports.base = base;
base.Program = base.BlockStatement = function (node, st, c) {
for (var i = 0; i < node.body.length; ++i) {
c(node.body[i], st, "Statement");
}
};
base.Statement = skipThrough;
base.EmptyStatement = ignore;
base.ExpressionStatement = base.ParenthesizedExpression = function (node, st, c) {
return c(node.expression, st, "Expression");
};
base.IfStatement = function (node, st, c) {
c(node.test, st, "Expression");
c(node.consequent, st, "Statement");
if (node.alternate) c(node.alternate, st, "Statement");
};
base.LabeledStatement = function (node, st, c) {
return c(node.body, st, "Statement");
};
base.BreakStatement = base.ContinueStatement = ignore;
base.WithStatement = function (node, st, c) {
c(node.object, st, "Expression");
c(node.body, st, "Statement");
};
base.SwitchStatement = function (node, st, c) {
c(node.discriminant, st, "Expression");
for (var i = 0; i < node.cases.length; ++i) {
var cs = node.cases[i];
if (cs.test) c(cs.test, st, "Expression");
for (var j = 0; j < cs.consequent.length; ++j) {
c(cs.consequent[j], st, "Statement");
}
}
};
base.ReturnStatement = base.YieldExpression = function (node, st, c) {
if (node.argument) c(node.argument, st, "Expression");
};
base.ThrowStatement = base.SpreadElement = function (node, st, c) {
return c(node.argument, st, "Expression");
};
base.TryStatement = function (node, st, c) {
c(node.block, st, "Statement");
if (node.handler) {
c(node.handler.param, st, "Pattern");
c(node.handler.body, st, "ScopeBody");
}
if (node.finalizer) c(node.finalizer, st, "Statement");
};
base.WhileStatement = base.DoWhileStatement = function (node, st, c) {
c(node.test, st, "Expression");
c(node.body, st, "Statement");
};
base.ForStatement = function (node, st, c) {
if (node.init) c(node.init, st, "ForInit");
if (node.test) c(node.test, st, "Expression");
if (node.update) c(node.update, st, "Expression");
c(node.body, st, "Statement");
};
base.ForInStatement = base.ForOfStatement = function (node, st, c) {
c(node.left, st, "ForInit");
c(node.right, st, "Expression");
c(node.body, st, "Statement");
};
base.ForInit = function (node, st, c) {
if (node.type == "VariableDeclaration") c(node, st);else c(node, st, "Expression");
};
base.DebuggerStatement = ignore;
base.FunctionDeclaration = function (node, st, c) {
return c(node, st, "Function");
};
base.VariableDeclaration = function (node, st, c) {
for (var i = 0; i < node.declarations.length; ++i) {
c(node.declarations[i], st);
}
};
base.VariableDeclarator = function (node, st, c) {
c(node.id, st, "Pattern");
if (node.init) c(node.init, st, "Expression");
};
base.Function = function (node, st, c) {
if (node.id) c(node.id, st, "Pattern");
for (var i = 0; i < node.params.length; i++) {
c(node.params[i], st, "Pattern");
}c(node.body, st, node.expression ? "ScopeExpression" : "ScopeBody");
};
// FIXME drop these node types in next major version
// (They are awkward, and in ES6 every block can be a scope.)
base.ScopeBody = function (node, st, c) {
return c(node, st, "Statement");
};
base.ScopeExpression = function (node, st, c) {
return c(node, st, "Expression");
};
base.Pattern = function (node, st, c) {
if (node.type == "Identifier") c(node, st, "VariablePattern");else if (node.type == "MemberExpression") c(node, st, "MemberPattern");else c(node, st);
};
base.VariablePattern = ignore;
base.MemberPattern = skipThrough;
base.RestElement = function (node, st, c) {
return c(node.argument, st, "Pattern");
};
base.ArrayPattern = function (node, st, c) {
for (var i = 0; i < node.elements.length; ++i) {
var elt = node.elements[i];
if (elt) c(elt, st, "Pattern");
}
};
base.ObjectPattern = function (node, st, c) {
for (var i = 0; i < node.properties.length; ++i) {
c(node.properties[i].value, st, "Pattern");
}
};
base.Expression = skipThrough;
base.ThisExpression = base.Super = base.MetaProperty = ignore;
base.ArrayExpression = function (node, st, c) {
for (var i = 0; i < node.elements.length; ++i) {
var elt = node.elements[i];
if (elt) c(elt, st, "Expression");
}
};
base.ObjectExpression = function (node, st, c) {
for (var i = 0; i < node.properties.length; ++i) {
c(node.properties[i], st);
}
};
base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration;
base.SequenceExpression = base.TemplateLiteral = function (node, st, c) {
for (var i = 0; i < node.expressions.length; ++i) {
c(node.expressions[i], st, "Expression");
}
};
base.UnaryExpression = base.UpdateExpression = function (node, st, c) {
c(node.argument, st, "Expression");
};
base.BinaryExpression = base.LogicalExpression = function (node, st, c) {
c(node.left, st, "Expression");
c(node.right, st, "Expression");
};
base.AssignmentExpression = base.AssignmentPattern = function (node, st, c) {
c(node.left, st, "Pattern");
c(node.right, st, "Expression");
};
base.ConditionalExpression = function (node, st, c) {
c(node.test, st, "Expression");
c(node.consequent, st, "Expression");
c(node.alternate, st, "Expression");
};
base.NewExpression = base.CallExpression = function (node, st, c) {
c(node.callee, st, "Expression");
if (node.arguments) for (var i = 0; i < node.arguments.length; ++i) {
c(node.arguments[i], st, "Expression");
}
};
base.MemberExpression = function (node, st, c) {
c(node.object, st, "Expression");
if (node.computed) c(node.property, st, "Expression");
};
base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) {
if (node.declaration) c(node.declaration, st, node.type == "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression");
if (node.source) c(node.source, st, "Expression");
};
base.ExportAllDeclaration = function (node, st, c) {
c(node.source, st, "Expression");
};
base.ImportDeclaration = function (node, st, c) {
for (var i = 0; i < node.specifiers.length; i++) {
c(node.specifiers[i], st);
}c(node.source, st, "Expression");
};
base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore;
base.TaggedTemplateExpression = function (node, st, c) {
c(node.tag, st, "Expression");
c(node.quasi, st);
};
base.ClassDeclaration = base.ClassExpression = function (node, st, c) {
return c(node, st, "Class");
};
base.Class = function (node, st, c) {
if (node.id) c(node.id, st, "Pattern");
if (node.superClass) c(node.superClass, st, "Expression");
for (var i = 0; i < node.body.body.length; i++) {
c(node.body.body[i], st);
}
};
base.MethodDefinition = base.Property = function (node, st, c) {
if (node.computed) c(node.key, st, "Expression");
c(node.value, st, "Expression");
};
base.ComprehensionExpression = function (node, st, c) {
for (var i = 0; i < node.blocks.length; i++) {
c(node.blocks[i].right, st, "Expression");
}c(node.body, st, "Expression");
};
},{}]},{},[1])(1)
});

View file

@ -0,0 +1,87 @@
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
return mod(exports);
if (typeof define == "function" && define.amd) // AMD
return define(["exports"], mod);
mod(tern.comment || (tern.comment = {}));
})(function(exports) {
function isSpace(ch) {
return (ch < 14 && ch > 8) || ch === 32 || ch === 160;
}
function onOwnLine(text, pos) {
for (; pos > 0; --pos) {
var ch = text.charCodeAt(pos - 1);
if (ch == 10) break;
if (!isSpace(ch)) return false;
}
return true;
}
// Gather comments directly before a function
exports.commentsBefore = function(text, pos) {
var found = null, emptyLines = 0, topIsLineComment;
out: while (pos > 0) {
var prev = text.charCodeAt(pos - 1);
if (prev == 10) {
for (var scan = --pos, sawNonWS = false; scan > 0; --scan) {
prev = text.charCodeAt(scan - 1);
if (prev == 47 && text.charCodeAt(scan - 2) == 47) {
if (!onOwnLine(text, scan - 2)) break out;
var content = text.slice(scan, pos);
if (!emptyLines && topIsLineComment) found[0] = content + "\n" + found[0];
else (found || (found = [])).unshift(content);
topIsLineComment = true;
emptyLines = 0;
pos = scan - 2;
break;
} else if (prev == 10) {
if (!sawNonWS && ++emptyLines > 1) break out;
break;
} else if (!sawNonWS && !isSpace(prev)) {
sawNonWS = true;
}
}
} else if (prev == 47 && text.charCodeAt(pos - 2) == 42) {
for (var scan = pos - 2; scan > 1; --scan) {
if (text.charCodeAt(scan - 1) == 42 && text.charCodeAt(scan - 2) == 47) {
if (!onOwnLine(text, scan - 2)) break out;
(found || (found = [])).unshift(text.slice(scan, pos - 2));
topIsLineComment = false;
emptyLines = 0;
break;
}
}
pos = scan - 2;
} else if (isSpace(prev)) {
--pos;
} else {
break;
}
}
return found;
};
exports.commentAfter = function(text, pos) {
while (pos < text.length) {
var next = text.charCodeAt(pos);
if (next == 47) {
var after = text.charCodeAt(pos + 1), end;
if (after == 47) // line comment
end = text.indexOf("\n", pos + 2);
else if (after == 42) // block comment
end = text.indexOf("*/", pos + 2);
else
return;
return text.slice(pos + 2, end < 0 ? text.length : end);
} else if (isSpace(next)) {
++pos;
}
}
};
exports.ensureCommentsBefore = function(text, node) {
if (node.hasOwnProperty("commentsBefore")) return node.commentsBefore;
return node.commentsBefore = exports.commentsBefore(text, node.start);
};
});

View file

@ -0,0 +1,656 @@
// Type description parser
//
// Type description JSON files (such as ecma5.json and browser.json)
// are used to
//
// A) describe types that come from native code
//
// B) to cheaply load the types for big libraries, or libraries that
// can't be inferred well
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
return exports.init = mod;
if (typeof define == "function" && define.amd) // AMD
return define({init: mod});
tern.def = {init: mod};
})(function(exports, infer) {
"use strict";
function hop(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
var TypeParser = exports.TypeParser = function(spec, start, base, forceNew) {
this.pos = start || 0;
this.spec = spec;
this.base = base;
this.forceNew = forceNew;
};
function unwrapType(type, self, args) {
return type.call ? type(self, args) : type;
}
function extractProp(type, prop) {
if (prop == "!ret") {
if (type.retval) return type.retval;
var rv = new infer.AVal;
type.propagate(new infer.IsCallee(infer.ANull, [], null, rv));
return rv;
} else {
return type.getProp(prop);
}
}
function computedFunc(name, args, retType, generator) {
return function(self, cArgs) {
var realArgs = [];
for (var i = 0; i < args.length; i++) realArgs.push(unwrapType(args[i], self, cArgs));
return new infer.Fn(name, infer.ANull, realArgs, unwrapType(retType, self, cArgs), generator);
};
}
function computedUnion(types) {
return function(self, args) {
var union = new infer.AVal;
for (var i = 0; i < types.length; i++) unwrapType(types[i], self, args).propagate(union);
union.maxWeight = 1e5;
return union;
};
}
function computedArray(inner) {
return function(self, args) {
return new infer.Arr(inner(self, args));
};
}
function computedTuple(types) {
return function(self, args) {
return new infer.Arr(types.map(function(tp) { return unwrapType(tp, self, args) }))
}
}
TypeParser.prototype = {
eat: function(str) {
if (str.length == 1 ? this.spec.charAt(this.pos) == str : this.spec.indexOf(str, this.pos) == this.pos) {
this.pos += str.length;
return true;
}
},
word: function(re) {
var word = "", ch, re = re || /[\w$]/;
while ((ch = this.spec.charAt(this.pos)) && re.test(ch)) { word += ch; ++this.pos; }
return word;
},
error: function() {
throw new Error("Unrecognized type spec: " + this.spec + " (at " + this.pos + ")");
},
parseFnType: function(comp, name, top, generator) {
var args = [], names = [], computed = false;
if (!this.eat(")")) for (var i = 0; ; ++i) {
var colon = this.spec.indexOf(": ", this.pos), argname;
if (colon != -1) {
argname = this.spec.slice(this.pos, colon);
if (/^[$\w?]+$/.test(argname))
this.pos = colon + 2;
else
argname = null;
}
names.push(argname);
var argType = this.parseType(comp);
if (argType.call) computed = true;
args.push(argType);
if (!this.eat(", ")) {
this.eat(")") || this.error();
break;
}
}
var retType, computeRet, computeRetStart, fn;
if (this.eat(" -> ")) {
var retStart = this.pos;
retType = this.parseType(true);
if (retType.call && !computed) {
computeRet = retType;
retType = infer.ANull;
computeRetStart = retStart;
}
} else {
retType = infer.ANull;
}
if (computed) return computedFunc(name, args, retType, generator);
if (top && (fn = this.base))
infer.Fn.call(this.base, name, infer.ANull, args, names, retType, generator);
else
fn = new infer.Fn(name, infer.ANull, args, names, retType, generator);
if (computeRet) fn.computeRet = computeRet;
if (computeRetStart != null) fn.computeRetSource = this.spec.slice(computeRetStart, this.pos);
return fn;
},
parseType: function(comp, name, top) {
var main = this.parseTypeMaybeProp(comp, name, top);
if (!this.eat("|")) return main;
var types = [main], computed = main.call;
for (;;) {
var next = this.parseTypeMaybeProp(comp, name, top);
types.push(next);
if (next.call) computed = true;
if (!this.eat("|")) break;
}
if (computed) return computedUnion(types);
var union = new infer.AVal;
for (var i = 0; i < types.length; i++) types[i].propagate(union);
union.maxWeight = 1e5;
return union;
},
parseTypeMaybeProp: function(comp, name, top) {
var result = this.parseTypeInner(comp, name, top);
while (comp && this.eat(".")) result = this.extendWithProp(result);
return result;
},
extendWithProp: function(base) {
var propName = this.word(/[\w<>$!:]/) || this.error();
if (base.apply) return function(self, args) {
return extractProp(base(self, args), propName);
};
return extractProp(base, propName);
},
parseTypeInner: function(comp, name, top) {
var gen
if (this.eat("fn(") || (gen = this.eat("fn*("))) {
return this.parseFnType(comp, name, top, gen);
} else if (this.eat("[")) {
var inner = this.parseType(comp), types, computed = inner.call
while (this.eat(", ")) {
if (!types) types = [inner]
var next = this.parseType(comp)
types.push(next)
computed = computed || next.call
}
this.eat("]") || this.error()
if (computed) return types ? computedTuple(types) : computedArray(inner)
if (top && this.base) {
infer.Arr.call(this.base, types || inner)
return this.base
}
return new infer.Arr(types || inner)
} else if (this.eat("+")) {
var path = this.word(/[\w$<>\.:!]/)
var base = infer.cx().localDefs[path + ".prototype"]
if (!base) {
var base = parsePath(path);
if (!(base instanceof infer.Obj)) return base;
var proto = descendProps(base, ["prototype"])
if (proto && (proto = proto.getObjType()))
base = proto
}
if (comp && this.eat("[")) return this.parsePoly(base);
if (top && this.forceNew) return new infer.Obj(base);
return infer.getInstance(base);
} else if (this.eat(":")) {
var name = this.word(/[\w$\.]/)
return infer.getSymbol(name)
} else if (comp && this.eat("!")) {
var arg = this.word(/\d/);
if (arg) {
arg = Number(arg);
return function(_self, args) {return args[arg] || infer.ANull;};
} else if (this.eat("this")) {
return function(self) {return self;};
} else if (this.eat("custom:")) {
var fname = this.word(/[\w$]/);
return customFunctions[fname] || function() { return infer.ANull; };
} else {
return this.fromWord("!" + this.word(/[\w$<>\.!:]/));
}
} else if (this.eat("?")) {
return infer.ANull;
} else {
return this.fromWord(this.word(/[\w$<>\.!:`]/));
}
},
fromWord: function(spec) {
var cx = infer.cx();
switch (spec) {
case "number": return cx.num;
case "string": return cx.str;
case "bool": return cx.bool;
case "<top>": return cx.topScope;
}
if (cx.localDefs && spec in cx.localDefs) return cx.localDefs[spec];
return parsePath(spec);
},
parsePoly: function(base) {
var propName = "<i>", match;
if (match = this.spec.slice(this.pos).match(/^\s*([\w$:]+)\s*=\s*/)) {
propName = match[1];
this.pos += match[0].length;
}
var value = this.parseType(true);
if (!this.eat("]")) this.error();
if (value.call) return function(self, args) {
var instance = new infer.Obj(base);
value(self, args).propagate(instance.defProp(propName));
return instance;
};
var instance = new infer.Obj(base);
value.propagate(instance.defProp(propName));
return instance;
}
};
function parseType(spec, name, base, forceNew) {
var type = new TypeParser(spec, null, base, forceNew).parseType(false, name, true);
if (/^fn\(/.test(spec)) for (var i = 0; i < type.args.length; ++i) (function(i) {
var arg = type.args[i];
if (arg instanceof infer.Fn && arg.args && arg.args.length) addEffect(type, function(_self, fArgs) {
var fArg = fArgs[i];
if (fArg) fArg.propagate(new infer.IsCallee(infer.cx().topScope, arg.args, null, infer.ANull));
});
})(i);
return type;
}
function addEffect(fn, handler, replaceRet) {
var oldCmp = fn.computeRet, rv = fn.retval;
fn.computeRet = function(self, args, argNodes) {
var handled = handler(self, args, argNodes);
var old = oldCmp ? oldCmp(self, args, argNodes) : rv;
return replaceRet ? handled : old;
};
}
var parseEffect = exports.parseEffect = function(effect, fn) {
var m;
if (effect.indexOf("propagate ") == 0) {
var p = new TypeParser(effect, 10);
var origin = p.parseType(true);
if (!p.eat(" ")) p.error();
var target = p.parseType(true);
addEffect(fn, function(self, args) {
unwrapType(origin, self, args).propagate(unwrapType(target, self, args));
});
} else if (effect.indexOf("call ") == 0) {
var andRet = effect.indexOf("and return ", 5) == 5;
var p = new TypeParser(effect, andRet ? 16 : 5);
var getCallee = p.parseType(true), getSelf = null, getArgs = [];
if (p.eat(" this=")) getSelf = p.parseType(true);
while (p.eat(" ")) getArgs.push(p.parseType(true));
addEffect(fn, function(self, args) {
var callee = unwrapType(getCallee, self, args);
var slf = getSelf ? unwrapType(getSelf, self, args) : infer.ANull, as = [];
for (var i = 0; i < getArgs.length; ++i) as.push(unwrapType(getArgs[i], self, args));
var result = andRet ? new infer.AVal : infer.ANull;
callee.propagate(new infer.IsCallee(slf, as, null, result));
return result;
}, andRet);
} else if (m = effect.match(/^custom (\S+)\s*(.*)/)) {
var customFunc = customFunctions[m[1]];
if (customFunc) addEffect(fn, m[2] ? customFunc(m[2]) : customFunc);
} else if (effect.indexOf("copy ") == 0) {
var p = new TypeParser(effect, 5);
var getFrom = p.parseType(true);
p.eat(" ");
var getTo = p.parseType(true);
addEffect(fn, function(self, args) {
var from = unwrapType(getFrom, self, args), to = unwrapType(getTo, self, args);
from.forAllProps(function(prop, val, local) {
if (local && prop != "<i>")
to.propagate(new infer.DefProp(prop, val));
});
});
} else {
throw new Error("Unknown effect type: " + effect);
}
};
var currentTopScope;
var parsePath = exports.parsePath = function(path, scope) {
var cx = infer.cx(), cached = cx.paths[path], origPath = path;
if (cached != null) return cached;
cx.paths[path] = infer.ANull;
var base = scope || currentTopScope || cx.topScope;
if (cx.localDefs) for (var name in cx.localDefs) {
if (path.indexOf(name) == 0) {
if (path == name) return cx.paths[path] = cx.localDefs[path];
if (path.charAt(name.length) == ".") {
base = cx.localDefs[name];
path = path.slice(name.length + 1);
break;
}
}
}
var result = descendProps(base, path.split("."))
// Uncomment this to get feedback on your poorly written .json files
// if (result == infer.ANull) console.error("bad path: " + origPath + " (" + cx.curOrigin + ")")
cx.paths[origPath] = result == infer.ANull ? null : result
return result
}
function descendProps(base, parts) {
for (var i = 0; i < parts.length && base != infer.ANull; ++i) {
var prop = parts[i];
if (prop.charAt(0) == "!") {
if (prop == "!proto") {
base = (base instanceof infer.Obj && base.proto) || infer.ANull;
} else {
var fn = base.getFunctionType();
if (!fn) {
base = infer.ANull;
} else if (prop == "!ret") {
base = fn.retval && fn.retval.getType(false) || infer.ANull;
} else {
var arg = fn.args && fn.args[Number(prop.slice(1))];
base = (arg && arg.getType(false)) || infer.ANull;
}
}
} else if (base instanceof infer.Obj) {
var propVal = (prop == "prototype" && base instanceof infer.Fn) ? base.getProp(prop) : base.props[prop];
if (!propVal || propVal.isEmpty())
base = infer.ANull;
else
base = propVal.types[0];
}
}
return base;
}
function emptyObj(ctor) {
var empty = Object.create(ctor.prototype);
empty.props = Object.create(null);
empty.isShell = true;
return empty;
}
function isSimpleAnnotation(spec) {
if (!spec["!type"] || /^(fn\(|\[)/.test(spec["!type"])) return false;
for (var prop in spec)
if (prop != "!type" && prop != "!doc" && prop != "!url" && prop != "!span" && prop != "!data")
return false;
return true;
}
function passOne(base, spec, path) {
if (!base) {
var tp = spec["!type"];
if (tp) {
if (/^fn\(/.test(tp)) base = emptyObj(infer.Fn);
else if (tp.charAt(0) == "[") base = emptyObj(infer.Arr);
else throw new Error("Invalid !type spec: " + tp);
} else if (spec["!stdProto"]) {
base = infer.cx().protos[spec["!stdProto"]];
} else {
base = emptyObj(infer.Obj);
}
base.name = path;
}
for (var name in spec) if (hop(spec, name) && name.charCodeAt(0) != 33) {
var inner = spec[name];
if (typeof inner == "string" || isSimpleAnnotation(inner)) continue;
var prop = base.defProp(name);
passOne(prop.getObjType(), inner, path ? path + "." + name : name).propagate(prop);
}
return base;
}
function passTwo(base, spec, path) {
if (base.isShell) {
delete base.isShell;
var tp = spec["!type"];
if (tp) {
parseType(tp, path, base);
} else {
var proto = spec["!proto"] && parseType(spec["!proto"]);
infer.Obj.call(base, proto instanceof infer.Obj ? proto : true, path);
}
}
var effects = spec["!effects"];
if (effects && base instanceof infer.Fn) for (var i = 0; i < effects.length; ++i)
parseEffect(effects[i], base);
copyInfo(spec, base);
for (var name in spec) if (hop(spec, name) && name.charCodeAt(0) != 33) {
var inner = spec[name], known = base.defProp(name), innerPath = path ? path + "." + name : name;
if (typeof inner == "string") {
if (known.isEmpty()) parseType(inner, innerPath).propagate(known);
} else {
if (!isSimpleAnnotation(inner))
passTwo(known.getObjType(), inner, innerPath);
else if (known.isEmpty())
parseType(inner["!type"], innerPath, null, true).propagate(known);
else
continue;
if (inner["!doc"]) known.doc = inner["!doc"];
if (inner["!url"]) known.url = inner["!url"];
if (inner["!span"]) known.span = inner["!span"];
}
}
return base;
}
function copyInfo(spec, type) {
if (spec["!doc"]) type.doc = spec["!doc"];
if (spec["!url"]) type.url = spec["!url"];
if (spec["!span"]) type.span = spec["!span"];
if (spec["!data"]) type.metaData = spec["!data"];
}
function doLoadEnvironment(data, scope) {
var cx = infer.cx(), server = cx.parent
infer.addOrigin(cx.curOrigin = data["!name"] || "env#" + cx.origins.length);
cx.localDefs = cx.definitions[cx.curOrigin] = Object.create(null);
if (server) server.signal("preLoadDef", data)
passOne(scope, data);
var def = data["!define"];
if (def) {
for (var name in def) {
var spec = def[name];
cx.localDefs[name] = typeof spec == "string" ? parsePath(spec) : passOne(null, spec, name);
}
for (var name in def) {
var spec = def[name];
if (typeof spec != "string") passTwo(cx.localDefs[name], def[name], name);
}
}
passTwo(scope, data);
if (server) server.signal("postLoadDef", data)
cx.curOrigin = cx.localDefs = null;
}
exports.load = function(data, scope) {
if (!scope) scope = infer.cx().topScope;
var oldScope = currentTopScope;
currentTopScope = scope;
try {
doLoadEnvironment(data, scope);
} finally {
currentTopScope = oldScope;
}
};
exports.parse = function(data, origin, path) {
var cx = infer.cx();
if (origin) {
cx.origin = origin;
cx.localDefs = cx.definitions[origin];
}
try {
if (typeof data == "string")
return parseType(data, path);
else
return passTwo(passOne(null, data, path), data, path);
} finally {
if (origin) cx.origin = cx.localDefs = null;
}
};
// Used to register custom logic for more involved effect or type
// computation.
var customFunctions = Object.create(null);
infer.registerFunction = function(name, f) { customFunctions[name] = f; };
var IsCreated = infer.constraint({
construct: function(created, target, spec) {
this.created = created;
this.target = target;
this.spec = spec;
},
addType: function(tp) {
if (tp instanceof infer.Obj && this.created++ < 5) {
var derived = new infer.Obj(tp), spec = this.spec;
if (spec instanceof infer.AVal) spec = spec.getObjType(false);
if (spec instanceof infer.Obj) for (var prop in spec.props) {
var cur = spec.props[prop].types[0];
var p = derived.defProp(prop);
if (cur && cur instanceof infer.Obj && cur.props.value) {
var vtp = cur.props.value.getType(false);
if (vtp) p.addType(vtp);
}
}
this.target.addType(derived);
}
}
});
infer.registerFunction("Object_create", function(_self, args, argNodes) {
if (argNodes && argNodes.length && argNodes[0].type == "Literal" && argNodes[0].value == null)
return new infer.Obj();
var result = new infer.AVal;
if (args[0]) args[0].propagate(new IsCreated(0, result, args[1]));
return result;
});
var PropSpec = infer.constraint({
construct: function(target) { this.target = target; },
addType: function(tp) {
if (!(tp instanceof infer.Obj)) return;
if (tp.hasProp("value"))
tp.getProp("value").propagate(this.target);
else if (tp.hasProp("get"))
tp.getProp("get").propagate(new infer.IsCallee(infer.ANull, [], null, this.target));
}
});
infer.registerFunction("Object_defineProperty", function(_self, args, argNodes) {
if (argNodes && argNodes.length >= 3 && argNodes[1].type == "Literal" &&
typeof argNodes[1].value == "string") {
var obj = args[0], connect = new infer.AVal;
obj.propagate(new infer.DefProp(argNodes[1].value, connect, argNodes[1]));
args[2].propagate(new PropSpec(connect));
}
return infer.ANull;
});
infer.registerFunction("Object_defineProperties", function(_self, args, argNodes) {
if (args.length >= 2) {
var obj = args[0];
args[1].forAllProps(function(prop, val, local) {
if (!local) return;
var connect = new infer.AVal;
obj.propagate(new infer.DefProp(prop, connect, argNodes && argNodes[1]));
val.propagate(new PropSpec(connect));
});
}
return infer.ANull;
});
var IsBound = infer.constraint({
construct: function(self, args, target) {
this.self = self; this.args = args; this.target = target;
},
addType: function(tp) {
if (!(tp instanceof infer.Fn)) return;
this.target.addType(new infer.Fn(tp.name, infer.ANull, tp.args.slice(this.args.length),
tp.argNames.slice(this.args.length), tp.retval, tp.generator));
this.self.propagate(tp.self);
for (var i = 0; i < Math.min(tp.args.length, this.args.length); ++i)
this.args[i].propagate(tp.args[i]);
}
});
infer.registerFunction("Function_bind", function(self, args) {
if (!args.length) return infer.ANull;
var result = new infer.AVal;
self.propagate(new IsBound(args[0], args.slice(1), result));
return result;
});
infer.registerFunction("Array_ctor", function(_self, args) {
var arr = new infer.Arr;
if (args.length != 1 || !args[0].hasType(infer.cx().num)) {
var content = arr.getProp("<i>");
for (var i = 0; i < args.length; ++i) args[i].propagate(content);
}
return arr;
});
infer.registerFunction("Promise_ctor", function(_self, args, argNodes) {
var defs6 = infer.cx().definitions.ecma6
if (!defs6 || args.length < 1) return infer.ANull;
var self = new infer.Obj(defs6["Promise.prototype"]);
var valProp = self.defProp(":t", argNodes && argNodes[0]);
var valArg = new infer.AVal;
valArg.propagate(valProp);
var exec = new infer.Fn("execute", infer.ANull, [valArg], ["value"], infer.ANull);
var reject = defs6.Promise_reject;
args[0].propagate(new infer.IsCallee(infer.ANull, [exec, reject], null, infer.ANull));
return self;
});
var PromiseResolvesTo = infer.constraint({
construct: function(output) { this.output = output; },
addType: function(tp) {
if (tp.constructor == infer.Obj && tp.name == "Promise" && tp.hasProp(":t"))
tp.getProp(":t").propagate(this.output);
else
tp.propagate(this.output);
}
});
var WG_PROMISE_KEEP_VALUE = 50;
infer.registerFunction("Promise_then", function(self, args, argNodes) {
var fn = args.length && args[0].getFunctionType();
var defs6 = infer.cx().definitions.ecma6
if (!fn || !defs6) return self;
var result = new infer.Obj(defs6["Promise.prototype"]);
var value = result.defProp(":t", argNodes && argNodes[0]), ty;
if (fn.retval.isEmpty() && (ty = self.getType()) instanceof infer.Obj && ty.hasProp(":t"))
ty.getProp(":t").propagate(value, WG_PROMISE_KEEP_VALUE);
fn.retval.propagate(new PromiseResolvesTo(value));
return result;
});
infer.registerFunction("getOwnPropertySymbols", function(_self, args) {
if (!args.length) return infer.ANull
var result = new infer.AVal
args[0].forAllProps(function(prop, _val, local) {
if (local && prop.charAt(0) == ":") result.addType(infer.getSymbol(prop.slice(1)))
})
return result
})
infer.registerFunction("getSymbol", function(_self, _args, argNodes) {
if (argNodes.length && argNodes[0].type == "Literal" && typeof argNodes[0].value == "string")
return infer.getSymbol(argNodes[0].value)
else
return infer.ANull
})
return exports;
});

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,51 @@
(function(root, mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
return mod(exports);
if (typeof define == "function" && define.amd) // AMD
return define(["exports"], mod);
mod((root.tern || (root.tern = {})).signal = {}); // Plain browser env
})(this, function(exports) {
function on(type, f) {
var handlers = this._handlers || (this._handlers = Object.create(null));
(handlers[type] || (handlers[type] = [])).push(f);
}
function off(type, f) {
var arr = this._handlers && this._handlers[type];
if (arr) for (var i = 0; i < arr.length; ++i)
if (arr[i] == f) { arr.splice(i, 1); break; }
}
var noHandlers = []
function getHandlers(emitter, type) {
var arr = emitter._handlers && emitter._handlers[type];
return arr && arr.length ? arr.slice() : noHandlers
}
function signal(type, a1, a2, a3, a4) {
var arr = getHandlers(this, type)
for (var i = 0; i < arr.length; ++i) arr[i].call(this, a1, a2, a3, a4)
}
function signalReturnFirst(type, a1, a2, a3, a4) {
var arr = getHandlers(this, type)
for (var i = 0; i < arr.length; ++i) {
var result = arr[i].call(this, a1, a2, a3, a4)
if (result) return result
}
}
function hasHandler(type) {
var arr = this._handlers && this._handlers[type]
return arr && arr.length > 0 && arr
}
exports.mixin = function(obj) {
obj.on = on; obj.off = off;
obj.signal = signal;
obj.signalReturnFirst = signalReturnFirst;
obj.hasHandler = hasHandler;
return obj;
};
});

File diff suppressed because it is too large Load diff

View file

@ -88,58 +88,6 @@
type="org.eclipse.cdt.qt.core.launchConfigurationType">
</launchConfigurationTabGroup>
</extension>
<extension
point="org.eclipse.ui.handlers">
<handler
class="org.eclipse.cdt.qt.ui.handlers.ReloadAnalyzerHandler"
commandId="org.eclipse.cdt.qt.ui.commands.sampleCommand">
</handler>
</extension>
<extension
point="org.eclipse.ui.bindings">
<key
commandId="org.eclipse.cdt.qt.ui.commands.sampleCommand"
contextId="org.eclipse.ui.contexts.window"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+6">
</key>
</extension>
<extension
point="org.eclipse.ui.menus">
<menuContribution
locationURI="menu:help">
<command
commandId="org.eclipse.cdt.qt.ui.commands.sampleCommand"
id="org.eclipse.cdt.qt.ui.menus.sampleCommand"
mnemonic="R"
style="push">
</command>
</menuContribution>
<menuContribution
locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
<toolbar
id="org.eclipse.cdt.qt.ui.toolbars.sampleToolbar">
<command
commandId="org.eclipse.cdt.qt.ui.commands.sampleCommand"
icon="icons/sample.gif"
id="org.eclipse.cdt.qt.ui.toolbars.sampleCommand"
tooltip="Reloads the QML Anayzer Tern Server">
</command>
</toolbar>
</menuContribution>
</extension>
<extension
point="org.eclipse.ui.commands">
<category
id="org.eclipse.cdt.qt.ui.commands.category"
name="Qt Commands">
</category>
<command
categoryId="org.eclipse.cdt.qt.ui.commands.category"
id="org.eclipse.cdt.qt.ui.commands.sampleCommand"
name="Reload QML Analyzer">
</command>
</extension>
<extension
point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets">
<target