Skip to content

Commit 31470a7

Browse files
Merge pull request #302 from SwiftFiddle/show-missing
Add Show Missing Tokens option
2 parents 13fa473 + 46dcb3d commit 31470a7

Some content is hidden

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

61 files changed

+2429
-2047
lines changed

Public/css/lookup.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,7 @@
3636
.shebang {
3737
color: #5d6c79;
3838
}
39+
40+
.token.missing {
41+
color: #a3a3a3;
42+
}

Public/css/tree_view.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,25 @@
8787
color: #696969;
8888
background-color: #dcdcdc;
8989
}
90+
91+
.tree-view .token.missing {
92+
color: #a3a3a3;
93+
}
94+
95+
.tree-view .token.missing::after {
96+
content: "Missing";
97+
color: #696969;
98+
background-color: #dcdcdc;
99+
display: inline-block;
100+
padding: 0.35em 0.65em;
101+
margin: 0 8px;
102+
font-size: 0.75em;
103+
font-weight: 700;
104+
line-height: 1;
105+
color: var(--bs-badge-color);
106+
text-align: center;
107+
white-space: nowrap;
108+
vertical-align: baseline;
109+
border-radius: 0.375rem;
110+
vertical-align: middle;
111+
}

Public/index.html

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,16 @@
9595
<span class="fa-solid fa-cog fa-fw"></span>
9696
</button>
9797
<ul class="dropdown-menu">
98-
<li>
99-
<h6 class="dropdown-header">Options</h6>
100-
</li>
101-
<li class="options-item checkbox" data-value="fold">
98+
<li class="options-item checkbox parser-options active-tick" data-value="fold">
10299
<a class="dropdown-item" data-target="#">
103100
Fold Sequence Expressions
104101
</a>
105102
</li>
103+
<li class="options-item checkbox parser-options" data-value="showmissing">
104+
<a class="dropdown-item" data-target="#">
105+
Show Missing Tokens
106+
</a>
107+
</li>
106108
</ul>
107109
</div>
108110
<button id="format-button" type="button"
@@ -127,17 +129,17 @@ <h6 class="dropdown-header">Options</h6>
127129
<li>
128130
<h6 class="dropdown-header">Swift Syntax Version</h6>
129131
</li>
130-
<li class="options-item radio active-tick" data-value="branch_stable" data-text="508.0.1">
132+
<li class="options-item radio parser-version active-tick" data-value="branch_stable" data-text="508.0.1">
131133
<a class="dropdown-item" data-target="#">
132134
508.0.1 (Swift 5.8)
133135
</a>
134136
</li>
135-
<li class="options-item radio" data-value="branch_release-5.9" data-text="release/5.9">
137+
<li class="options-item radio parser-version" data-value="branch_release-5.9" data-text="release/5.9">
136138
<a class="dropdown-item" data-target="#">
137139
release/5.9 branch
138140
</a>
139141
</li>
140-
<li class="options-item radio" data-value="branch_main" data-text="main">
142+
<li class="options-item radio parser-version" data-value="branch_main" data-text="main">
141143
<a class="dropdown-item" data-target="#">
142144
main branch
143145
</a>

Public/js/app.js

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ export class App {
108108
update() {
109109
showLoading();
110110

111-
const branch = branchOption();
112-
const options = configurations();
111+
const branch = branchOptions();
112+
const options = parserOptions();
113113

114114
const code = this.editor.getValue();
115115
const json = {
@@ -267,23 +267,27 @@ export class App {
267267
}
268268
}
269269

270-
function branchOption() {
270+
function branchOptions() {
271271
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-
});
272+
document
273+
.querySelectorAll(".options-item.radio.parser-version")
274+
.forEach((listItem) => {
275+
if (listItem.classList.contains("active-tick")) {
276+
branch = listItem.dataset.value;
277+
}
278+
});
277279
return branch;
278280
}
279281

280-
function configurations() {
282+
function parserOptions() {
281283
const options = [];
282-
document.querySelectorAll(".options-item.checkbox").forEach((listItem) => {
283-
if (listItem.classList.contains("active-tick")) {
284-
options.push(listItem.dataset.value);
285-
}
286-
});
284+
document
285+
.querySelectorAll(".options-item.checkbox.checkbox")
286+
.forEach((listItem) => {
287+
if (listItem.classList.contains("active-tick")) {
288+
options.push(listItem.dataset.value);
289+
}
290+
});
287291
return options;
288292
}
289293

Public/js/tree_view.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ export class TreeView {
6262
}
6363
} else {
6464
content.classList.add("token");
65+
if (node.class) {
66+
content.classList.add(node.class);
67+
}
6568
content.innerHTML =
6669
node.text.length === 0 ? `<span class="badge">Empty</span>` : node.text;
6770
li.appendChild(content);

Resources/branch_main/Sources/parser/Main.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ struct Main {
88
let code = CommandLine.arguments[1]
99
let options: [String]
1010
if arguments.count > 2 {
11-
options = [CommandLine.arguments[2]]
11+
options = Array(CommandLine.arguments.dropFirst(2))
1212
} else {
1313
options = []
1414
}

Resources/branch_main/Sources/parser/SyntaxParser.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ struct SyntaxParser {
1414
syntax = Syntax(sourceFile)
1515
}
1616

17-
let visitor = TokenVisitor(converter: SourceLocationConverter(file: "", tree: sourceFile))
17+
let visitor = TokenVisitor(
18+
locationConverter: SourceLocationConverter(file: "", tree: sourceFile),
19+
showMissingTokens: options.contains("showmissing")
20+
)
1821
_ = visitor.rewrite(syntax)
1922

2023
let html = "\(visitor.list.joined())"

Resources/branch_main/Sources/parser/TokenVisitor.swift

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ import Foundation
33

44
final class TokenVisitor: SyntaxRewriter {
55
var list = [String]()
6-
76
var tree = [TreeNode]()
8-
var current: TreeNode!
97

10-
var index = 0
8+
private var current: TreeNode!
9+
private var index = 0
1110

12-
let converter: SourceLocationConverter
11+
private let locationConverter: SourceLocationConverter
12+
private let showMissingTokens: Bool
1313

14-
init(converter: SourceLocationConverter) {
15-
self.converter = converter
14+
init(locationConverter: SourceLocationConverter, showMissingTokens: Bool) {
15+
self.locationConverter = locationConverter
16+
self.showMissingTokens = showMissingTokens
17+
super.init(viewMode: showMissingTokens ? .all : .sourceAccurate)
1618
}
1719

1820
override func visitPre(_ node: Syntax) {
@@ -35,7 +37,7 @@ final class TokenVisitor: SyntaxRewriter {
3537
type = "Syntax"
3638
}
3739

38-
let sourceRange = node.sourceRange(converter: converter)
40+
let sourceRange = node.sourceRange(converter: locationConverter)
3941
let start = sourceRange.start
4042
let end = sourceRange.end
4143

@@ -147,6 +149,9 @@ final class TokenVisitor: SyntaxRewriter {
147149
.htmlEscaped()
148150
.substituteInvisibles()
149151
.transformWhitespaces()
152+
if token.presence == .missing {
153+
current.class = "\(token.presence)"
154+
}
150155
current.token = Token(kind: "\(token.tokenKind)", leadingTrivia: "", trailingTrivia: "")
151156

152157
token.leadingTrivia.forEach { (piece) in
@@ -182,12 +187,12 @@ final class TokenVisitor: SyntaxRewriter {
182187
kind = "keyword"
183188
}
184189

185-
let sourceRange = token.sourceRange(converter: converter)
190+
let sourceRange = token.sourceRange(converter: locationConverter)
186191
let start = sourceRange.start
187192
let end = sourceRange.end
188-
let text = token.presence == .present ? token.text : ""
193+
let text = token.presence == .present || showMissingTokens ? token.text : ""
189194
list.append(
190-
"<span class='token \(kind.htmlEscaped())' " +
195+
"<span class='token \(kind.htmlEscaped()) \(token.presence)' " +
191196
"data-title='\("\(token.trimmed)".htmlEscaped().displayInvisibles())' " +
192197
"data-content='\("\(token.tokenKind)".htmlEscaped().substituteInvisibles())' " +
193198
"data-type='Token' " +

Resources/branch_main/Sources/parser/TreeNode.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import Foundation
22

33
final class TreeNode: Codable {
4-
var id: Int
4+
let id: Int
55
var parent: Int?
66

77
var text: String
88
var range = Range(startRow: 0, startColumn: 0, endRow: 0, endColumn: 0)
99
var structure = [StructureProperty]()
1010
var type: SyntaxType
1111
var token: Token?
12+
var `class`: String?
1213

1314
init(id: Int, text: String, range: Range, type: SyntaxType) {
1415
self.id = id
@@ -47,10 +48,10 @@ extension TreeNode: CustomStringConvertible {
4748
}
4849

4950
struct Range: Codable, Equatable {
50-
var startRow: Int
51-
var startColumn: Int
52-
var endRow: Int
53-
var endColumn: Int
51+
let startRow: Int
52+
let startColumn: Int
53+
let endRow: Int
54+
let endColumn: Int
5455
}
5556

5657
extension Range: CustomStringConvertible {
@@ -121,7 +122,7 @@ enum SyntaxType: String, Codable {
121122
}
122123

123124
struct Token: Codable, Equatable {
124-
var kind: String
125+
let kind: String
125126
var leadingTrivia: String
126127
var trailingTrivia: String
127128

Resources/branch_main/Tests/Tests/Fixtures/test-1-1.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<span class='CodeBlockItem' data-title='let␣number␣=␣0' data-content='CodeBlockItemSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":1,"endRow":1,"endColumn":15}'>
44
<span class='VariableDecl' data-title='let␣number␣=␣0' data-content='VariableDeclSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":1,"endRow":1,"endColumn":15}'>
55
<span class='Token' data-title='let' data-content='keyword(SwiftSyntax.Keyword.let)' data-type='Token' data-range='{"startRow":1,"startColumn":1,"endRow":1,"endColumn":4}'>
6-
<span class='token keyword' data-title='let' data-content='keyword(SwiftSyntax.Keyword.let)' data-type='Token' data-range='{"startRow":1,"startColumn":1,"endRow":1,"endColumn":4}'>
6+
<span class='token keyword present' data-title='let' data-content='keyword(SwiftSyntax.Keyword.let)' data-type='Token' data-range='{"startRow":1,"startColumn":1,"endRow":1,"endColumn":4}'>
77
let
88
</span>
99
&nbsp;
@@ -12,22 +12,22 @@
1212
<span class='PatternBinding' data-title='number␣=␣0' data-content='PatternBindingSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":5,"endRow":1,"endColumn":15}'>
1313
<span class='IdentifierPattern' data-title='number' data-content='IdentifierPatternSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":5,"endRow":1,"endColumn":11}'>
1414
<span class='Token' data-title='number' data-content='identifier(&quot;number&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":5,"endRow":1,"endColumn":11}'>
15-
<span class='token identifier' data-title='number' data-content='identifier(&quot;number&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":5,"endRow":1,"endColumn":11}'>
15+
<span class='token identifier present' data-title='number' data-content='identifier(&quot;number&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":5,"endRow":1,"endColumn":11}'>
1616
number
1717
</span>
1818
&nbsp;
1919
</span>
2020
</span>
2121
<span class='InitializerClause' data-title='=␣0' data-content='InitializerClauseSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":12,"endRow":1,"endColumn":15}'>
2222
<span class='Token' data-title='=' data-content='equal' data-type='Token' data-range='{"startRow":1,"startColumn":12,"endRow":1,"endColumn":13}'>
23-
<span class='token equal' data-title='=' data-content='equal' data-type='Token' data-range='{"startRow":1,"startColumn":12,"endRow":1,"endColumn":13}'>
23+
<span class='token equal present' data-title='=' data-content='equal' data-type='Token' data-range='{"startRow":1,"startColumn":12,"endRow":1,"endColumn":13}'>
2424
=
2525
</span>
2626
&nbsp;
2727
</span>
2828
<span class='IntegerLiteralExpr' data-title='0' data-content='IntegerLiteralExprSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
2929
<span class='Token' data-title='0' data-content='integerLiteral(&quot;0&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
30-
<span class='token integerLiteral' data-title='0' data-content='integerLiteral(&quot;0&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
30+
<span class='token integerLiteral present' data-title='0' data-content='integerLiteral(&quot;0&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
3131
0
3232
</span>
3333
</span>
@@ -39,6 +39,6 @@
3939
</span>
4040
</span>
4141
<span class='Token' data-title='' data-content='endOfFile' data-type='Token' data-range='{"startRow":1,"startColumn":15,"endRow":1,"endColumn":15}'>
42-
<span class='token endOfFile' data-title='' data-content='endOfFile' data-type='Token' data-range='{"startRow":1,"startColumn":15,"endRow":1,"endColumn":15}'></span>
42+
<span class='token endOfFile present' data-title='' data-content='endOfFile' data-type='Token' data-range='{"startRow":1,"startColumn":15,"endRow":1,"endColumn":15}'></span>
4343
</span>
4444
</span>

0 commit comments

Comments
 (0)