19
19
#include " swift/AST/Module.h"
20
20
#include " swift/Basic/LangOptions.h"
21
21
#include " swift/Basic/SourceManager.h"
22
+ #include " swift/Basic/Version.h"
22
23
#include " swift/Parse/Parser.h"
23
24
#include " swift/Parse/SyntaxParseActions.h"
24
25
#include " swift/Parse/SyntaxRegexFallbackLexing.h"
@@ -58,6 +59,13 @@ class SynParser {
58
59
swiftparse_node_handler_t NodeHandler = nullptr ;
59
60
swiftparse_node_lookup_t NodeLookup = nullptr ;
60
61
swiftparse_diagnostic_handler_t DiagHandler = nullptr ;
62
+ // / The language version that should be used to parse the Swift source file.
63
+ // / If \c None this is the default langauge version specified in LangOptions.h
64
+ Optional<version::Version> EffectiveLanguageVersion;
65
+
66
+ // / Whether bare slash regex literals are enabled.
67
+ // / If \c None this is the default specified in LangOptions.h
68
+ Optional<bool > EnableBareSlashRegexLiteral;
61
69
62
70
public:
63
71
swiftparse_node_handler_t getNodeHandler () const {
@@ -90,6 +98,17 @@ class SynParser {
90
98
Block_release (prevBlk);
91
99
}
92
100
101
+ void setLanguageVersion (const char *versionString) {
102
+ if (auto version = version::Version::parseVersionString (
103
+ versionString, SourceLoc (), /* Diags=*/ nullptr )) {
104
+ this ->EffectiveLanguageVersion = version;
105
+ }
106
+ }
107
+
108
+ void setEnableBareSlashRegexLiteral (bool EnableBareSlashRegexLiteral) {
109
+ this ->EnableBareSlashRegexLiteral = EnableBareSlashRegexLiteral;
110
+ }
111
+
93
112
~SynParser () {
94
113
setNodeHandler (nullptr );
95
114
setNodeLookup (nullptr );
@@ -493,7 +512,12 @@ swiftparse_client_node_t SynParser::parse(const char *source, size_t len) {
493
512
494
513
// Always enable bare /.../ regex literal in syntax parser.
495
514
langOpts.EnableExperimentalStringProcessing = true ;
496
- langOpts.EnableBareSlashRegexLiterals = true ;
515
+ if (EnableBareSlashRegexLiteral && *EnableBareSlashRegexLiteral) {
516
+ langOpts.EnableBareSlashRegexLiterals = true ;
517
+ }
518
+ if (EffectiveLanguageVersion) {
519
+ langOpts.EffectiveLanguageVersion = *EffectiveLanguageVersion;
520
+ }
497
521
498
522
auto parseActions =
499
523
std::make_shared<CLibParseActions>(*this , SM, bufID);
@@ -517,6 +541,18 @@ swiftparse_parser_create(void) {
517
541
return new SynParser ();
518
542
}
519
543
544
+ void swiftparse_parser_set_language_version (swiftparse_parser_t c_parser,
545
+ const char *version) {
546
+ SynParser *parser = static_cast <SynParser *>(c_parser);
547
+ parser->setLanguageVersion (version);
548
+ }
549
+
550
+ void swiftparse_parser_set_enable_bare_slash_regex_literal (
551
+ swiftparse_parser_t c_parser, bool enabled) {
552
+ SynParser *parser = static_cast <SynParser *>(c_parser);
553
+ parser->setEnableBareSlashRegexLiteral (enabled);
554
+ }
555
+
520
556
void
521
557
swiftparse_parser_dispose (swiftparse_parser_t c_parser) {
522
558
SynParser *parser = static_cast <SynParser*>(c_parser);
0 commit comments