1919#include " swift/AST/Module.h"
2020#include " swift/Basic/LangOptions.h"
2121#include " swift/Basic/SourceManager.h"
22+ #include " swift/Basic/Version.h"
2223#include " swift/Parse/Parser.h"
2324#include " swift/Parse/SyntaxParseActions.h"
2425#include " swift/Parse/SyntaxRegexFallbackLexing.h"
@@ -58,6 +59,13 @@ class SynParser {
5859 swiftparse_node_handler_t NodeHandler = nullptr ;
5960 swiftparse_node_lookup_t NodeLookup = nullptr ;
6061 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;
6169
6270public:
6371 swiftparse_node_handler_t getNodeHandler () const {
@@ -90,6 +98,17 @@ class SynParser {
9098 Block_release (prevBlk);
9199 }
92100
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+
93112 ~SynParser () {
94113 setNodeHandler (nullptr );
95114 setNodeLookup (nullptr );
@@ -493,7 +512,12 @@ swiftparse_client_node_t SynParser::parse(const char *source, size_t len) {
493512
494513 // Always enable bare /.../ regex literal in syntax parser.
495514 langOpts.EnableExperimentalStringProcessing = true ;
496- langOpts.EnableBareSlashRegexLiterals = true ;
515+ if (EnableBareSlashRegexLiteral && *EnableBareSlashRegexLiteral) {
516+ langOpts.EnableBareSlashRegexLiterals = true ;
517+ }
518+ if (EffectiveLanguageVersion) {
519+ langOpts.EffectiveLanguageVersion = *EffectiveLanguageVersion;
520+ }
497521
498522 auto parseActions =
499523 std::make_shared<CLibParseActions>(*this , SM, bufID);
@@ -517,6 +541,18 @@ swiftparse_parser_create(void) {
517541 return new SynParser ();
518542}
519543
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+
520556void
521557swiftparse_parser_dispose (swiftparse_parser_t c_parser) {
522558 SynParser *parser = static_cast <SynParser*>(c_parser);
0 commit comments