@@ -2,8 +2,10 @@ import { Base } from "./base.js";
22import { ExtendedAttributes } from "./extended-attributes.js" ;
33import { unescape , autoParenter } from "./helpers.js" ;
44
5+ /** @import {Tokeniser} from "../tokeniser.js" */
6+
57/**
6- * @param {import("../tokeniser.js"). Tokeniser } tokeniser
8+ * @param {Tokeniser } tokeniser
79 */
810function inheritance ( tokeniser ) {
911 const colon = tokeniser . consume ( ":" ) ;
@@ -19,7 +21,7 @@ function inheritance(tokeniser) {
1921/**
2022 * Parser callback.
2123 * @callback ParserCallback
22- * @param {import("../tokeniser.js"). Tokeniser } tokeniser
24+ * @param {Tokeniser } tokeniser
2325 * @param {...* } args
2426 */
2527
@@ -30,45 +32,11 @@ function inheritance(tokeniser) {
3032 */
3133
3234export class Container extends Base {
33- /**
34- * @param {import("../tokeniser.js").Tokeniser } tokeniser
35- * @param {* } instance TODO: This should be {T extends Container}, but see https://github.com/microsoft/TypeScript/issues/4628
36- * @param {* } args
37- */
38- static parse ( tokeniser , instance , { inheritable, allowedMembers } ) {
39- const { tokens, type } = instance ;
40- tokens . name =
41- tokeniser . consumeKind ( "identifier" ) ||
42- tokeniser . error ( `Missing name in ${ type } ` ) ;
43- tokeniser . current = instance ;
44- instance = autoParenter ( instance ) ;
45- if ( inheritable ) {
46- Object . assign ( tokens , inheritance ( tokeniser ) ) ;
47- }
48- tokens . open = tokeniser . consume ( "{" ) || tokeniser . error ( `Bodyless ${ type } ` ) ;
49- instance . members = [ ] ;
50- while ( true ) {
51- tokens . close = tokeniser . consume ( "}" ) ;
52- if ( tokens . close ) {
53- tokens . termination =
54- tokeniser . consume ( ";" ) ||
55- tokeniser . error ( `Missing semicolon after ${ type } ` ) ;
56- return instance . this ;
57- }
58- const ea = ExtendedAttributes . parse ( tokeniser ) ;
59- let mem ;
60- for ( const [ parser , ...args ] of allowedMembers ) {
61- mem = autoParenter ( parser ( tokeniser , ...args ) ) ;
62- if ( mem ) {
63- break ;
64- }
65- }
66- if ( ! mem ) {
67- tokeniser . error ( "Unknown member" ) ;
68- }
69- mem . extAttrs = ea ;
70- instance . members . push ( mem . this ) ;
71- }
35+ /** @type {any[] } */
36+ members ;
37+
38+ get type ( ) {
39+ return "" ;
7240 }
7341
7442 get partial ( ) {
@@ -125,3 +93,50 @@ export class Container extends Base {
12593 ) ;
12694 }
12795}
96+
97+ /**
98+ * @param {Tokeniser } tokeniser
99+ * @param {Container } instance
100+ * @param {object } args
101+ * @param {boolean } [args.inheritable]
102+ * @param {AllowedMember[] } [args.allowedMembers]
103+ */
104+ export function parseContainer (
105+ tokeniser ,
106+ instance ,
107+ { inheritable, allowedMembers } ,
108+ ) {
109+ const { tokens, type } = instance ;
110+ tokens . name =
111+ tokeniser . consumeKind ( "identifier" ) ||
112+ tokeniser . error ( `Missing name in ${ type } ` ) ;
113+ tokeniser . current = instance ;
114+ instance = autoParenter ( instance ) ;
115+ if ( inheritable ) {
116+ Object . assign ( tokens , inheritance ( tokeniser ) ) ;
117+ }
118+ tokens . open = tokeniser . consume ( "{" ) || tokeniser . error ( `Bodyless ${ type } ` ) ;
119+ instance . members = [ ] ;
120+ while ( true ) {
121+ tokens . close = tokeniser . consume ( "}" ) ;
122+ if ( tokens . close ) {
123+ tokens . termination =
124+ tokeniser . consume ( ";" ) ||
125+ tokeniser . error ( `Missing semicolon after ${ type } ` ) ;
126+ return instance . this ;
127+ }
128+ const ea = ExtendedAttributes . parse ( tokeniser ) ;
129+ let mem ;
130+ for ( const [ parser , ...args ] of allowedMembers ) {
131+ mem = autoParenter ( parser ( tokeniser , ...args ) ) ;
132+ if ( mem ) {
133+ break ;
134+ }
135+ }
136+ if ( ! mem ) {
137+ tokeniser . error ( "Unknown member" ) ;
138+ }
139+ mem . extAttrs = ea ;
140+ instance . members . push ( mem . this ) ;
141+ }
142+ }
0 commit comments