Skip to content

Commit bc74a1f

Browse files
Merge pull request #258 from SwiftFiddle/dropdown
Add SwiftSyntax version selector
2 parents f8743b2 + a0ab160 commit bc74a1f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+102839
-15
lines changed

Package.resolved

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ let package = Package(
88
],
99
dependencies: [
1010
.package(url: "https://github.com/apple/swift-syntax", from: "508.0.1"),
11+
.package(url: "https://github.com/apple/swift-tools-support-core", from: "0.5.2"),
1112
.package(url: "https://github.com/vapor/vapor.git", from: "4.77.0"),
1213
.package(url: "https://github.com/vapor/leaf.git", from: "4.2.4"),
1314
],
@@ -18,6 +19,7 @@ let package = Package(
1819
.product(name: "SwiftSyntax", package: "swift-syntax"),
1920
.product(name: "SwiftOperators", package: "swift-syntax"),
2021
.product(name: "SwiftParser", package: "swift-syntax"),
22+
.product(name: "TSCBasic", package: "swift-tools-support-core"),
2123
.product(name: "Vapor", package: "vapor"),
2224
.product(name: "Leaf", package: "leaf"),
2325
],

Public/index.html

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,41 @@
8383
<span id="run-button-spinner" class="fa-duotone fa-spinner-third fa-spin fa-fw d-none"></span>
8484
<span class="px-1">Update</span>
8585
</button>
86-
<button id="config-button" type="button"
87-
class="btn btn-outline-primary btn-sm rounded-circle button-circle m-1 disabled" data-bs-toggle="dropdown"
88-
data-bs-auto-close="outside" data-bs-offset="0,10" aria-label="Options" aria-expanded="false">
89-
<span class="fa-solid fa-cog fa-fw"></span>
90-
</button>
91-
<ul class="dropdown-menu">
92-
<li class="options-item" data-value="fold">
93-
<a class="dropdown-item" data-target="#">
94-
Fold All Sequence Expressions
95-
</a>
96-
</li>
97-
</ul>
86+
<div class="dropdown d-inline-block">
87+
<button id="config-button" type="button"
88+
class="btn btn-outline-primary btn-sm rounded-circle button-circle m-1 disabled" data-bs-toggle="dropdown"
89+
data-bs-auto-close="outside" data-bs-offset="0,10" aria-label="Options" aria-expanded="false">
90+
<span class="fa-solid fa-cog fa-fw"></span>
91+
</button>
92+
<ul class="dropdown-menu">
93+
<li>
94+
<h6 class="dropdown-header">Swift Syntax</h6>
95+
</li>
96+
<li class="options-item radio active-tick" data-value="branch_stable">
97+
<a class="dropdown-item" data-target="#">
98+
508.0.1 (Swift 5.8)
99+
</a>
100+
</li>
101+
<li class="options-item radio" data-value="branch_release-5.9">
102+
<a class="dropdown-item" data-target="#">
103+
release/5.9 branch
104+
</a>
105+
</li>
106+
<li class="options-item radio" data-value="branch_main">
107+
<a class="dropdown-item" data-target="#">
108+
main branch
109+
</a>
110+
</li>
111+
<li>
112+
<hr class="dropdown-divider">
113+
</li>
114+
<li class="options-item checkbox" data-value="fold">
115+
<a class="dropdown-item" data-target="#">
116+
Fold All Sequence Expressions
117+
</a>
118+
</li>
119+
</ul>
120+
</div>
98121
<button id="format-button" type="button"
99122
class="btn btn-outline-primary btn-sm rounded-circle button-circle m-1 disabled" data-bs-toggle="tooltip"
100123
data-bs-placement="bottom" data-bs-container="#format-button" title="Format" aria-label="Format">

Public/js/app.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,17 @@ export class App {
5454
});
5555

5656
document.getElementById("config-button").classList.remove("disabled");
57-
document.querySelectorAll(".options-item").forEach((listItem) => {
57+
document.querySelectorAll(".options-item.radio").forEach((listItem) => {
58+
listItem.addEventListener("click", (event) => {
59+
event.preventDefault();
60+
document.querySelectorAll(".options-item.radio").forEach((listItem) => {
61+
listItem.classList.remove("active-tick");
62+
});
63+
listItem.classList.toggle("active-tick");
64+
this.update();
65+
});
66+
});
67+
document.querySelectorAll(".options-item.checkbox").forEach((listItem) => {
5868
listItem.addEventListener("click", (event) => {
5969
event.preventDefault();
6070
listItem.classList.toggle("active-tick");
@@ -92,12 +102,14 @@ export class App {
92102
update() {
93103
showLoading();
94104

105+
const branch = branchOption();
95106
const options = configurations();
96107

97108
const code = this.editor.getValue();
98109
const json = {
99110
code,
100111
options,
112+
branch,
101113
};
102114
fetch("/update", {
103115
method: "POST",
@@ -255,9 +267,19 @@ export class App {
255267
}
256268
}
257269

270+
function branchOption() {
271+
let branch = "branch_stable";
272+
document.querySelectorAll(".options-item.radio").forEach((listItem) => {
273+
if (listItem.classList.contains("active-tick")) {
274+
branch = listItem.dataset.value;
275+
}
276+
});
277+
return branch;
278+
}
279+
258280
function configurations() {
259281
const options = [];
260-
document.querySelectorAll(".options-item").forEach((listItem) => {
282+
document.querySelectorAll(".options-item.checkbox").forEach((listItem) => {
261283
if (listItem.classList.contains("active-tick")) {
262284
options.push(listItem.dataset.value);
263285
}

Resources/branch_main/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Resources/branch_main/Package.resolved

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// swift-tools-version:5.8
2+
import PackageDescription
3+
4+
let package = Package(
5+
name: "parser",
6+
platforms: [
7+
.macOS(.v13)
8+
],
9+
dependencies: [
10+
.package(url: "https://github.com/apple/swift-syntax", branch: "main"),
11+
],
12+
targets: [
13+
.executableTarget(
14+
name: "parser",
15+
dependencies: [
16+
.product(name: "SwiftSyntax", package: "swift-syntax"),
17+
.product(name: "SwiftOperators", package: "swift-syntax"),
18+
.product(name: "SwiftParser", package: "swift-syntax"),
19+
],
20+
swiftSettings: [
21+
.unsafeFlags(["-cross-module-optimization"], .when(configuration: .release))
22+
]
23+
),
24+
.testTarget(
25+
name: "Tests",
26+
dependencies: [
27+
.target(name: "parser"),
28+
],
29+
resources: [.process("Fixtures")]
30+
)
31+
]
32+
)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import Foundation
2+
3+
@main
4+
struct Main {
5+
static func main() throws {
6+
do {
7+
let arguments = CommandLine.arguments
8+
let code = CommandLine.arguments[1]
9+
let options: [String]
10+
if arguments.count > 2 {
11+
options = [CommandLine.arguments[2]]
12+
} else {
13+
options = []
14+
}
15+
16+
let response = try SyntaxParser.parse(code: code, options: options)
17+
18+
let data = try JSONEncoder().encode(response)
19+
print(String(decoding: data, as: UTF8.self))
20+
} catch {
21+
print("\(error)", to:&standardError)
22+
}
23+
}
24+
}
25+
26+
var standardError = FileHandle.standardError
27+
28+
extension FileHandle : TextOutputStream {
29+
public func write(_ string: String) {
30+
guard let data = string.data(using: .utf8) else { return }
31+
self.write(data)
32+
}
33+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import Foundation
2+
import SwiftSyntax
3+
import SwiftOperators
4+
import SwiftParser
5+
6+
struct SyntaxParser {
7+
static func parse(code: String, options: [String] = []) throws -> SyntaxResponse {
8+
let sourceFile = Parser.parse(source: code)
9+
10+
let syntax: Syntax
11+
if options.contains("fold") {
12+
syntax = OperatorTable.standardOperators.foldAll(sourceFile, errorHandler: { _ in })
13+
} else {
14+
syntax = Syntax(sourceFile)
15+
}
16+
17+
let visitor = TokenVisitor(converter: SourceLocationConverter(file: "", tree: sourceFile))
18+
_ = visitor.rewrite(syntax)
19+
20+
let html = "\(visitor.list.joined())"
21+
22+
let tree = visitor.tree
23+
let encoder = JSONEncoder()
24+
let json = String(decoding: try encoder.encode(tree), as: UTF8.self)
25+
26+
return SyntaxResponse(syntaxHTML: html, syntaxJSON: json, swiftVersion: "main")
27+
}
28+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Foundation
2+
3+
struct SyntaxResponse: Codable {
4+
let syntaxHTML: String
5+
let syntaxJSON: String
6+
let swiftVersion: String
7+
}

0 commit comments

Comments
 (0)