diff --git a/index.html b/index.html index 67ffd0ff..54c043a9 100644 --- a/index.html +++ b/index.html @@ -91,10 +91,10 @@

Documentation

Release history

-

13-09-2018: Version 0.22.2

+

27-09-2018: Version 0.22.3

Small update release that fixes crashes -affecting spread operator in object notation and rest operatore in object pattern.

+affecting spread operator in object notation, rest operatore in object pattern and export default anonymous class or function.

28-08-2018: Version 0.22

diff --git a/lib/infer.js b/lib/infer.js index 44707443..ce638bac 100644 --- a/lib/infer.js +++ b/lib/infer.js @@ -1153,7 +1153,7 @@ } }, ClassDeclaration: function(node, scope, c) { - addVar(scope, node.id) + if (node.id) addVar(scope, node.id); if (node.superClass) c(node.superClass, scope, "Expression") for (var i = 0; i < node.body.body.length; i++) c(node.body.body[i], scope) @@ -1660,18 +1660,26 @@ infer(node, node.scope || scope, ANull); }, + ObjectExpression: function(node, scope) { + infer(node, node.scope || scope, ANull); + }, + FunctionDeclaration: function(node, scope, c) { var inner = node.scope, fn = inner.fnType; connectParams(node, inner) c(node.body, inner, "Statement"); maybeTagAsInstantiated(node, fn) || maybeTagAsGeneric(fn); - scope.getProp(node.id.name).addType(fn) + if (node.id) scope.getProp(node.id.name).addType(fn); }, Statement: function(node, scope, c) { c(node, node.scope || scope) }, + ExportDefaultDeclaration: function(node, scope, c) { + c(node.declaration, node.scope || scope) + }, + VariableDeclaration: function(node, scope) { for (var i = 0; i < node.declarations.length; ++i) { var decl = node.declarations[i]; @@ -1686,7 +1694,8 @@ }, ClassDeclaration: function(node, scope) { - scope.getProp(node.id.name).addType(inferClass(node, scope, node.id.name)) + if (!node.id) inferClass(node, scope); + else scope.getProp(node.id.name).addType(inferClass(node, scope, node.id.name)) }, ReturnStatement: function(node, scope) { @@ -1893,9 +1902,15 @@ ObjectExpression: function(node) { return node.objType; }, + ClassDeclaration: function(node) { + return node.objType; + }, ClassExpression: function(node) { return node.objType; }, + FunctionDeclaration: function(node) { + return node.scope.fnType; + }, FunctionExpression: function(node) { return node.scope.fnType; }, diff --git a/lib/tern.js b/lib/tern.js index f4d5bbed..4d89cd6b 100644 --- a/lib/tern.js +++ b/lib/tern.js @@ -1149,5 +1149,5 @@ return {files: srv.files.map(function(f){return f.name;})}; } - exports.version = "0.22.2"; + exports.version = "0.22.3"; }); diff --git a/package.json b/package.json index 875a2d17..e86a09d7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tern", "license": "MIT", - "version": "0.22.2", + "version": "0.22.3", "author": "Marijn Haverbeke ", "description": "A JavaScript code analyzer for deep, cross-editor language support", "main": "lib/tern.js", diff --git a/plugin/es_modules.js b/plugin/es_modules.js index caf67f5c..870538b1 100644 --- a/plugin/es_modules.js +++ b/plugin/es_modules.js @@ -19,9 +19,9 @@ outObj.originNode = file.ast out.addType(outObj) } - var prop = outObj.defProp(prop, originNode) - prop.origin = file.name - type.propagate(prop) + var propObj = outObj.defProp(prop, originNode) + propObj.origin = file.name + type.propagate(propObj) } walk.simple(file.ast, { diff --git a/test/cases/es_modules/class.js b/test/cases/es_modules/class.js new file mode 100644 index 00000000..8af5fca8 --- /dev/null +++ b/test/cases/es_modules/class.js @@ -0,0 +1,4 @@ +export default class { + methodA() { + } +}; \ No newline at end of file diff --git a/test/cases/es_modules/func.js b/test/cases/es_modules/func.js new file mode 100644 index 00000000..fda957e1 --- /dev/null +++ b/test/cases/es_modules/func.js @@ -0,0 +1 @@ +export default function () { return true; } \ No newline at end of file diff --git a/test/cases/es_modules/main.js b/test/cases/es_modules/main.js index 10afd19b..53739d05 100644 --- a/test/cases/es_modules/main.js +++ b/test/cases/es_modules/main.js @@ -19,3 +19,16 @@ import * as reexp from "./reexp" reexp //:: {a: number, b: bool} import "./b" //+ "./blah" + +import C from "./class" + +(new C()). //+ methodA + +import f from "./func" + +f //: fn() -> bool + +import o from "./obj" + +o.propA //: number +o.propB //: string diff --git a/test/cases/es_modules/obj.js b/test/cases/es_modules/obj.js new file mode 100644 index 00000000..91945229 --- /dev/null +++ b/test/cases/es_modules/obj.js @@ -0,0 +1 @@ +export default {propA: 1, propB: "str"} \ No newline at end of file