Skip to content

Move SwiftParser/Diagnostics to its own module #849

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
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
4 changes: 2 additions & 2 deletions Examples/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
.DS_Store
/.build
# Ignore Data Xcode stores when opening the project directly
/.swiftpm/xcode
63 changes: 49 additions & 14 deletions Examples/CodeGenerationUsingSwiftSyntaxBuilder.swift
Original file line number Diff line number Diff line change
@@ -1,31 +1,66 @@
import SwiftSyntaxBuilder

extension String {
func withFirstLetterUppercased() -> String {
if let firstLetter = self.first {
return firstLetter.uppercased() + self.dropFirst()
} else {
return self
}
}
}

/// This example will print the following code:
///
/// ```
/// import Foundation
/// import UIKit
/// class SomeViewController{
/// let tableView: UITableView
/// struct Person {
/// var lastName: String
/// func withLastName(_ lastName: String) -> Person {
/// var result = self
/// result.lastName = lastName
/// return result
/// }
/// var firstName: String
/// func withFirstName(_ firstName: String) -> Person {
/// var result = self
/// result.firstName = firstName
/// return result
/// }
/// var age: Int
/// func withAge(_ age: Int) -> Person {
/// var result = self
/// result.age = age
/// return result
/// }
/// }
/// ```
///
@main
struct Main {
static func main() {
let properties = [
"firstName": "String",
"lastName": "String",
"age": "Int",
]

let source = SourceFile {
ImportDecl(path: "Foundation")
ImportDecl(path: "UIKit")
ClassDecl(identifier: "SomeViewController") {
VariableDecl(.let, name: "tableView", type: "UITableView")
StructDecl(identifier: "Person") {
for (propertyName, propertyType) in properties {
VariableDecl("var \(propertyName): \(propertyType)")

FunctionDecl("""
func with\(propertyName.withFirstLetterUppercased())(_ \(propertyName): \(propertyType)) -> Person {
var result = self
result.\(propertyName) = \(propertyName)
return result
}
"""
)
}
}
}

let syntax = source.build()

var text = ""
syntax.write(to: &text)

print(text)
print(source.formatted().description)
}
}
24 changes: 18 additions & 6 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ let package = Package(
.library(name: "SwiftDiagnostics", type: .static, targets: ["SwiftDiagnostics"]),
.library(name: "SwiftOperators", type: .static, targets: ["SwiftOperators"]),
.library(name: "SwiftParser", type: .static, targets: ["SwiftParser"]),
.library(name: "SwiftParserDiagnostics", type: .static, targets: ["SwiftParserDiagnostics"]),
.library(name: "SwiftSyntax", type: .static, targets: ["SwiftSyntax"]),
.library(name: "SwiftSyntaxParser", type: .static, targets: ["SwiftSyntaxParser"]),
.library(name: "SwiftSyntaxBuilder", type: .static, targets: ["SwiftSyntaxBuilder"]),
Expand Down Expand Up @@ -96,7 +97,7 @@ let package = Package(
),
.target(
name: "SwiftSyntaxBuilder",
dependencies: ["SwiftBasicFormat", "SwiftSyntax", "SwiftParser"],
dependencies: ["SwiftBasicFormat", "SwiftSyntax", "SwiftParser", "SwiftParserDiagnostics"],
exclude: [
"CMakeLists.txt",
"SyntaxExpressibleByStringInterpolationConformances.swift.gyb",
Expand All @@ -117,7 +118,7 @@ let package = Package(
),
.target(
name: "SwiftParser",
dependencies: ["SwiftBasicFormat", "SwiftDiagnostics", "SwiftSyntax"],
dependencies: ["SwiftDiagnostics", "SwiftSyntax"],
exclude: [
"CMakeLists.txt",
"README.md",
Expand All @@ -126,6 +127,13 @@ let package = Package(
"DeclarationAttribute.swift.gyb",
]
),
.target(
name: "SwiftParserDiagnostics",
dependencies: ["SwiftBasicFormat", "SwiftDiagnostics", "SwiftParser", "SwiftSyntax"],
exclude: [
"CMakeLists.txt",
]
),
.target(
name: "SwiftOperators",
dependencies: ["SwiftSyntax", "SwiftParser", "SwiftDiagnostics"],
Expand All @@ -135,8 +143,8 @@ let package = Package(
),
.target(
name: "SwiftCompilerSupport",
dependencies: [
"SwiftSyntax", "SwiftParser", "SwiftDiagnostics", "SwiftOperators"],
dependencies: ["SwiftSyntax", "SwiftParser", "SwiftParserDiagnostics",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You might need a paired PR to the Swift repository to link against SwiftParserDiagnostics.

"SwiftDiagnostics", "SwiftOperators"],
exclude: [
"CMakeLists.txt",
"SwiftCompilerSupport.h"
Expand All @@ -156,12 +164,12 @@ let package = Package(
),
.executableTarget(
name: "swift-parser-cli",
dependencies: ["SwiftDiagnostics", "SwiftSyntax", "SwiftParser", "SwiftOperators", "_SwiftSyntaxMacros",
dependencies: ["SwiftDiagnostics", "SwiftSyntax", "SwiftParser", "SwiftParserDiagnostics", "SwiftOperators", "_SwiftSyntaxMacros",
.product(name: "ArgumentParser", package: "swift-argument-parser")]
),
.testTarget(
name: "SwiftDiagnosticsTest",
dependencies: ["_SwiftSyntaxTestSupport", "SwiftDiagnostics", "SwiftParser"]
dependencies: ["_SwiftSyntaxTestSupport", "SwiftDiagnostics", "SwiftParser", "SwiftParserDiagnostics"]
),
.testTarget(
name: "SwiftSyntaxTest",
Expand Down Expand Up @@ -192,6 +200,10 @@ let package = Package(
dependencies: ["SwiftDiagnostics", "SwiftOperators", "SwiftParser",
"_SwiftSyntaxTestSupport", "SwiftSyntaxBuilder"]
),
.testTarget(
name: "SwiftParserDiagnosticsTest",
dependencies: ["SwiftDiagnostics", "SwiftParserDiagnostics"]
),
.testTarget(
name: "SwiftOperatorsTest",
dependencies: ["SwiftOperators", "_SwiftSyntaxTestSupport",
Expand Down
1 change: 1 addition & 0 deletions Sources/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ add_subdirectory(SwiftBasicFormat)
add_subdirectory(SwiftSyntax)
add_subdirectory(SwiftDiagnostics)
add_subdirectory(SwiftParser)
add_subdirectory(SwiftParserDiagnostics)
add_subdirectory(SwiftOperators)
add_subdirectory(SwiftSyntaxBuilder)
add_subdirectory(_SwiftSyntaxMacros)
Expand Down
1 change: 1 addition & 0 deletions Sources/SwiftCompilerSupport/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ target_link_libraries(SwiftCompilerSupport PUBLIC
SwiftSyntax
SwiftDiagnostics
SwiftParser
SwiftParserDiagnostics
SwiftOperators
)

Expand Down
1 change: 1 addition & 0 deletions Sources/SwiftCompilerSupport/ConsistencyCheck.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import SwiftOperators
@_spi(Testing) @_spi(RawSyntax) import SwiftParser
import SwiftParserDiagnostics
@_spi(RawSyntax) import SwiftSyntax

extension Syntax {
Expand Down
9 changes: 0 additions & 9 deletions Sources/SwiftParser/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,11 @@ add_library(SwiftParser STATIC
TriviaParser.swift
Types.swift

Diagnostics/DiagnosticExtensions.swift
Diagnostics/MissingNodesError.swift
Diagnostics/ParserDiagnosticMessages.swift
Diagnostics/ParseDiagnosticsGenerator.swift
Diagnostics/PresenceUtils.swift
Diagnostics/SyntaxExtensions.swift
Diagnostics/Utils.swift

gyb_generated/DeclarationAttribute.swift
gyb_generated/DeclarationModifier.swift
gyb_generated/TypeAttribute.swift)

target_link_libraries(SwiftParser PUBLIC
SwiftBasicFormat
SwiftSyntax
SwiftDiagnostics)

Expand Down
80 changes: 40 additions & 40 deletions Sources/SwiftParser/RawTokenKindSubset.swift
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,46 @@ enum SwitchCaseStart: RawTokenKindSubset {
}
}

public enum TypeSpecifier: RawTokenKindSubset {
case inoutKeyword
case owned
case shared

init?(lexeme: Lexer.Lexeme) {
switch (lexeme.tokenKind, lexeme.tokenText) {
case (.inoutKeyword, _): self = .inoutKeyword
case (.identifier, "__owned"): self = .owned
case (.identifier, "__shared"): self = .shared
default: return nil
}
}

public init?(token: TokenSyntax) {
switch (token.tokenKind, token.text) {
case (.inoutKeyword, _): self = .inoutKeyword
case (.contextualKeyword, "__owned"): self = .owned
case (.contextualKeyword, "__shared"): self = .shared
default: return nil
}
}

var rawTokenKind: RawTokenKind {
switch self {
case .inoutKeyword: return .inoutKeyword
case .owned: return .identifier
case .shared: return .identifier
}
}

var contextualKeyword: SyntaxText? {
switch self {
case .inoutKeyword: return nil
case .owned: return "__owned"
case .shared: return "__shared"
}
}
}

// MARK: Expression start

enum AwaitTryMove: RawTokenKindSubset {
Expand Down Expand Up @@ -839,46 +879,6 @@ enum PrimaryExpressionStart: RawTokenKindSubset {
}
}

enum TypeSpecifier: RawTokenKindSubset {
case inoutKeyword
case owned
case shared

init?(lexeme: Lexer.Lexeme) {
switch (lexeme.tokenKind, lexeme.tokenText) {
case (.inoutKeyword, _): self = .inoutKeyword
case (.identifier, "__owned"): self = .owned
case (.identifier, "__shared"): self = .shared
default: return nil
}
}

init?(token: TokenSyntax) {
switch (token.tokenKind, token.text) {
case (.inoutKeyword, _): self = .inoutKeyword
case (.contextualKeyword, "__owned"): self = .owned
case (.contextualKeyword, "__shared"): self = .shared
default: return nil
}
}

var rawTokenKind: RawTokenKind {
switch self {
case .inoutKeyword: return .inoutKeyword
case .owned: return .identifier
case .shared: return .identifier
}
}

var contextualKeyword: SyntaxText? {
switch self {
case .inoutKeyword: return nil
case .owned: return "__owned"
case .shared: return "__shared"
}
}
}

/// Union of the following token kind subsets:
/// - `AwaitTry`
/// - `ExpressionPrefixOperator`
Expand Down
34 changes: 34 additions & 0 deletions Sources/SwiftParserDiagnostics/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See http://swift.org/LICENSE.txt for license information
# See http://swift.org/CONTRIBUTORS.txt for Swift project authors

add_library(SwiftParserDiagnostics STATIC
DiagnosticExtensions.swift
MissingNodesError.swift
ParserDiagnosticMessages.swift
ParseDiagnosticsGenerator.swift
PresenceUtils.swift
SyntaxExtensions.swift
Utils.swift)

target_link_libraries(SwiftParserDiagnostics PUBLIC
SwiftBasicFormat
SwiftSyntax
SwiftDiagnostics)

set_property(GLOBAL APPEND PROPERTY SWIFTSYNTAX_EXPORTS SwiftParserDiagnostics)

# NOTE: workaround for CMake not setting up include flags yet
set_target_properties(SwiftParserDiagnostics PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES
"${CMAKE_Swift_MODULE_DIRECTORY} ${CMAKE_CURRENT_SOURCE_DIR}")

install(TARGETS SwiftParserDiagnostics
EXPORT SwiftSyntaxTargets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
//===----------------------------------------------------------------------===//

import SwiftDiagnostics
import SwiftParser
@_spi(RawSyntax) import SwiftSyntax

public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
Expand Down
2 changes: 2 additions & 0 deletions Sources/SwiftSyntaxBuilder/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ add_library(SwiftSyntaxBuilder STATIC
)

target_link_libraries(SwiftSyntaxBuilder PUBLIC
SwiftBasicFormat
SwiftParser
SwiftParserDiagnostics
SwiftSyntax
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

@_spi(RawSyntax) import SwiftSyntax
@_spi(RawSyntax) import SwiftParser
import SwiftParserDiagnostics
import SwiftDiagnostics
import SwiftBasicFormat

Expand Down
1 change: 1 addition & 0 deletions Sources/swift-parser-cli/swift-parser-cli.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import SwiftDiagnostics
import SwiftSyntax
@_spi(Testing) import _SwiftSyntaxMacros
import SwiftParser
import SwiftParserDiagnostics
import SwiftOperators
import Foundation
import ArgumentParser
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import _SwiftSyntaxTestSupport
import XCTest
import SwiftDiagnostics
import SwiftParser
import SwiftParserDiagnostics

final class DiagnosticsFormatterTests: XCTestCase {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

import XCTest
import SwiftDiagnostics
import SwiftParser
import SwiftParserDiagnostics

public class DiagnosticInfrastructureTests: XCTestCase {
public func testDiagnosticID() {
Expand Down
1 change: 1 addition & 0 deletions Tests/SwiftParserTest/Assertions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import XCTest
@_spi(RawSyntax) import SwiftSyntax
@_spi(Testing) @_spi(RawSyntax) import SwiftParser
import SwiftParserDiagnostics
import SwiftDiagnostics
import _SwiftSyntaxTestSupport

Expand Down
Loading