forked from typeup/parser
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCommentStripper.ts
More file actions
54 lines (53 loc) · 1.48 KB
/
CommentStripper.ts
File metadata and controls
54 lines (53 loc) · 1.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import { Error, IO, Uri } from "@cogneco/mend"
export class CommentStripper extends IO.Reader {
private backend: IO.BufferedReader
private last: string | undefined
private disableUntil?: string
get readable(): boolean { return this.backend.readable }
get opened(): boolean { return this.backend.opened }
get tabSize(): number { return this.backend.tabSize }
get isEmpty(): boolean {
return this.backend.isEmpty
}
get resource(): Uri.Locator {
return this.backend.resource
}
get location(): Error.Location {
return this.backend.location
}
get region(): Error.Region {
return this.backend.region
}
constructor(backend: IO.Reader) {
super()
this.backend = backend instanceof IO.BufferedReader ? backend as IO.BufferedReader : IO.BufferedReader.create(backend)
}
read(): string | undefined {
const peeked = this.backend.peek(2)
switch (peeked) {
case "++": // diagram block
case "%%": // code block
this.disableUntil = !this.disableUntil ? peeked : this.disableUntil == peeked ? undefined : this.disableUntil
break
case "//":
if (!this.disableUntil && this.last != ":")
while (this.backend.peek() != "\n")
this.backend.read()
break
case "/*":
if (!this.disableUntil) {
while (this.backend.peek(2) != "*/")
this.backend.read()
this.backend.read(2)
}
break
}
return this.last = this.backend.read()
}
mark(): Error.Region {
return this.backend.mark()
}
close(): Promise<boolean> {
return this.backend.close()
}
}