From 63485b5675aa57288ca910bce7683939bb29e01f Mon Sep 17 00:00:00 2001 From: angelozerr Date: Mon, 20 Apr 2015 18:10:21 +0200 Subject: [PATCH] Start implementation validation for mixed types. See https://github.com/angelozerr/tern-lint/issues/29 --- demos/Issue29.html | 138 +++++++++++++++++++++++++++++++++++++++++++++ lint.js | 20 ++++++- 2 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 demos/Issue29.html diff --git a/demos/Issue29.html b/demos/Issue29.html new file mode 100644 index 0000000..591ec96 --- /dev/null +++ b/demos/Issue29.html @@ -0,0 +1,138 @@ + + +CodeMirror: Tern Demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Tern Lint Demo

+

+ +

Demonstrates integration of Tern +and CodeMirror. The following keys are bound:

+ +
+
Ctrl-Space
Autocomplete
+
Ctrl-I
Find type at cursor
+
Alt-.
Jump to definition (Alt-, to jump back)
+
Ctrl-Q
Rename variable
+
+ +

Documentation is sparse for now. See the top of +the script for a rough API +overview.

+ + + +
diff --git a/lint.js b/lint.js index 6f5ef78..73fdd73 100644 --- a/lint.js +++ b/lint.js @@ -13,7 +13,8 @@ "NotAFunction" : {"severity" : "error"}, "InvalidArgument" : {"severity" : "error"}, "UnusedVariable" : {"severity" : "warning"}, - "UnknownModule" : {"severity" : "error"} + "UnknownModule" : {"severity" : "error"}, + "MixedReturnTypes": {"severity" : "warning"} }; function makeVisitors(server, query, file, messages) { @@ -265,6 +266,23 @@ var visitors = { VariableDeclaration: validateDeclaration, FunctionDeclaration: validateDeclaration, + ReturnStatement: function(node, state, c) { + if (!node.argument) return; + var rule = getRule("MixedReturnTypes"); + if (!rule) return; + if (state.fnType && state.fnType.retval && state.fnType.retval.types && state.fnType.retval.types.length > 1) { + var type = infer.expressionType({node: node.argument, state: state}), types = state.fnType.retval.types; + var expectedTypes = ""; + for (var i = 0; i < types.length; i++) { + var t = types[i]; + if (type != t) { + if (expectedTypes != "") expectedTypes+="|"; + expectedTypes+= getTypeName(t) + } + } + addMessage(node, "Cannot convert from " + getTypeName(type) + " to " + expectedTypes, rule.severity); + } + }, // Detects expressions of the form `object.property` MemberExpression: function(node, state, c) { var rule = getRule("UnknownProperty");