annotate vendor/github.com/yosssi/gcss/line.go @ 81:6ce24b93c8d0 draft

I keep inserting random bugs Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Tue, 12 Dec 2023 14:27:29 +0000
parents 787b5ee0289d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package gcss
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 const unicodeSpace = 32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 const indentTop = 0
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 // line represents a line of codes.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 type line struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 no int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 s string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 indent int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 // isEmpty returns true if the line's s is zero value.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 func (ln *line) isEmpty() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 return strings.TrimSpace(ln.s) == ""
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 // isTopIndent returns true if the line's indent is the top level.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 func (ln *line) isTopIndent() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 return ln.indent == indentTop
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 // childOf returns true if the line is a child of the parent.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 func (ln *line) childOf(parent element) (bool, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 var ok bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 var err error
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 switch pIndent := parent.Base().ln.indent; {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 case ln.indent == pIndent+1:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 ok = true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 case ln.indent > pIndent+1:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 err = fmt.Errorf("indent is invalid [line: %d]", ln.no)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 return ok, err
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 // isDeclaration returns true if the line is a declaration.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 func (ln *line) isDeclaration() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 _, _, err := declarationPV(ln)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 return err == nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 // isAtRule returns true if the line is an at-rule.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 func (ln *line) isAtRule() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 return strings.HasPrefix(strings.TrimSpace(ln.s), atMark)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 // isVariable returns true if the line is a variable.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 func (ln *line) isVariable() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 if !ln.isTopIndent() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 _, _, err := variableNV(ln)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 return err == nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 // isMixinDeclaration returns true if the line is a mixin declaration.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 func (ln *line) isMixinDeclaration() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 if !ln.isTopIndent() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 _, _, err := mixinNP(ln, true)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 return err == nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 // isMixinInvocation returns true if the line is a mixin invocation.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 func (ln *line) isMixinInvocation() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 if ln.isTopIndent() {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 _, _, err := mixinNP(ln, false)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 return err == nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 // isComment returns true if the line is a comment.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 func (ln *line) isComment() bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 return strings.HasPrefix(strings.TrimSpace(ln.s), doubleSlash)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 // newLine creates and returns a line.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 func newLine(no int, s string) *line {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 return &line{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 no: no,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 s: s,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 indent: indent(s),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 // indent returns the string's indent.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 func indent(s string) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 var i int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 for _, b := range s {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 if b != unicodeSpace {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 i++
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 return i / 2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 }