1
- import { Node , Origin , Point , Position } from "../" ;
1
+ import { Node , Origin , Point , Position , Source } from "../" ;
2
2
import { ParserRuleContext , ParseTree , TerminalNode , Token } from "antlr4ng" ;
3
3
4
4
// Note: we cannot provide Kolasu-style extension methods on ParseTree because it's an interface.
@@ -12,27 +12,27 @@ declare module "../model/position" {
12
12
}
13
13
// eslint-disable-next-line @typescript-eslint/no-namespace
14
14
export namespace Position {
15
- export function ofParseTree ( parseTree : ParseTree ) : Position | undefined ;
15
+ export function ofParseTree ( parseTree : ParseTree , source ?: Source ) : Position | undefined ;
16
16
export function ofToken ( token : Token ) : Position ;
17
17
export function ofTokenStart ( token : Token ) : Position ;
18
18
export function ofTokenEnd ( token : Token ) : Position ;
19
19
}
20
20
}
21
21
22
- export function positionOfParseTree ( parseTree : ParseTree ) : Position | undefined {
22
+ export function positionOfParseTree ( parseTree : ParseTree , source ?: Source ) : Position | undefined {
23
23
if ( parseTree instanceof ParserRuleContext ) {
24
24
const startToken = parseTree . start ;
25
25
const stopToken = parseTree . stop ;
26
26
27
27
if ( startToken ) {
28
28
if ( stopToken ) {
29
- return new Position ( Point . ofTokenStart ( startToken ) , Point . ofTokenEnd ( stopToken ) ) ;
29
+ return new Position ( Point . ofTokenStart ( startToken ) , Point . ofTokenEnd ( stopToken ) , source ) ;
30
30
} else {
31
- return Point . ofTokenStart ( startToken ) . asPosition ( ) ;
31
+ return Point . ofTokenStart ( startToken ) . asPosition ( source ) ;
32
32
}
33
33
}
34
34
} else if ( parseTree instanceof TerminalNode ) {
35
- return new Position ( Point . ofTokenStart ( parseTree . symbol ) , Point . ofTokenEnd ( parseTree . symbol ) ) ;
35
+ return new Position ( Point . ofTokenStart ( parseTree . symbol ) , Point . ofTokenEnd ( parseTree . symbol ) , source ) ;
36
36
}
37
37
}
38
38
@@ -60,12 +60,12 @@ Position.ofToken = function (token: Token): Position {
60
60
}
61
61
62
62
export class ParseTreeOrigin extends Origin {
63
- constructor ( public parseTree ?: ParseTree ) {
63
+ constructor ( public parseTree ?: ParseTree , protected readonly _source ?: Source ) {
64
64
super ( ) ;
65
65
}
66
66
67
67
get position ( ) : Position | undefined {
68
- return this . parseTree ? Position . ofParseTree ( this . parseTree ) : undefined ;
68
+ return this . parseTree ? Position . ofParseTree ( this . parseTree , this . _source ) : undefined ;
69
69
}
70
70
71
71
get sourceText ( ) : string | undefined {
@@ -77,12 +77,17 @@ export class ParseTreeOrigin extends Origin {
77
77
return undefined ;
78
78
}
79
79
}
80
+
81
+
82
+ get source ( ) : Source | undefined {
83
+ return this . _source ;
84
+ }
80
85
}
81
86
82
87
declare module '../model/model' {
83
88
export interface Node {
84
89
parseTree ?: ParseTree ;
85
- withParseTreeNode ( parseTree ?: ParseTree | null ) : this;
90
+ withParseTreeNode ( parseTree ?: ParseTree | null , source ?: Source ) : this;
86
91
}
87
92
}
88
93
@@ -92,15 +97,15 @@ declare module 'antlr4ng' {
92
97
}
93
98
}
94
99
95
- export function withParseTreeNode ( node : Node , parseTree ?: ParseTree | null ) : Node {
100
+ export function withParseTreeNode ( node : Node , parseTree ?: ParseTree | null , source ?: Source ) : Node {
96
101
if ( parseTree ) {
97
- node . origin = new ParseTreeOrigin ( parseTree ) ;
102
+ node . origin = new ParseTreeOrigin ( parseTree , source ) ;
98
103
}
99
104
return node ;
100
105
}
101
106
102
- Node . prototype . withParseTreeNode = function ( parseTree ) {
103
- return withParseTreeNode ( this , parseTree ) ;
107
+ Node . prototype . withParseTreeNode = function ( parseTree , source ) {
108
+ return withParseTreeNode ( this , parseTree , source ) ;
104
109
}
105
110
106
111
Object . defineProperty ( Node . prototype , "parseTree" , {
0 commit comments