aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/robertkrimen/otto/ast/comments.go
blob: 227e34ecbef79c9f010d1c6a748e910b9e317c54 (plain) (blame)
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package ast

import (
    "fmt"
    "github.com/robertkrimen/otto/file"
)

// CommentPosition determines where the comment is in a given context
type CommentPosition int

const (
    _        CommentPosition = iota
    LEADING                  // Before the pertinent expression
    TRAILING                 // After the pertinent expression
    KEY                      // After a key or keyword
    COLON                    // After a colon in a field declaration
    FINAL                    // Final comments in a block, not belonging to a specific expression or the comment after a trailing , in an array or object literal
    TBD
)

// Comment contains the data of the comment
type Comment struct {
    Begin    file.Idx
    Text     string
    Position CommentPosition
}

// String returns a stringified version of the position
func (cp CommentPosition) String() string {
    switch cp {
    case LEADING:
        return "Leading"
    case TRAILING:
        return "Trailing"
    case KEY:
        return "Key"
    case COLON:
        return "Colon"
    case FINAL:
        return "Final"
    default:
        return "???"
    }
}

// String returns a stringified version of the comment
func (c Comment) String() string {
    return fmt.Sprintf("Comment: %v", c.Text)
}

// CommentMap is the data structure where all found comments are stored
type CommentMap map[Node][]*Comment

// AddComment adds a single comment to the map
func (cm CommentMap) AddComment(node Node, comment *Comment) {
    list := cm[node]
    list = append(list, comment)

    cm[node] = list
}

// AddComments adds a slice of comments, given a node and an updated position
func (cm CommentMap) AddComments(node Node, comments []*Comment, position CommentPosition) {
    for _, comment := range comments {
        comment.Position = position
        cm.AddComment(node, comment)
    }
}

// Size returns the size of the map
func (cm CommentMap) Size() int {
    size := 0
    for _, comments := range cm {
        size += len(comments)
    }

    return size
}

// MoveComments moves comments with a given position from a node to another
func (cm CommentMap) MoveComments(from, to Node, position CommentPosition) {
    for i, c := range cm[from] {
        if c.Position == position {
            cm.AddComment(to, c)

            // Remove the comment from the "from" slice
            cm[from][i] = cm[from][len(cm[from])-1]
            cm[from][len(cm[from])-1] = nil
            cm[from] = cm[from][:len(cm[from])-1]
        }
    }
}