Skip to content

Commit 821d374

Browse files
authored
Merge pull request #67826 from hamishknight/experimental
2 parents dade932 + 35a98f3 commit 821d374

File tree

14 files changed

+72
-9
lines changed

14 files changed

+72
-9
lines changed

include/swift/AST/CASTBridging.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,9 @@ void Diagnostic_finish(BridgedDiagnostic cDiag);
247247
BridgedIdentifier ASTContext_getIdentifier(BridgedASTContext cContext,
248248
BridgedString cStr);
249249

250+
_Bool ASTContext_langOptsHasFeature(BridgedASTContext cContext,
251+
BridgedFeature feature);
252+
250253
void *ImportDecl_create(BridgedASTContext cContext,
251254
BridgedDeclContext cDeclContext,
252255
BridgedSourceLoc cImportLoc, char kind,

include/swift/Basic/CBasicBridging.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
// layering. i.e. Darwin overlay is created by Swift compiler.
2323

2424
SWIFT_BEGIN_NULLABILITY_ANNOTATIONS
25-
SWIFT_BEGIN_ASSUME_NONNULL
2625

2726
#ifdef __cplusplus
2827
extern "C" {
@@ -31,6 +30,14 @@ extern "C" {
3130

3231
#endif
3332

33+
typedef enum ENUM_EXTENSIBILITY_ATTR(open) BridgedFeature {
34+
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
35+
FeatureName,
36+
#include "swift/Basic/Features.def"
37+
} BridgedFeature;
38+
39+
SWIFT_BEGIN_ASSUME_NONNULL
40+
3441
typedef struct BridgedData {
3542
const char *_Nullable baseAddress;
3643
unsigned long size;

lib/AST/CASTBridging.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ BridgedIdentifier ASTContext_getIdentifier(BridgedASTContext cContext,
176176
return {convertASTContext(cContext).getIdentifier(str).getAsOpaquePointer()};
177177
}
178178

179+
bool ASTContext_langOptsHasFeature(BridgedASTContext cContext,
180+
BridgedFeature feature) {
181+
return convertASTContext(cContext).LangOpts.hasFeature((Feature)feature);
182+
}
183+
179184
void *ImportDecl_create(BridgedASTContext cContext,
180185
BridgedDeclContext cDeclContext,
181186
BridgedSourceLoc cImportLoc, char kind,

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import CASTBridging
22
import SwiftParser
3+
4+
// Needed to use SyntaxTransformVisitor's visit method.
5+
@_spi(SyntaxTransformVisitor)
36
import SwiftSyntax
47

58
extension Array {

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import CASTBridging
22
import SwiftParser
3+
4+
// Needed to use SyntaxTransformVisitor's visit method.
5+
@_spi(SyntaxTransformVisitor)
36
import SwiftSyntax
47

58
extension ASTGenVisitor {

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import CASTBridging
22
import SwiftParser
3+
4+
// Needed to use SyntaxTransformVisitor's visit method.
5+
@_spi(SyntaxTransformVisitor)
36
import SwiftSyntax
47

58
extension ASTGenVisitor {

lib/ASTGen/Sources/ASTGen/Generics.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import CASTBridging
22
import SwiftParser
3+
4+
// Needed to use SyntaxTransformVisitor's visit method.
5+
@_spi(SyntaxTransformVisitor)
36
import SwiftSyntax
47

58
extension ASTGenVisitor {

lib/ASTGen/Sources/ASTGen/Macros.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@ import CASTBridging
1414
import SwiftDiagnostics
1515
import SwiftOperators
1616
import SwiftParser
17-
import SwiftSyntax
1817
import SwiftSyntaxBuilder
1918
import SwiftSyntaxMacros
2019
import SwiftSyntaxMacroExpansion
2120
import SwiftCompilerPluginMessageHandling
2221

22+
// Needed to use SyntaxTransformVisitor's visit method.
23+
@_spi(SyntaxTransformVisitor)
24+
import SwiftSyntax
25+
2326
extension SyntaxProtocol {
2427
func token(at position: AbsolutePosition) -> TokenSyntax? {
2528
// If the position isn't within this node at all, return early.

lib/ASTGen/Sources/ASTGen/Misc.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import CASTBridging
22
import SwiftParser
3+
4+
// Needed to use SyntaxTransformVisitor's visit method.
5+
@_spi(SyntaxTransformVisitor)
36
import SwiftSyntax
47

58
extension ASTGenVisitor {

lib/ASTGen/Sources/ASTGen/SourceFile.swift

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
import CBasicBridging
2+
import CASTBridging
3+
14
import SwiftDiagnostics
2-
import SwiftParser
35
import SwiftSyntax
46
import SwiftParserDiagnostics
57

8+
@_spi(ExperimentalLanguageFeatures)
9+
import SwiftParser
10+
611
/// Describes a source file that has been "exported" to the C++ part of the
712
/// compiler, with enough information to interface with the C++ layer.
813
struct ExportedSourceFile {
@@ -20,15 +25,31 @@ struct ExportedSourceFile {
2025
let syntax: SourceFileSyntax
2126
}
2227

28+
extension Parser.ExperimentalFeatures {
29+
init(from context: BridgedASTContext?) {
30+
self = []
31+
guard let context = context else { return }
32+
33+
func mapFeature(_ bridged: BridgedFeature, to feature: Self) {
34+
if ASTContext_langOptsHasFeature(context, bridged) {
35+
insert(feature)
36+
}
37+
}
38+
}
39+
}
40+
2341
/// Parses the given source file and produces a pointer to a new
2442
/// ExportedSourceFile instance.
2543
@_cdecl("swift_ASTGen_parseSourceFile")
2644
public func parseSourceFile(
2745
buffer: UnsafePointer<UInt8>, bufferLength: Int,
28-
moduleName: UnsafePointer<UInt8>, filename: UnsafePointer<UInt8>
46+
moduleName: UnsafePointer<UInt8>, filename: UnsafePointer<UInt8>,
47+
ctxPtr: UnsafeMutableRawPointer?
2948
) -> UnsafeRawPointer {
3049
let buffer = UnsafeBufferPointer(start: buffer, count: bufferLength)
31-
let sourceFile = Parser.parse(source: buffer)
50+
51+
let ctx = ctxPtr.map { BridgedASTContext(raw: $0) }
52+
let sourceFile = Parser.parse(source: buffer, experimentalFeatures: .init(from: ctx))
3253

3354
let exportedPtr = UnsafeMutablePointer<ExportedSourceFile>.allocate(capacity: 1)
3455
exportedPtr.initialize(

lib/ASTGen/Sources/ASTGen/Stmts.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import CASTBridging
22
import SwiftParser
3+
4+
// Needed to use SyntaxTransformVisitor's visit method.
5+
@_spi(SyntaxTransformVisitor)
36
import SwiftSyntax
47

58
extension ASTGenVisitor {

lib/ASTGen/Sources/ASTGen/Types.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import CASTBridging
22
import SwiftParser
3+
4+
// Needed to use SyntaxTransformVisitor's visit method.
5+
@_spi(SyntaxTransformVisitor)
36
import SwiftSyntax
47

58
extension ASTGenVisitor {

lib/Frontend/PrintingDiagnosticConsumer.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ extern "C" void swift_ASTGen_renderQueuedDiagnostics(
6060
extern "C" void *swift_ASTGen_parseSourceFile(const char *buffer,
6161
size_t bufferLength,
6262
const char *moduleName,
63-
const char *filename);
63+
const char *filename,
64+
void *_Nullable ctx);
6465
extern "C" void swift_ASTGen_destroySourceFile(void *sourceFile);
6566

6667
namespace {
@@ -1047,7 +1048,7 @@ void PrintingDiagnosticConsumer::queueBuffer(
10471048
auto bufferContents = sourceMgr.getEntireTextForBuffer(bufferID);
10481049
auto sourceFile = swift_ASTGen_parseSourceFile(
10491050
bufferContents.data(), bufferContents.size(),
1050-
"module", "file.swift");
1051+
"module", "file.swift", /*ctx*/ nullptr);
10511052

10521053
// Find the parent and position in parent, if there is one.
10531054
int parentID = -1;

lib/Parse/ParseDecl.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "swift/AST/ASTWalker.h"
1818
#include "swift/AST/Attr.h"
19+
#include "swift/AST/CASTBridging.h"
1920
#include "swift/AST/DebuggerClient.h"
2021
#include "swift/AST/Decl.h"
2122
#include "swift/AST/DiagnosticsParse.h"
@@ -175,7 +176,8 @@ static void appendToVector(void *declPtr, void *vecPtr) {
175176
extern "C" void *swift_ASTGen_parseSourceFile(const char *buffer,
176177
size_t bufferLength,
177178
const char *moduleName,
178-
const char *filename);
179+
const char *filename,
180+
void *_Nullable ctx);
179181

180182
/// Destroy a source file parsed with swift_ASTGen_parseSourceFile.
181183
extern "C" void swift_ASTGen_destroySourceFile(void *sourceFile);
@@ -328,7 +330,7 @@ void *ExportedSourceFileRequest::evaluate(Evaluator &evaluator,
328330
auto exportedSourceFile = swift_ASTGen_parseSourceFile(
329331
contents.begin(), contents.size(),
330332
SF->getParentModule()->getName().str().str().c_str(),
331-
SF->getFilename().str().c_str());
333+
SF->getFilename().str().c_str(), &ctx);
332334

333335
ctx.addCleanup([exportedSourceFile] {
334336
swift_ASTGen_destroySourceFile(exportedSourceFile);

0 commit comments

Comments
 (0)