Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TypeError: Cannot read properties of undefined (reading 'fnType') #1057

Open
TrebledJ opened this issue Mar 2, 2025 · 0 comments
Open

TypeError: Cannot read properties of undefined (reading 'fnType') #1057

TrebledJ opened this issue Mar 2, 2025 · 0 comments

Comments

@TrebledJ
Copy link

TrebledJ commented Mar 2, 2025

I've been testing tern on some minified files, but tern doesn't like the following code. I've been banging my head on this for a while to no avail.

curl localhost:52433 -d '{"files":[{"type":"full","name":"test.js","text":"function f(){};try{}catch{f=function(){}}"}]}'

Output:

Request: {
  "files": [
    {
      "type": "full",
      "name": "test.js",
      "text": "function f(){};try{}catch{f=function(){}}"
    }
  ]
}
Response: {}

/Users/idc/idk/node_modules/tern/lib/infer.js:1444
      var inner = node.scope, fn = inner.fnType;
                                         ^

TypeError: Cannot read properties of undefined (reading 'fnType')
    at /Users/idc/idk/node_modules/tern/lib/infer.js:1444:42
    at /Users/idc/idk/node_modules/tern/lib/infer.js:1384:15
    at infer (/Users/idc/idk/node_modules/tern/lib/infer.js:1653:22)
    at /Users/idc/idk/node_modules/tern/lib/infer.js:1501:15
    at /Users/idc/idk/node_modules/tern/lib/infer.js:1384:15
    at infer (/Users/idc/idk/node_modules/tern/lib/infer.js:1653:22)
    at Object.Expression (/Users/idc/idk/node_modules/tern/lib/infer.js:1662:7)
    at c (/Users/idc/idk/node_modules/acorn-walk/dist/walk.js:58:37)
    at base.ExpressionStatement.base.ParenthesizedExpression (/Users/idc/idk/node_modules/acorn-walk/dist/walk.js:204:37)
    at c (/Users/idc/idk/node_modules/acorn-walk/dist/walk.js:58:37)

I've tried the following snippets too:

function f(){};try{}catch{f=function(){}} // error

function f(){}try{f=function(){}}catch{} // ok
function f(){}if(1){f=function(){}} // ok
function f(){} {f=function(){}} // ok

I've also tried this:

// index.js
// run: node index.js
const fs = require('fs');
const tern = require('./node_modules/tern/lib/tern');
const defb = JSON.parse(fs.readFileSync('./node_modules/tern/defs/browser.json').toString());
const s = new tern.Server({defs: [defb]});
s.addFile('test.js', 'function f(){};try{}catch{f=function(){}}');
s.flush();

Same error.

For what it's worth, I'm trying to use tern to parse minified browser JS files, and have a programmatic interface for LSP-like behaviour (go-to-definition / go-to-reference). I'm not sure if there are better suited tools out there, so this could just be me having xy problems. (I guess I'm just looking for a scope analyser.)

I'm not sure if I'm supposed to load a plugin or configure tern differently? I've skimmed and tried a few of the bundled plugins and browsed plugins available on GitHub, but they seem to mostly be for local development.


Edit:

I realise this may be a syntax thing.

function f(){};try{}catch(){f=function(){}}

(parentheses after catch) works fine. Apparently, catch binding is optional is ES2019.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant