# JQL Parser

[![Atlassian license](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat-square)](LICENSE)

This library contains auto-generated sources from the [antlr4ts](https://github.com/tunnelvisionlabs/antlr4ts) 
library using the JQL ANTLR4 grammar. It enables consumers to parse a JQL query into a parse tree.

## Usage

```typescript
import { CharStreams, CommonTokenStream } from 'antlr4ts';
import { JQLLexer, JQLParser } from '@atlassianlabs/jql-parser';

// Create the lexer and parser
const jqlText = "project = JQL";
const charStream = CharStreams.fromString(jqlText);
const lexer = new JQLLexer(charStream);
const tokenStream = new CommonTokenStream(lexer);
const parser = new JQLParser(tokenStream);

// Parse the input, where `jqlQuery` is the entry point
const parsedJQLTree = parser.jqlQuery();
```

## Installation

```sh
yarn add @atlassianlabs/jql-parser
```

## Documentation

### Inspecting the parse tree

A JQL parse tree can be inspected using the `JQLParserListener` or `JQLParserVisitor`, you can read 
about the differences between the visitor/listener approaches [here](https://github.com/antlr/antlr4/blob/master/doc/listeners.md).

#### Listener Approach

```typescript
import { JQLParserListener, JqlQueryContext } from '@atlassianlabs/jql-parser';
import { ParseTreeWalker } from 'antlr4ts/tree/ParseTreeWalker';


class EnterQueryListener implements JQLParserListener {
    enterJqlQuery: (context: JqlQueryContext) {
        console.log(`Query start line number ${context._start.line}`);
        // ...
    }

    // other enterX functions...
}

// Create the listener
const listener: JQLParserListener = new EnterQueryListener();
// Use the entry point for listeners on the parsed JQL tree
ParseTreeWalker.DEFAULT.walk(listener, parsedJQLTree);
```

#### Visitor Approach

```typescript
import { JQLParserVisitor, JqlOperandContext } from '@atlassianlabs/jql-parser';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree/AbstractParseTreeVisitor';

// Extend the AbstractParseTreeVisitor to get default visitor behaviour
class CountOperandsVisitor extends AbstractParseTreeVisitor<number>
  implements JQLParserVisitor<number> {
  defaultResult() {
    return 0;
  }

  aggregateResult(aggregate: number, nextResult: number) {
    return aggregate + nextResult;
  }

  visitJqlOperand(context: JqlOperandContext): number {
    return 1 + super.visitChildren(context);
  }
}

// Create the visitor
const countOperandsVisitor = new CountOperandsVisitor()
// Use the visitor entry point with the parsed JQL tree
const numberOfOperands = countOperandsVisitor.visit(parsedJQLTree);
```

## Support

For developers outside of Atlassian looking for help, or to report issues, [please make a post on the community forum](https://community.developer.atlassian.com/c/atlassian-ecosystem-design).
We will monitor the forums and redirect topics to the appropriate maintainers.

## License
Copyright (c) 2021 - 2022 Atlassian and others. Apache 2.0 licensed, see [LICENSE](LICENSE) file.
