@@ -4,6 +4,7 @@ module.exports = parse;
4
4
parse . filename = null ;
5
5
parse . defaults = { keepCase : false } ;
6
6
7
+ const { hasOwnProperty } = require ( "tslint/lib/utils" ) ;
7
8
var tokenize = require ( "./tokenize" ) ,
8
9
Root = require ( "./root" ) ,
9
10
Type = require ( "./type" ) ,
@@ -25,7 +26,8 @@ var base10Re = /^[1-9][0-9]*$/,
25
26
numberRe = / ^ (? ! [ e E ] ) [ 0 - 9 ] * (?: \. [ 0 - 9 ] * ) ? (?: [ e E ] [ + - ] ? [ 0 - 9 ] + ) ? $ / ,
26
27
nameRe = / ^ [ a - z A - Z _ ] [ a - z A - Z _ 0 - 9 ] * $ / ,
27
28
typeRefRe = / ^ (?: \. ? [ a - z A - Z _ ] [ a - z A - Z _ 0 - 9 ] * ) (?: \. [ a - z A - Z _ ] [ a - z A - Z _ 0 - 9 ] * ) * $ / ,
28
- fqTypeRefRe = / ^ (?: \. [ a - z A - Z _ ] [ a - z A - Z _ 0 - 9 ] * ) + $ / ;
29
+ fqTypeRefRe = / ^ (?: \. [ a - z A - Z _ ] [ a - z A - Z _ 0 - 9 ] * ) + $ / ,
30
+ featuresRefRe = / f e a t u r e s \. ( [ a - z A - Z _ ] * ) / ;
29
31
30
32
/**
31
33
* Result object returned from {@link parse}.
@@ -312,6 +314,7 @@ function parse(source, root, options) {
312
314
case "extend" :
313
315
parseExtension ( parent , token ) ;
314
316
return true ;
317
+
315
318
}
316
319
return false ;
317
320
}
@@ -480,7 +483,7 @@ function parse(source, root, options) {
480
483
parseOption ( type , token ) ;
481
484
skip ( ";" ) ;
482
485
break ;
483
-
486
+
484
487
case "required" :
485
488
case "repeated" :
486
489
parseField ( type , token ) ;
@@ -611,6 +614,11 @@ function parse(source, root, options) {
611
614
this . options = { } ;
612
615
this . options [ name ] = value ;
613
616
} ;
617
+ dummy . setFeature = function ( name , value ) {
618
+ if ( this . features === undefined )
619
+ this . features = { } ;
620
+ this . features [ name ] = value ;
621
+ } ;
614
622
ifBlock ( dummy , function parseEnumValue_block ( token ) {
615
623
616
624
/* istanbul ignore else */
@@ -623,33 +631,40 @@ function parse(source, root, options) {
623
631
} , function parseEnumValue_line ( ) {
624
632
parseInlineOptions ( dummy ) ; // skip
625
633
} ) ;
626
- parent . add ( token , value , dummy . comment , dummy . options ) ;
634
+ parent . add ( token , value , dummy . comment , dummy . options , dummy . features ) ;
627
635
}
628
636
629
637
function parseOption ( parent , token ) {
638
+ if ( featuresRefRe . test ( token = next ( ) ) ) {
639
+ var name = token . match ( featuresRefRe ) [ 1 ]
640
+ skip ( "=" ) ;
641
+ setFeature ( parent , name , token = next ( ) )
642
+ } else {
630
643
var isCustom = skip ( "(" , true ) ;
631
644
if ( ! typeRefRe . test ( token = next ( ) ) )
632
645
throw illegal ( token , "name" ) ;
633
-
634
- var name = token ;
635
- var option = name ;
636
- var propName ;
637
-
638
- if ( isCustom ) {
639
- skip ( ")" ) ;
640
- name = "(" + name + ")" ;
641
- option = name ;
642
- token = peek ( ) ;
643
- if ( fqTypeRefRe . test ( token ) ) {
644
- propName = token . slice ( 1 ) ; //remove '.' before property name
645
- name += token ;
646
- next ( ) ;
646
+
647
+
648
+ var name = token ;
649
+ var option = name ;
650
+ var propName ;
651
+
652
+ if ( isCustom ) {
653
+ skip ( ")" ) ;
654
+ name = "(" + name + ")" ;
655
+ option = name ;
656
+ token = peek ( ) ;
657
+ if ( fqTypeRefRe . test ( token ) ) {
658
+ propName = token . slice ( 1 ) ; //remove '.' before property name
659
+ name += token ;
660
+ next ( ) ;
661
+ }
647
662
}
648
- }
649
663
650
- skip ( "=" ) ;
651
- var optionValue = parseOptionValue ( parent , name ) ;
652
- setParsedOption ( parent , option , optionValue , propName ) ;
664
+ skip ( "=" ) ;
665
+ var optionValue = parseOptionValue ( parent , name ) ;
666
+ setParsedOption ( parent , option , optionValue , propName ) ;
667
+ }
653
668
}
654
669
655
670
function parseOptionValue ( parent , name ) {
@@ -720,6 +735,12 @@ function parse(source, root, options) {
720
735
parent . setOption ( name , value ) ;
721
736
}
722
737
738
+ function setFeature ( parent , name , value ) {
739
+ if ( parent . setFeature ) {
740
+ parent . setFeature ( name , value ) ;
741
+ }
742
+ }
743
+
723
744
function setParsedOption ( parent , name , value , propName ) {
724
745
if ( parent . setParsedOption )
725
746
parent . setParsedOption ( name , value , propName ) ;
0 commit comments