Files
swift-mirror/lib/Parse/ParseRegex.cpp
Rintaro Ishizaki 47f18d492e [ASTGen] Move regex literal parsing from SwiftCompilerSources to ASTGen
ASTGen always builds with the host Swift compiler, without requiring
bootstrapping, and is enabled in more places. Move the regex literal
parsing logic there so it is enabled in more host environments, and
makes use of CMake's Swift support. Enable all of the regex literal
tests when ASTGen is built, to ensure everything is working.

Remove the "AST" and "Parse" Swift modules from SwiftCompilerSources,
because they are no longer needed.
2023-11-16 10:59:23 -08:00

54 lines
1.8 KiB
C++

//===--- ParseRegex.cpp - Regular expression literal parsing --------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2021 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// Regular expression literal parsing
//
//===----------------------------------------------------------------------===//
#include "swift/AST/DiagnosticsParse.h"
#include "swift/Bridging/ASTGen.h"
#include "swift/Parse/Parser.h"
using namespace swift;
ParserResult<Expr> Parser::parseExprRegexLiteral() {
assert(Tok.is(tok::regex_literal));
#if SWIFT_BUILD_REGEX_PARSER_IN_COMPILER
auto regexText = Tok.getText();
// Let the Swift library parse the contents, returning an error, or null if
// successful.
size_t version = 0;
auto capturesBuf = Context.AllocateUninitialized<uint8_t>(
RegexLiteralExpr::getCaptureStructureSerializationAllocationSize(
regexText.size()));
bool hadError = swift_ASTGen_parseRegexLiteral(
regexText,
/*versionOut=*/&version,
/*captureStructureOut=*/capturesBuf.data(),
/*captureStructureSize=*/capturesBuf.size(),
/*diagBaseLoc=*/Tok.getLoc(), &Diags);
auto loc = consumeToken();
SourceMgr.recordRegexLiteralStartLoc(loc);
if (hadError) {
return makeParserResult(new (Context) ErrorExpr(loc));
}
assert(version >= 1);
return makeParserResult(RegexLiteralExpr::createParsed(
Context, loc, regexText, version, capturesBuf));
#else
llvm_unreachable("Lexer should not emit tok::regex_literal");
#endif
}