Skip to content

[NFC][ASTGen] Add wrapping structs for commonly bridged types #66044

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
390 changes: 230 additions & 160 deletions include/swift/AST/CASTBridging.h

Large diffs are not rendered by default.

918 changes: 498 additions & 420 deletions lib/AST/CASTBridging.cpp

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions lib/ASTGen/Sources/ASTGen/ASTGen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,14 @@ enum ASTNode {
}
}

func bridged() -> ASTNodeBridged {
var bridged: BridgedASTNode {
switch self {
case .expr(let e):
return ASTNodeBridged(ptr: e, kind: .expr)
return BridgedASTNode(ptr: e, kind: .expr)
case .stmt(let s):
return ASTNodeBridged(ptr: s, kind: .stmt)
return BridgedASTNode(ptr: s, kind: .stmt)
case .decl(let d):
return ASTNodeBridged(ptr: d, kind: .decl)
return BridgedASTNode(ptr: d, kind: .decl)
default:
fatalError("Must be expr, stmt, or decl.")
}
Expand All @@ -66,10 +66,10 @@ class Boxed<Value> {
struct ASTGenVisitor: SyntaxTransformVisitor {
typealias ResultType = ASTNode

let ctx: UnsafeMutableRawPointer
let base: UnsafePointer<UInt8>
let ctx: BridgedASTContext
let base: UnsafeBufferPointer<UInt8>

@Boxed var declContext: UnsafeMutableRawPointer
@Boxed var declContext: BridgedDeclContext

// TODO: this some how messes up the witness table when I uncomment it locally :/
// public func visit<T>(_ node: T?) -> [UnsafeMutableRawPointer]? {
Expand All @@ -90,15 +90,15 @@ struct ASTGenVisitor: SyntaxTransformVisitor {
var out = [UnsafeMutableRawPointer]()

for element in node.statements {
let loc = self.base.advanced(by: element.position.utf8Offset).raw
let loc = bridgedSourceLoc(for: element)
let swiftASTNodes = visit(element)
switch swiftASTNodes {
case .decl(let d):
out.append(d)
case .stmt(let s):
out.append(SwiftTopLevelCodeDecl_createStmt(ctx, declContext, loc, s, loc))
out.append(TopLevelCodeDecl_createStmt(ctx, declContext, loc, s, loc))
case .expr(let e):
out.append(SwiftTopLevelCodeDecl_createExpr(ctx, declContext, loc, e, loc))
out.append(TopLevelCodeDecl_createExpr(ctx, declContext, loc, e, loc))
default:
fatalError("Top level nodes must be decls, stmts, or exprs.")
}
Expand All @@ -118,7 +118,7 @@ public func buildTopLevelASTNodes(
callback: @convention(c) (UnsafeMutableRawPointer, UnsafeMutableRawPointer) -> Void
) {
sourceFilePtr.withMemoryRebound(to: ExportedSourceFile.self, capacity: 1) { sourceFile in
ASTGenVisitor(ctx: ctx, base: sourceFile.pointee.buffer.baseAddress!, declContext: dc)
ASTGenVisitor(ctx: BridgedASTContext(raw: ctx), base: sourceFile.pointee.buffer, declContext: BridgedDeclContext(raw: dc))
.visit(sourceFile.pointee.syntax)
.forEach { callback($0, outputContext) }
}
Expand Down
56 changes: 28 additions & 28 deletions lib/ASTGen/Sources/ASTGen/Decls.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import SwiftSyntax

extension ASTGenVisitor {
public func visit(_ node: TypealiasDeclSyntax) -> ASTNode {
let aliasLoc = self.base.advanced(by: node.typealiasKeyword.position.utf8Offset).raw
let equalLoc = self.base.advanced(by: node.initializer.equal.position.utf8Offset).raw
let aliasLoc = bridgedSourceLoc(for: node.typealiasKeyword)
let equalLoc = bridgedSourceLoc(for: node.initializer.equal)
var nameText = node.identifier.text
let name = nameText.withUTF8 { buf in
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
let name = nameText.withBridgedString { bridgedName in
return ASTContext_getIdentifier(ctx, bridgedName)
}
let nameLoc = self.base.advanced(by: node.identifier.position.utf8Offset).raw
let nameLoc = bridgedSourceLoc(for: node.identifier)
let genericParams = node.genericParameterClause.map { self.visit($0).rawValue }
let out = TypeAliasDecl_create(
self.ctx, self.declContext, aliasLoc, equalLoc, name, nameLoc, genericParams)
Expand All @@ -26,10 +26,10 @@ extension ASTGenVisitor {
}

public func visit(_ node: StructDeclSyntax) -> ASTNode {
let loc = self.base.advanced(by: node.position.utf8Offset).raw
let loc = bridgedSourceLoc(for: node)
var nameText = node.identifier.text
let name = nameText.withUTF8 { buf in
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
let name = nameText.withBridgedString { bridgedName in
return ASTContext_getIdentifier(ctx, bridgedName)
}

let genericParams = node.genericParameterClause
Expand All @@ -49,10 +49,10 @@ extension ASTGenVisitor {
}

public func visit(_ node: ClassDeclSyntax) -> ASTNode {
let loc = self.base.advanced(by: node.position.utf8Offset).raw
let loc = bridgedSourceLoc(for: node)
var nameText = node.identifier.text
let name = nameText.withUTF8 { buf in
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
let name = nameText.withBridgedString { bridgedName in
return ASTContext_getIdentifier(ctx, bridgedName)
}

let out = ClassDecl_create(ctx, loc, name, loc, declContext)
Expand All @@ -73,38 +73,38 @@ extension ASTGenVisitor {
let pattern = visit(node.bindings.first!.pattern).rawValue
let initializer = visit(node.bindings.first!.initializer!).rawValue

let loc = self.base.advanced(by: node.position.utf8Offset).raw
let loc = bridgedSourceLoc(for: node)
let isStatic = false // TODO: compute this
let isLet = node.bindingKeyword.tokenKind == .keyword(.let)

// TODO: don't drop "initializer" on the floor.
return .decl(
SwiftVarDecl_create(
VarDecl_create(
ctx, pattern, initializer, loc, isStatic,
isLet, declContext))
}

public func visit(_ node: FunctionParameterSyntax) -> ASTNode {
let loc = self.base.advanced(by: node.position.utf8Offset).raw
let loc = bridgedSourceLoc(for: node)

let firstName: BridgedIdentifier
let secondName: BridgedIdentifier

let firstName: UnsafeMutableRawPointer?
let secondName: UnsafeMutableRawPointer?

let nodeFirstName = node.firstName
if nodeFirstName.text != "_" {
// Swift AST represents "_" as nil.
var text = nodeFirstName.text
firstName = text.withUTF8 { buf in
SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
firstName = text.withBridgedString { bridgedName in
ASTContext_getIdentifier(ctx, bridgedName)
}
} else {
firstName = nil
}

if let nodeSecondName = node.secondName {
var text = nodeSecondName.text
secondName = text.withUTF8 { buf in
SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
secondName = text.withBridgedString { bridgedName in
ASTContext_getIdentifier(ctx, bridgedName)
}
} else {
secondName = nil
Expand All @@ -116,15 +116,15 @@ extension ASTGenVisitor {
}

public func visit(_ node: FunctionDeclSyntax) -> ASTNode {
let staticLoc = self.base.advanced(by: node.position.utf8Offset).raw
let funcLoc = self.base.advanced(by: node.funcKeyword.position.utf8Offset).raw
let nameLoc = self.base.advanced(by: node.identifier.position.utf8Offset).raw
let rParamLoc = self.base.advanced(by: node.signature.input.leftParen.position.utf8Offset).raw
let lParamLoc = self.base.advanced(by: node.signature.input.rightParen.position.utf8Offset).raw
let staticLoc = bridgedSourceLoc(for: node)
let funcLoc = bridgedSourceLoc(for: node.funcKeyword)
let nameLoc = bridgedSourceLoc(for: node.identifier)
let rParamLoc = bridgedSourceLoc(for: node.signature.input.leftParen)
let lParamLoc = bridgedSourceLoc(for: node.signature.input.rightParen)

var nameText = node.identifier.text
let name = nameText.withUTF8 { buf in
return SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
let name = nameText.withBridgedString { bridgedName in
return ASTContext_getIdentifier(ctx, bridgedName)
}

let returnType: ASTNode?
Expand Down
Loading