tangled
alpha
login
or
join now
fuwn.net
/
iku
0
fork
atom
๐ Grammar-Aware Code Formatter: Structure through separation (supports Go, JavaScript, TypeScript, JSX, and TSX)
go
formatter
code-formatter
javascript
typescript
jsx
tsx
0
fork
atom
overview
issues
pulls
pipelines
refactor: Extract line pattern detection to patterns.go
fuwn.net
1 month ago
a1798d9b
bc920d7e
verified
This commit was signed with the committer's
known signature
.
fuwn.net
SSH Key Fingerprint:
SHA256:VPdFPyPbd6JkoMyWUdZ/kkTcIAt3sxjXD2XSAZ7FYC4=
+83
-81
2 changed files
expand all
collapse all
unified
split
formatter.go
patterns.go
-81
formatter.go
···
6
6
"go/parser"
7
7
"go/token"
8
8
"reflect"
9
9
-
"regexp"
10
9
"strings"
11
10
)
12
12
-
13
13
-
var (
14
14
-
closingBracePattern = regexp.MustCompile(`^\s*[\}\)]`)
15
15
-
openingBracePattern = regexp.MustCompile(`[\{\(]\s*$`)
16
16
-
caseLabelPattern = regexp.MustCompile(`^\s*(case\s|default\s*:)|(^\s+.*:\s*$)`)
17
17
-
)
18
18
-
19
19
-
func isCommentOnly(sourceLine string) bool {
20
20
-
for characterIndex := range len(sourceLine) {
21
21
-
character := sourceLine[characterIndex]
22
22
-
23
23
-
if character == ' ' || character == '\t' {
24
24
-
continue
25
25
-
}
26
26
-
27
27
-
return len(sourceLine) > characterIndex+1 && sourceLine[characterIndex] == '/' && sourceLine[characterIndex+1] == '/'
28
28
-
}
29
29
-
30
30
-
return false
31
31
-
}
32
32
-
33
33
-
func isPackageLine(trimmedLine string) bool {
34
34
-
return len(trimmedLine) > 8 && trimmedLine[:8] == "package "
35
35
-
}
36
36
-
37
37
-
func countRawStringDelimiters(sourceLine string) int {
38
38
-
delimiterCount := 0
39
39
-
insideDoubleQuotedString := false
40
40
-
insideCharacterLiteral := false
41
41
-
42
42
-
for characterIndex := 0; characterIndex < len(sourceLine); characterIndex++ {
43
43
-
character := sourceLine[characterIndex]
44
44
-
45
45
-
if insideCharacterLiteral {
46
46
-
if character == '\\' && characterIndex+1 < len(sourceLine) {
47
47
-
characterIndex++
48
48
-
49
49
-
continue
50
50
-
}
51
51
-
52
52
-
if character == '\'' {
53
53
-
insideCharacterLiteral = false
54
54
-
}
55
55
-
56
56
-
continue
57
57
-
}
58
58
-
59
59
-
if insideDoubleQuotedString {
60
60
-
if character == '\\' && characterIndex+1 < len(sourceLine) {
61
61
-
characterIndex++
62
62
-
63
63
-
continue
64
64
-
}
65
65
-
66
66
-
if character == '"' {
67
67
-
insideDoubleQuotedString = false
68
68
-
}
69
69
-
70
70
-
continue
71
71
-
}
72
72
-
73
73
-
if character == '\'' {
74
74
-
insideCharacterLiteral = true
75
75
-
76
76
-
continue
77
77
-
}
78
78
-
79
79
-
if character == '"' {
80
80
-
insideDoubleQuotedString = true
81
81
-
82
82
-
continue
83
83
-
}
84
84
-
85
85
-
if character == '`' {
86
86
-
delimiterCount++
87
87
-
}
88
88
-
}
89
89
-
90
90
-
return delimiterCount
91
91
-
}
92
11
93
12
type CommentMode int
94
13
+83
patterns.go
···
1
1
+
package main
2
2
+
3
3
+
import "regexp"
4
4
+
5
5
+
var (
6
6
+
closingBracePattern = regexp.MustCompile(`^\s*[\}\)]`)
7
7
+
openingBracePattern = regexp.MustCompile(`[\{\(]\s*$`)
8
8
+
caseLabelPattern = regexp.MustCompile(`^\s*(case\s|default\s*:)|(^\s+.*:\s*$)`)
9
9
+
)
10
10
+
11
11
+
func isCommentOnly(sourceLine string) bool {
12
12
+
for characterIndex := range len(sourceLine) {
13
13
+
character := sourceLine[characterIndex]
14
14
+
15
15
+
if character == ' ' || character == '\t' {
16
16
+
continue
17
17
+
}
18
18
+
19
19
+
return len(sourceLine) > characterIndex+1 && sourceLine[characterIndex] == '/' && sourceLine[characterIndex+1] == '/'
20
20
+
}
21
21
+
22
22
+
return false
23
23
+
}
24
24
+
25
25
+
func isPackageLine(trimmedLine string) bool {
26
26
+
return len(trimmedLine) > 8 && trimmedLine[:8] == "package "
27
27
+
}
28
28
+
29
29
+
func countRawStringDelimiters(sourceLine string) int {
30
30
+
delimiterCount := 0
31
31
+
insideDoubleQuotedString := false
32
32
+
insideCharacterLiteral := false
33
33
+
34
34
+
for characterIndex := 0; characterIndex < len(sourceLine); characterIndex++ {
35
35
+
character := sourceLine[characterIndex]
36
36
+
37
37
+
if insideCharacterLiteral {
38
38
+
if character == '\\' && characterIndex+1 < len(sourceLine) {
39
39
+
characterIndex++
40
40
+
41
41
+
continue
42
42
+
}
43
43
+
44
44
+
if character == '\'' {
45
45
+
insideCharacterLiteral = false
46
46
+
}
47
47
+
48
48
+
continue
49
49
+
}
50
50
+
51
51
+
if insideDoubleQuotedString {
52
52
+
if character == '\\' && characterIndex+1 < len(sourceLine) {
53
53
+
characterIndex++
54
54
+
55
55
+
continue
56
56
+
}
57
57
+
58
58
+
if character == '"' {
59
59
+
insideDoubleQuotedString = false
60
60
+
}
61
61
+
62
62
+
continue
63
63
+
}
64
64
+
65
65
+
if character == '\'' {
66
66
+
insideCharacterLiteral = true
67
67
+
68
68
+
continue
69
69
+
}
70
70
+
71
71
+
if character == '"' {
72
72
+
insideDoubleQuotedString = true
73
73
+
74
74
+
continue
75
75
+
}
76
76
+
77
77
+
if character == '`' {
78
78
+
delimiterCount++
79
79
+
}
80
80
+
}
81
81
+
82
82
+
return delimiterCount
83
83
+
}