Git Product home page Git Product logo

Comments (6)

andrew-coleman avatar andrew-coleman commented on August 15, 2024

Hi - this is an interesting topic. I briefly looked at this a while back for the jsonata exerciser, which uses CodeMirror for the editor panels. Although it wouldn't be part of the core jsonata runtime, a component that supports code completion would be a really useful addition, especially if written in a way that could be plugged into different editor frameworks.

It would be great if you are interested in working on this. I'm not familiar with peg.js, although I do have some experience with BNF grammars. However, the JSONata parser is not generated from a BNF grammar but rather hand coded using Pratt's top-down operator precedence algorithm (see here for an excellent description). The code for it is here and the relative operator precedences are defined here. I imagine a grammar could be derived from this. Let me know if you need anything.

from jsonata.

Allam76 avatar Allam76 commented on August 15, 2024

Hmm, as I expected, the code and operator precedences are a bit too off to make a grammar file from. That leaves me two options:

  1. Modify the jsonata source particularly in the evaluateVariable and evaluateLiteral functions and somehow lookup the schemas from there. I have some experience building a code completion this way and found that it is quite intrusive:-(

  2. Use the JMESpath grammar, which should be similar, add the missing pieces on top. Much less intrusive but unsure how to organize the output structuring.

Give me a hint if you have any of these sounds better.
Cheers
Martin

from jsonata.

Allam76 avatar Allam76 commented on August 15, 2024

I added a simple code completion that can be seen in this repo: github. The error messages are enhanced with a proposal object. Check out the tests.

It uses a framework object to decide how the proposals are used. In this case it is a json schema. Only the source has code completion, for target we can use a normal json schema tool, there are plenty of these.

Not all is there, we should have support both for variables and function parameters. However, I'm not sure how to extract the assigned variables. Same for the functions and then the function parameter types. Also the global variable should be addressed.

If someone could point out how to get the assigned variables and functions, then I could continue with the rest.

/Martin

from jsonata.

andrew-coleman avatar andrew-coleman commented on August 15, 2024

All variables are held in the environment which is a stack of frame objects created here:
https://github.com/jsonata-js/jsonata/blob/master/jsonata.js#L4048
This environment is passed around the variable evaluate functions during expression evaluation.
The frames all link back to a global staticFrame object which contains all the built in functions (note that functions are just variables that bind to function bodies). The frame object contains methods bind and lookup. We might need to add an entries method to list all of the in-scope bindings in order to support what you need.

from jsonata.

Allam76 avatar Allam76 commented on August 15, 2024

Super! That should point me in the right direction. We would also have to deal with scopes and that can be a bit tricky... I'll see what makes sense.

from jsonata.

andrew-coleman avatar andrew-coleman commented on August 15, 2024

Closing this issue since I think there is no more work here. Re-open if you disagree.

from jsonata.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.