File tree Expand file tree Collapse file tree 2 files changed +45
-1
lines changed Expand file tree Collapse file tree 2 files changed +45
-1
lines changed Original file line number Diff line number Diff line change @@ -25,7 +25,8 @@ enum NodeType {
2525 String,
2626 Struct,
2727 Const,
28- Enum
28+ Enum,
29+ Restrict
2930}
3031
3132class Node {
@@ -333,6 +334,17 @@ class EnumNode : Node {
333334 }
334335}
335336
337+ class RestrictNode : Node {
338+ string ver;
339+
340+ this (ErrorInfo perror) {
341+ type = NodeType.Restrict;
342+ error = perror;
343+ }
344+
345+ override string toString () => format(" restrict %s" , ver);
346+ }
347+
336348class ParserError : Exception {
337349 this () {
338350 super (" " , " " , 0 );
@@ -767,6 +779,17 @@ class Parser {
767779 return ret;
768780 }
769781
782+ Node ParseRestrict () {
783+ auto ret = new RestrictNode(GetError());
784+ parsing = NodeType.Restrict;
785+
786+ Next();
787+ Expect(TokenType.Identifier);
788+ ret.ver = tokens[i].contents;
789+
790+ return ret;
791+ }
792+
770793 Node ParseStatement () {
771794 switch (tokens[i].type) {
772795 case TokenType.Integer: {
@@ -787,6 +810,7 @@ class Parser {
787810 case " version" : return ParseVersion();
788811 case " const" : return ParseConst();
789812 case " enum" : return ParseEnum();
813+ case " restrict" : return ParseRestrict();
790814 default : return new WordNode(GetError(), tokens[i].contents);
791815 }
792816 }
Original file line number Diff line number Diff line change @@ -20,6 +20,7 @@ class Preprocessor {
2020 string [] includeDirs;
2121 string [] included;
2222 string [] versions;
23+ string [] restricted;
2324
2425 final void Error (Char, A... )(ErrorInfo error, in Char[] fmt, A args) {
2526 ErrorBegin(error);
@@ -76,11 +77,30 @@ class Preprocessor {
7677 case NodeType.Enable: {
7778 auto node = cast (EnableNode) inode;
7879
80+ if (restricted.canFind(node.ver)) {
81+ Error(
82+ node.error, " Attempted to enable restricted version '%s'" ,
83+ node.ver
84+ );
85+ }
86+
7987 if (! versions.canFind(node.ver)) {
8088 version s ~= node.ver;
8189 }
8290 break ;
8391 }
92+ case NodeType.Restrict: {
93+ auto node = cast (RestrictNode) inode;
94+
95+ if (versions.canFind(node.ver)) {
96+ Error(
97+ node.error, " Restricted version '%s' is enabled" , node.ver
98+ );
99+ }
100+
101+ restricted ~= node.ver;
102+ break ;
103+ }
84104 default : {
85105 ret ~= inode;
86106 }
You can’t perform that action at this time.
0 commit comments