mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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.
54 lines
1.8 KiB
C++
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
|
|
}
|