OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [go/] [ast/] [ast.go] - Blame information for rev 774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 747 jeremybenn
// Copyright 2009 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
4
 
5
// Package ast declares the types used to represent syntax trees for Go
6
// packages.
7
//
8
package ast
9
 
10
import (
11
        "go/token"
12
        "strings"
13
        "unicode"
14
        "unicode/utf8"
15
)
16
 
17
// ----------------------------------------------------------------------------
18
// Interfaces
19
//
20
// There are 3 main classes of nodes: Expressions and type nodes,
21
// statement nodes, and declaration nodes. The node names usually
22
// match the corresponding Go spec production names to which they
23
// correspond. The node fields correspond to the individual parts
24
// of the respective productions.
25
//
26
// All nodes contain position information marking the beginning of
27
// the corresponding source text segment; it is accessible via the
28
// Pos accessor method. Nodes may contain additional position info
29
// for language constructs where comments may be found between parts
30
// of the construct (typically any larger, parenthesized subpart).
31
// That position information is needed to properly position comments
32
// when printing the construct.
33
 
34
// All node types implement the Node interface.
35
type Node interface {
36
        Pos() token.Pos // position of first character belonging to the node
37
        End() token.Pos // position of first character immediately after the node
38
}
39
 
40
// All expression nodes implement the Expr interface.
41
type Expr interface {
42
        Node
43
        exprNode()
44
}
45
 
46
// All statement nodes implement the Stmt interface.
47
type Stmt interface {
48
        Node
49
        stmtNode()
50
}
51
 
52
// All declaration nodes implement the Decl interface.
53
type Decl interface {
54
        Node
55
        declNode()
56
}
57
 
58
// ----------------------------------------------------------------------------
59
// Comments
60
 
61
// A Comment node represents a single //-style or /*-style comment.
62
type Comment struct {
63
        Slash token.Pos // position of "/" starting the comment
64
        Text  string    // comment text (excluding '\n' for //-style comments)
65
}
66
 
67
func (c *Comment) Pos() token.Pos { return c.Slash }
68
func (c *Comment) End() token.Pos { return token.Pos(int(c.Slash) + len(c.Text)) }
69
 
70
// A CommentGroup represents a sequence of comments
71
// with no other tokens and no empty lines between.
72
//
73
type CommentGroup struct {
74
        List []*Comment // len(List) > 0
75
}
76
 
77
func (g *CommentGroup) Pos() token.Pos { return g.List[0].Pos() }
78
func (g *CommentGroup) End() token.Pos { return g.List[len(g.List)-1].End() }
79
 
80
func isWhitespace(ch byte) bool { return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' }
81
 
82
func stripTrailingWhitespace(s string) string {
83
        i := len(s)
84
        for i > 0 && isWhitespace(s[i-1]) {
85
                i--
86
        }
87
        return s[0:i]
88
}
89
 
90
// Text returns the text of the comment,
91
// with the comment markers - //, /*, and */ - removed.
92
func (g *CommentGroup) Text() string {
93
        if g == nil {
94
                return ""
95
        }
96
        comments := make([]string, len(g.List))
97
        for i, c := range g.List {
98
                comments[i] = string(c.Text)
99
        }
100
 
101
        lines := make([]string, 0, 10) // most comments are less than 10 lines
102
        for _, c := range comments {
103
                // Remove comment markers.
104
                // The parser has given us exactly the comment text.
105
                switch c[1] {
106
                case '/':
107
                        //-style comment
108
                        c = c[2:]
109
                        // Remove leading space after //, if there is one.
110
                        // TODO(gri) This appears to be necessary in isolated
111
                        //           cases (bignum.RatFromString) - why?
112
                        if len(c) > 0 && c[0] == ' ' {
113
                                c = c[1:]
114
                        }
115
                case '*':
116
                        /*-style comment */
117
                        c = c[2 : len(c)-2]
118
                }
119
 
120
                // Split on newlines.
121
                cl := strings.Split(c, "\n")
122
 
123
                // Walk lines, stripping trailing white space and adding to list.
124
                for _, l := range cl {
125
                        lines = append(lines, stripTrailingWhitespace(l))
126
                }
127
        }
128
 
129
        // Remove leading blank lines; convert runs of
130
        // interior blank lines to a single blank line.
131
        n := 0
132
        for _, line := range lines {
133
                if line != "" || n > 0 && lines[n-1] != "" {
134
                        lines[n] = line
135
                        n++
136
                }
137
        }
138
        lines = lines[0:n]
139
 
140
        // Add final "" entry to get trailing newline from Join.
141
        if n > 0 && lines[n-1] != "" {
142
                lines = append(lines, "")
143
        }
144
 
145
        return strings.Join(lines, "\n")
146
}
147
 
148
// ----------------------------------------------------------------------------
149
// Expressions and types
150
 
151
// A Field represents a Field declaration list in a struct type,
152
// a method list in an interface type, or a parameter/result declaration
153
// in a signature.
154
//
155
type Field struct {
156
        Doc     *CommentGroup // associated documentation; or nil
157
        Names   []*Ident      // field/method/parameter names; or nil if anonymous field
158
        Type    Expr          // field/method/parameter type
159
        Tag     *BasicLit     // field tag; or nil
160
        Comment *CommentGroup // line comments; or nil
161
}
162
 
163
func (f *Field) Pos() token.Pos {
164
        if len(f.Names) > 0 {
165
                return f.Names[0].Pos()
166
        }
167
        return f.Type.Pos()
168
}
169
 
170
func (f *Field) End() token.Pos {
171
        if f.Tag != nil {
172
                return f.Tag.End()
173
        }
174
        return f.Type.End()
175
}
176
 
177
// A FieldList represents a list of Fields, enclosed by parentheses or braces.
178
type FieldList struct {
179
        Opening token.Pos // position of opening parenthesis/brace, if any
180
        List    []*Field  // field list; or nil
181
        Closing token.Pos // position of closing parenthesis/brace, if any
182
}
183
 
184
func (f *FieldList) Pos() token.Pos {
185
        if f.Opening.IsValid() {
186
                return f.Opening
187
        }
188
        // the list should not be empty in this case;
189
        // be conservative and guard against bad ASTs
190
        if len(f.List) > 0 {
191
                return f.List[0].Pos()
192
        }
193
        return token.NoPos
194
}
195
 
196
func (f *FieldList) End() token.Pos {
197
        if f.Closing.IsValid() {
198
                return f.Closing + 1
199
        }
200
        // the list should not be empty in this case;
201
        // be conservative and guard against bad ASTs
202
        if n := len(f.List); n > 0 {
203
                return f.List[n-1].End()
204
        }
205
        return token.NoPos
206
}
207
 
208
// NumFields returns the number of (named and anonymous fields) in a FieldList.
209
func (f *FieldList) NumFields() int {
210
        n := 0
211
        if f != nil {
212
                for _, g := range f.List {
213
                        m := len(g.Names)
214
                        if m == 0 {
215
                                m = 1 // anonymous field
216
                        }
217
                        n += m
218
                }
219
        }
220
        return n
221
}
222
 
223
// An expression is represented by a tree consisting of one
224
// or more of the following concrete expression nodes.
225
//
226
type (
227
        // A BadExpr node is a placeholder for expressions containing
228
        // syntax errors for which no correct expression nodes can be
229
        // created.
230
        //
231
        BadExpr struct {
232
                From, To token.Pos // position range of bad expression
233
        }
234
 
235
        // An Ident node represents an identifier.
236
        Ident struct {
237
                NamePos token.Pos // identifier position
238
                Name    string    // identifier name
239
                Obj     *Object   // denoted object; or nil
240
        }
241
 
242
        // An Ellipsis node stands for the "..." type in a
243
        // parameter list or the "..." length in an array type.
244
        //
245
        Ellipsis struct {
246
                Ellipsis token.Pos // position of "..."
247
                Elt      Expr      // ellipsis element type (parameter lists only); or nil
248
        }
249
 
250
        // A BasicLit node represents a literal of basic type.
251
        BasicLit struct {
252
                ValuePos token.Pos   // literal position
253
                Kind     token.Token // token.INT, token.FLOAT, token.IMAG, token.CHAR, or token.STRING
254
                Value    string      // literal string; e.g. 42, 0x7f, 3.14, 1e-9, 2.4i, 'a', '\x7f', "foo" or `\m\n\o`
255
        }
256
 
257
        // A FuncLit node represents a function literal.
258
        FuncLit struct {
259
                Type *FuncType  // function type
260
                Body *BlockStmt // function body
261
        }
262
 
263
        // A CompositeLit node represents a composite literal.
264
        CompositeLit struct {
265
                Type   Expr      // literal type; or nil
266
                Lbrace token.Pos // position of "{"
267
                Elts   []Expr    // list of composite elements; or nil
268
                Rbrace token.Pos // position of "}"
269
        }
270
 
271
        // A ParenExpr node represents a parenthesized expression.
272
        ParenExpr struct {
273
                Lparen token.Pos // position of "("
274
                X      Expr      // parenthesized expression
275
                Rparen token.Pos // position of ")"
276
        }
277
 
278
        // A SelectorExpr node represents an expression followed by a selector.
279
        SelectorExpr struct {
280
                X   Expr   // expression
281
                Sel *Ident // field selector
282
        }
283
 
284
        // An IndexExpr node represents an expression followed by an index.
285
        IndexExpr struct {
286
                X      Expr      // expression
287
                Lbrack token.Pos // position of "["
288
                Index  Expr      // index expression
289
                Rbrack token.Pos // position of "]"
290
        }
291
 
292
        // An SliceExpr node represents an expression followed by slice indices.
293
        SliceExpr struct {
294
                X      Expr      // expression
295
                Lbrack token.Pos // position of "["
296
                Low    Expr      // begin of slice range; or nil
297
                High   Expr      // end of slice range; or nil
298
                Rbrack token.Pos // position of "]"
299
        }
300
 
301
        // A TypeAssertExpr node represents an expression followed by a
302
        // type assertion.
303
        //
304
        TypeAssertExpr struct {
305
                X    Expr // expression
306
                Type Expr // asserted type; nil means type switch X.(type)
307
        }
308
 
309
        // A CallExpr node represents an expression followed by an argument list.
310
        CallExpr struct {
311
                Fun      Expr      // function expression
312
                Lparen   token.Pos // position of "("
313
                Args     []Expr    // function arguments; or nil
314
                Ellipsis token.Pos // position of "...", if any
315
                Rparen   token.Pos // position of ")"
316
        }
317
 
318
        // A StarExpr node represents an expression of the form "*" Expression.
319
        // Semantically it could be a unary "*" expression, or a pointer type.
320
        //
321
        StarExpr struct {
322
                Star token.Pos // position of "*"
323
                X    Expr      // operand
324
        }
325
 
326
        // A UnaryExpr node represents a unary expression.
327
        // Unary "*" expressions are represented via StarExpr nodes.
328
        //
329
        UnaryExpr struct {
330
                OpPos token.Pos   // position of Op
331
                Op    token.Token // operator
332
                X     Expr        // operand
333
        }
334
 
335
        // A BinaryExpr node represents a binary expression.
336
        BinaryExpr struct {
337
                X     Expr        // left operand
338
                OpPos token.Pos   // position of Op
339
                Op    token.Token // operator
340
                Y     Expr        // right operand
341
        }
342
 
343
        // A KeyValueExpr node represents (key : value) pairs
344
        // in composite literals.
345
        //
346
        KeyValueExpr struct {
347
                Key   Expr
348
                Colon token.Pos // position of ":"
349
                Value Expr
350
        }
351
)
352
 
353
// The direction of a channel type is indicated by one
354
// of the following constants.
355
//
356
type ChanDir int
357
 
358
const (
359
        SEND ChanDir = 1 << iota
360
        RECV
361
)
362
 
363
// A type is represented by a tree consisting of one
364
// or more of the following type-specific expression
365
// nodes.
366
//
367
type (
368
        // An ArrayType node represents an array or slice type.
369
        ArrayType struct {
370
                Lbrack token.Pos // position of "["
371
                Len    Expr      // Ellipsis node for [...]T array types, nil for slice types
372
                Elt    Expr      // element type
373
        }
374
 
375
        // A StructType node represents a struct type.
376
        StructType struct {
377
                Struct     token.Pos  // position of "struct" keyword
378
                Fields     *FieldList // list of field declarations
379
                Incomplete bool       // true if (source) fields are missing in the Fields list
380
        }
381
 
382
        // Pointer types are represented via StarExpr nodes.
383
 
384
        // A FuncType node represents a function type.
385
        FuncType struct {
386
                Func    token.Pos  // position of "func" keyword
387
                Params  *FieldList // (incoming) parameters; or nil
388
                Results *FieldList // (outgoing) results; or nil
389
        }
390
 
391
        // An InterfaceType node represents an interface type.
392
        InterfaceType struct {
393
                Interface  token.Pos  // position of "interface" keyword
394
                Methods    *FieldList // list of methods
395
                Incomplete bool       // true if (source) methods are missing in the Methods list
396
        }
397
 
398
        // A MapType node represents a map type.
399
        MapType struct {
400
                Map   token.Pos // position of "map" keyword
401
                Key   Expr
402
                Value Expr
403
        }
404
 
405
        // A ChanType node represents a channel type.
406
        ChanType struct {
407
                Begin token.Pos // position of "chan" keyword or "<-" (whichever comes first)
408
                Dir   ChanDir   // channel direction
409
                Value Expr      // value type
410
        }
411
)
412
 
413
// Pos and End implementations for expression/type nodes.
414
//
415
func (x *BadExpr) Pos() token.Pos  { return x.From }
416
func (x *Ident) Pos() token.Pos    { return x.NamePos }
417
func (x *Ellipsis) Pos() token.Pos { return x.Ellipsis }
418
func (x *BasicLit) Pos() token.Pos { return x.ValuePos }
419
func (x *FuncLit) Pos() token.Pos  { return x.Type.Pos() }
420
func (x *CompositeLit) Pos() token.Pos {
421
        if x.Type != nil {
422
                return x.Type.Pos()
423
        }
424
        return x.Lbrace
425
}
426
func (x *ParenExpr) Pos() token.Pos      { return x.Lparen }
427
func (x *SelectorExpr) Pos() token.Pos   { return x.X.Pos() }
428
func (x *IndexExpr) Pos() token.Pos      { return x.X.Pos() }
429
func (x *SliceExpr) Pos() token.Pos      { return x.X.Pos() }
430
func (x *TypeAssertExpr) Pos() token.Pos { return x.X.Pos() }
431
func (x *CallExpr) Pos() token.Pos       { return x.Fun.Pos() }
432
func (x *StarExpr) Pos() token.Pos       { return x.Star }
433
func (x *UnaryExpr) Pos() token.Pos      { return x.OpPos }
434
func (x *BinaryExpr) Pos() token.Pos     { return x.X.Pos() }
435
func (x *KeyValueExpr) Pos() token.Pos   { return x.Key.Pos() }
436
func (x *ArrayType) Pos() token.Pos      { return x.Lbrack }
437
func (x *StructType) Pos() token.Pos     { return x.Struct }
438
func (x *FuncType) Pos() token.Pos       { return x.Func }
439
func (x *InterfaceType) Pos() token.Pos  { return x.Interface }
440
func (x *MapType) Pos() token.Pos        { return x.Map }
441
func (x *ChanType) Pos() token.Pos       { return x.Begin }
442
 
443
func (x *BadExpr) End() token.Pos { return x.To }
444
func (x *Ident) End() token.Pos   { return token.Pos(int(x.NamePos) + len(x.Name)) }
445
func (x *Ellipsis) End() token.Pos {
446
        if x.Elt != nil {
447
                return x.Elt.End()
448
        }
449
        return x.Ellipsis + 3 // len("...")
450
}
451
func (x *BasicLit) End() token.Pos     { return token.Pos(int(x.ValuePos) + len(x.Value)) }
452
func (x *FuncLit) End() token.Pos      { return x.Body.End() }
453
func (x *CompositeLit) End() token.Pos { return x.Rbrace + 1 }
454
func (x *ParenExpr) End() token.Pos    { return x.Rparen + 1 }
455
func (x *SelectorExpr) End() token.Pos { return x.Sel.End() }
456
func (x *IndexExpr) End() token.Pos    { return x.Rbrack + 1 }
457
func (x *SliceExpr) End() token.Pos    { return x.Rbrack + 1 }
458
func (x *TypeAssertExpr) End() token.Pos {
459
        if x.Type != nil {
460
                return x.Type.End()
461
        }
462
        return x.X.End()
463
}
464
func (x *CallExpr) End() token.Pos     { return x.Rparen + 1 }
465
func (x *StarExpr) End() token.Pos     { return x.X.End() }
466
func (x *UnaryExpr) End() token.Pos    { return x.X.End() }
467
func (x *BinaryExpr) End() token.Pos   { return x.Y.End() }
468
func (x *KeyValueExpr) End() token.Pos { return x.Value.End() }
469
func (x *ArrayType) End() token.Pos    { return x.Elt.End() }
470
func (x *StructType) End() token.Pos   { return x.Fields.End() }
471
func (x *FuncType) End() token.Pos {
472
        if x.Results != nil {
473
                return x.Results.End()
474
        }
475
        return x.Params.End()
476
}
477
func (x *InterfaceType) End() token.Pos { return x.Methods.End() }
478
func (x *MapType) End() token.Pos       { return x.Value.End() }
479
func (x *ChanType) End() token.Pos      { return x.Value.End() }
480
 
481
// exprNode() ensures that only expression/type nodes can be
482
// assigned to an ExprNode.
483
//
484
func (*BadExpr) exprNode()        {}
485
func (*Ident) exprNode()          {}
486
func (*Ellipsis) exprNode()       {}
487
func (*BasicLit) exprNode()       {}
488
func (*FuncLit) exprNode()        {}
489
func (*CompositeLit) exprNode()   {}
490
func (*ParenExpr) exprNode()      {}
491
func (*SelectorExpr) exprNode()   {}
492
func (*IndexExpr) exprNode()      {}
493
func (*SliceExpr) exprNode()      {}
494
func (*TypeAssertExpr) exprNode() {}
495
func (*CallExpr) exprNode()       {}
496
func (*StarExpr) exprNode()       {}
497
func (*UnaryExpr) exprNode()      {}
498
func (*BinaryExpr) exprNode()     {}
499
func (*KeyValueExpr) exprNode()   {}
500
 
501
func (*ArrayType) exprNode()     {}
502
func (*StructType) exprNode()    {}
503
func (*FuncType) exprNode()      {}
504
func (*InterfaceType) exprNode() {}
505
func (*MapType) exprNode()       {}
506
func (*ChanType) exprNode()      {}
507
 
508
// ----------------------------------------------------------------------------
509
// Convenience functions for Idents
510
 
511
var noPos token.Pos
512
 
513
// NewIdent creates a new Ident without position.
514
// Useful for ASTs generated by code other than the Go parser.
515
//
516
func NewIdent(name string) *Ident { return &Ident{noPos, name, nil} }
517
 
518
// IsExported returns whether name is an exported Go symbol
519
// (i.e., whether it begins with an uppercase letter).
520
//
521
func IsExported(name string) bool {
522
        ch, _ := utf8.DecodeRuneInString(name)
523
        return unicode.IsUpper(ch)
524
}
525
 
526
// IsExported returns whether id is an exported Go symbol
527
// (i.e., whether it begins with an uppercase letter).
528
//
529
func (id *Ident) IsExported() bool { return IsExported(id.Name) }
530
 
531
func (id *Ident) String() string {
532
        if id != nil {
533
                return id.Name
534
        }
535
        return ""
536
}
537
 
538
// ----------------------------------------------------------------------------
539
// Statements
540
 
541
// A statement is represented by a tree consisting of one
542
// or more of the following concrete statement nodes.
543
//
544
type (
545
        // A BadStmt node is a placeholder for statements containing
546
        // syntax errors for which no correct statement nodes can be
547
        // created.
548
        //
549
        BadStmt struct {
550
                From, To token.Pos // position range of bad statement
551
        }
552
 
553
        // A DeclStmt node represents a declaration in a statement list.
554
        DeclStmt struct {
555
                Decl Decl
556
        }
557
 
558
        // An EmptyStmt node represents an empty statement.
559
        // The "position" of the empty statement is the position
560
        // of the immediately preceding semicolon.
561
        //
562
        EmptyStmt struct {
563
                Semicolon token.Pos // position of preceding ";"
564
        }
565
 
566
        // A LabeledStmt node represents a labeled statement.
567
        LabeledStmt struct {
568
                Label *Ident
569
                Colon token.Pos // position of ":"
570
                Stmt  Stmt
571
        }
572
 
573
        // An ExprStmt node represents a (stand-alone) expression
574
        // in a statement list.
575
        //
576
        ExprStmt struct {
577
                X Expr // expression
578
        }
579
 
580
        // A SendStmt node represents a send statement.
581
        SendStmt struct {
582
                Chan  Expr
583
                Arrow token.Pos // position of "<-"
584
                Value Expr
585
        }
586
 
587
        // An IncDecStmt node represents an increment or decrement statement.
588
        IncDecStmt struct {
589
                X      Expr
590
                TokPos token.Pos   // position of Tok
591
                Tok    token.Token // INC or DEC
592
        }
593
 
594
        // An AssignStmt node represents an assignment or
595
        // a short variable declaration.
596
        //
597
        AssignStmt struct {
598
                Lhs    []Expr
599
                TokPos token.Pos   // position of Tok
600
                Tok    token.Token // assignment token, DEFINE
601
                Rhs    []Expr
602
        }
603
 
604
        // A GoStmt node represents a go statement.
605
        GoStmt struct {
606
                Go   token.Pos // position of "go" keyword
607
                Call *CallExpr
608
        }
609
 
610
        // A DeferStmt node represents a defer statement.
611
        DeferStmt struct {
612
                Defer token.Pos // position of "defer" keyword
613
                Call  *CallExpr
614
        }
615
 
616
        // A ReturnStmt node represents a return statement.
617
        ReturnStmt struct {
618
                Return  token.Pos // position of "return" keyword
619
                Results []Expr    // result expressions; or nil
620
        }
621
 
622
        // A BranchStmt node represents a break, continue, goto,
623
        // or fallthrough statement.
624
        //
625
        BranchStmt struct {
626
                TokPos token.Pos   // position of Tok
627
                Tok    token.Token // keyword token (BREAK, CONTINUE, GOTO, FALLTHROUGH)
628
                Label  *Ident      // label name; or nil
629
        }
630
 
631
        // A BlockStmt node represents a braced statement list.
632
        BlockStmt struct {
633
                Lbrace token.Pos // position of "{"
634
                List   []Stmt
635
                Rbrace token.Pos // position of "}"
636
        }
637
 
638
        // An IfStmt node represents an if statement.
639
        IfStmt struct {
640
                If   token.Pos // position of "if" keyword
641
                Init Stmt      // initialization statement; or nil
642
                Cond Expr      // condition
643
                Body *BlockStmt
644
                Else Stmt // else branch; or nil
645
        }
646
 
647
        // A CaseClause represents a case of an expression or type switch statement.
648
        CaseClause struct {
649
                Case  token.Pos // position of "case" or "default" keyword
650
                List  []Expr    // list of expressions or types; nil means default case
651
                Colon token.Pos // position of ":"
652
                Body  []Stmt    // statement list; or nil
653
        }
654
 
655
        // A SwitchStmt node represents an expression switch statement.
656
        SwitchStmt struct {
657
                Switch token.Pos  // position of "switch" keyword
658
                Init   Stmt       // initialization statement; or nil
659
                Tag    Expr       // tag expression; or nil
660
                Body   *BlockStmt // CaseClauses only
661
        }
662
 
663
        // An TypeSwitchStmt node represents a type switch statement.
664
        TypeSwitchStmt struct {
665
                Switch token.Pos  // position of "switch" keyword
666
                Init   Stmt       // initialization statement; or nil
667
                Assign Stmt       // x := y.(type) or y.(type)
668
                Body   *BlockStmt // CaseClauses only
669
        }
670
 
671
        // A CommClause node represents a case of a select statement.
672
        CommClause struct {
673
                Case  token.Pos // position of "case" or "default" keyword
674
                Comm  Stmt      // send or receive statement; nil means default case
675
                Colon token.Pos // position of ":"
676
                Body  []Stmt    // statement list; or nil
677
        }
678
 
679
        // An SelectStmt node represents a select statement.
680
        SelectStmt struct {
681
                Select token.Pos  // position of "select" keyword
682
                Body   *BlockStmt // CommClauses only
683
        }
684
 
685
        // A ForStmt represents a for statement.
686
        ForStmt struct {
687
                For  token.Pos // position of "for" keyword
688
                Init Stmt      // initialization statement; or nil
689
                Cond Expr      // condition; or nil
690
                Post Stmt      // post iteration statement; or nil
691
                Body *BlockStmt
692
        }
693
 
694
        // A RangeStmt represents a for statement with a range clause.
695
        RangeStmt struct {
696
                For        token.Pos   // position of "for" keyword
697
                Key, Value Expr        // Value may be nil
698
                TokPos     token.Pos   // position of Tok
699
                Tok        token.Token // ASSIGN, DEFINE
700
                X          Expr        // value to range over
701
                Body       *BlockStmt
702
        }
703
)
704
 
705
// Pos and End implementations for statement nodes.
706
//
707
func (s *BadStmt) Pos() token.Pos        { return s.From }
708
func (s *DeclStmt) Pos() token.Pos       { return s.Decl.Pos() }
709
func (s *EmptyStmt) Pos() token.Pos      { return s.Semicolon }
710
func (s *LabeledStmt) Pos() token.Pos    { return s.Label.Pos() }
711
func (s *ExprStmt) Pos() token.Pos       { return s.X.Pos() }
712
func (s *SendStmt) Pos() token.Pos       { return s.Chan.Pos() }
713
func (s *IncDecStmt) Pos() token.Pos     { return s.X.Pos() }
714
func (s *AssignStmt) Pos() token.Pos     { return s.Lhs[0].Pos() }
715
func (s *GoStmt) Pos() token.Pos         { return s.Go }
716
func (s *DeferStmt) Pos() token.Pos      { return s.Defer }
717
func (s *ReturnStmt) Pos() token.Pos     { return s.Return }
718
func (s *BranchStmt) Pos() token.Pos     { return s.TokPos }
719
func (s *BlockStmt) Pos() token.Pos      { return s.Lbrace }
720
func (s *IfStmt) Pos() token.Pos         { return s.If }
721
func (s *CaseClause) Pos() token.Pos     { return s.Case }
722
func (s *SwitchStmt) Pos() token.Pos     { return s.Switch }
723
func (s *TypeSwitchStmt) Pos() token.Pos { return s.Switch }
724
func (s *CommClause) Pos() token.Pos     { return s.Case }
725
func (s *SelectStmt) Pos() token.Pos     { return s.Select }
726
func (s *ForStmt) Pos() token.Pos        { return s.For }
727
func (s *RangeStmt) Pos() token.Pos      { return s.For }
728
 
729
func (s *BadStmt) End() token.Pos  { return s.To }
730
func (s *DeclStmt) End() token.Pos { return s.Decl.End() }
731
func (s *EmptyStmt) End() token.Pos {
732
        return s.Semicolon + 1 /* len(";") */
733
}
734
func (s *LabeledStmt) End() token.Pos { return s.Stmt.End() }
735
func (s *ExprStmt) End() token.Pos    { return s.X.End() }
736
func (s *SendStmt) End() token.Pos    { return s.Value.End() }
737
func (s *IncDecStmt) End() token.Pos {
738
        return s.TokPos + 2 /* len("++") */
739
}
740
func (s *AssignStmt) End() token.Pos { return s.Rhs[len(s.Rhs)-1].End() }
741
func (s *GoStmt) End() token.Pos     { return s.Call.End() }
742
func (s *DeferStmt) End() token.Pos  { return s.Call.End() }
743
func (s *ReturnStmt) End() token.Pos {
744
        if n := len(s.Results); n > 0 {
745
                return s.Results[n-1].End()
746
        }
747
        return s.Return + 6 // len("return")
748
}
749
func (s *BranchStmt) End() token.Pos {
750
        if s.Label != nil {
751
                return s.Label.End()
752
        }
753
        return token.Pos(int(s.TokPos) + len(s.Tok.String()))
754
}
755
func (s *BlockStmt) End() token.Pos { return s.Rbrace + 1 }
756
func (s *IfStmt) End() token.Pos {
757
        if s.Else != nil {
758
                return s.Else.End()
759
        }
760
        return s.Body.End()
761
}
762
func (s *CaseClause) End() token.Pos {
763
        if n := len(s.Body); n > 0 {
764
                return s.Body[n-1].End()
765
        }
766
        return s.Colon + 1
767
}
768
func (s *SwitchStmt) End() token.Pos     { return s.Body.End() }
769
func (s *TypeSwitchStmt) End() token.Pos { return s.Body.End() }
770
func (s *CommClause) End() token.Pos {
771
        if n := len(s.Body); n > 0 {
772
                return s.Body[n-1].End()
773
        }
774
        return s.Colon + 1
775
}
776
func (s *SelectStmt) End() token.Pos { return s.Body.End() }
777
func (s *ForStmt) End() token.Pos    { return s.Body.End() }
778
func (s *RangeStmt) End() token.Pos  { return s.Body.End() }
779
 
780
// stmtNode() ensures that only statement nodes can be
781
// assigned to a StmtNode.
782
//
783
func (*BadStmt) stmtNode()        {}
784
func (*DeclStmt) stmtNode()       {}
785
func (*EmptyStmt) stmtNode()      {}
786
func (*LabeledStmt) stmtNode()    {}
787
func (*ExprStmt) stmtNode()       {}
788
func (*SendStmt) stmtNode()       {}
789
func (*IncDecStmt) stmtNode()     {}
790
func (*AssignStmt) stmtNode()     {}
791
func (*GoStmt) stmtNode()         {}
792
func (*DeferStmt) stmtNode()      {}
793
func (*ReturnStmt) stmtNode()     {}
794
func (*BranchStmt) stmtNode()     {}
795
func (*BlockStmt) stmtNode()      {}
796
func (*IfStmt) stmtNode()         {}
797
func (*CaseClause) stmtNode()     {}
798
func (*SwitchStmt) stmtNode()     {}
799
func (*TypeSwitchStmt) stmtNode() {}
800
func (*CommClause) stmtNode()     {}
801
func (*SelectStmt) stmtNode()     {}
802
func (*ForStmt) stmtNode()        {}
803
func (*RangeStmt) stmtNode()      {}
804
 
805
// ----------------------------------------------------------------------------
806
// Declarations
807
 
808
// A Spec node represents a single (non-parenthesized) import,
809
// constant, type, or variable declaration.
810
//
811
type (
812
        // The Spec type stands for any of *ImportSpec, *ValueSpec, and *TypeSpec.
813
        Spec interface {
814
                Node
815
                specNode()
816
        }
817
 
818
        // An ImportSpec node represents a single package import.
819
        ImportSpec struct {
820
                Doc     *CommentGroup // associated documentation; or nil
821
                Name    *Ident        // local package name (including "."); or nil
822
                Path    *BasicLit     // import path
823
                Comment *CommentGroup // line comments; or nil
824
                EndPos  token.Pos     // end of spec (overrides Path.Pos if nonzero)
825
        }
826
 
827
        // A ValueSpec node represents a constant or variable declaration
828
        // (ConstSpec or VarSpec production).
829
        //
830
        ValueSpec struct {
831
                Doc     *CommentGroup // associated documentation; or nil
832
                Names   []*Ident      // value names (len(Names) > 0)
833
                Type    Expr          // value type; or nil
834
                Values  []Expr        // initial values; or nil
835
                Comment *CommentGroup // line comments; or nil
836
        }
837
 
838
        // A TypeSpec node represents a type declaration (TypeSpec production).
839
        TypeSpec struct {
840
                Doc     *CommentGroup // associated documentation; or nil
841
                Name    *Ident        // type name
842
                Type    Expr          // *Ident, *ParenExpr, *SelectorExpr, *StarExpr, or any of the *XxxTypes
843
                Comment *CommentGroup // line comments; or nil
844
        }
845
)
846
 
847
// Pos and End implementations for spec nodes.
848
//
849
func (s *ImportSpec) Pos() token.Pos {
850
        if s.Name != nil {
851
                return s.Name.Pos()
852
        }
853
        return s.Path.Pos()
854
}
855
func (s *ValueSpec) Pos() token.Pos { return s.Names[0].Pos() }
856
func (s *TypeSpec) Pos() token.Pos  { return s.Name.Pos() }
857
 
858
func (s *ImportSpec) End() token.Pos {
859
        if s.EndPos != 0 {
860
                return s.EndPos
861
        }
862
        return s.Path.End()
863
}
864
 
865
func (s *ValueSpec) End() token.Pos {
866
        if n := len(s.Values); n > 0 {
867
                return s.Values[n-1].End()
868
        }
869
        if s.Type != nil {
870
                return s.Type.End()
871
        }
872
        return s.Names[len(s.Names)-1].End()
873
}
874
func (s *TypeSpec) End() token.Pos { return s.Type.End() }
875
 
876
// specNode() ensures that only spec nodes can be
877
// assigned to a Spec.
878
//
879
func (*ImportSpec) specNode() {}
880
func (*ValueSpec) specNode()  {}
881
func (*TypeSpec) specNode()   {}
882
 
883
// A declaration is represented by one of the following declaration nodes.
884
//
885
type (
886
        // A BadDecl node is a placeholder for declarations containing
887
        // syntax errors for which no correct declaration nodes can be
888
        // created.
889
        //
890
        BadDecl struct {
891
                From, To token.Pos // position range of bad declaration
892
        }
893
 
894
        // A GenDecl node (generic declaration node) represents an import,
895
        // constant, type or variable declaration. A valid Lparen position
896
        // (Lparen.Line > 0) indicates a parenthesized declaration.
897
        //
898
        // Relationship between Tok value and Specs element type:
899
        //
900
        //      token.IMPORT  *ImportSpec
901
        //      token.CONST   *ValueSpec
902
        //      token.TYPE    *TypeSpec
903
        //      token.VAR     *ValueSpec
904
        //
905
        GenDecl struct {
906
                Doc    *CommentGroup // associated documentation; or nil
907
                TokPos token.Pos     // position of Tok
908
                Tok    token.Token   // IMPORT, CONST, TYPE, VAR
909
                Lparen token.Pos     // position of '(', if any
910
                Specs  []Spec
911
                Rparen token.Pos // position of ')', if any
912
        }
913
 
914
        // A FuncDecl node represents a function declaration.
915
        FuncDecl struct {
916
                Doc  *CommentGroup // associated documentation; or nil
917
                Recv *FieldList    // receiver (methods); or nil (functions)
918
                Name *Ident        // function/method name
919
                Type *FuncType     // position of Func keyword, parameters and results
920
                Body *BlockStmt    // function body; or nil (forward declaration)
921
        }
922
)
923
 
924
// Pos and End implementations for declaration nodes.
925
//
926
func (d *BadDecl) Pos() token.Pos  { return d.From }
927
func (d *GenDecl) Pos() token.Pos  { return d.TokPos }
928
func (d *FuncDecl) Pos() token.Pos { return d.Type.Pos() }
929
 
930
func (d *BadDecl) End() token.Pos { return d.To }
931
func (d *GenDecl) End() token.Pos {
932
        if d.Rparen.IsValid() {
933
                return d.Rparen + 1
934
        }
935
        return d.Specs[0].End()
936
}
937
func (d *FuncDecl) End() token.Pos {
938
        if d.Body != nil {
939
                return d.Body.End()
940
        }
941
        return d.Type.End()
942
}
943
 
944
// declNode() ensures that only declaration nodes can be
945
// assigned to a DeclNode.
946
//
947
func (*BadDecl) declNode()  {}
948
func (*GenDecl) declNode()  {}
949
func (*FuncDecl) declNode() {}
950
 
951
// ----------------------------------------------------------------------------
952
// Files and packages
953
 
954
// A File node represents a Go source file.
955
//
956
// The Comments list contains all comments in the source file in order of
957
// appearance, including the comments that are pointed to from other nodes
958
// via Doc and Comment fields.
959
//
960
type File struct {
961
        Doc        *CommentGroup   // associated documentation; or nil
962
        Package    token.Pos       // position of "package" keyword
963
        Name       *Ident          // package name
964
        Decls      []Decl          // top-level declarations; or nil
965
        Scope      *Scope          // package scope (this file only)
966
        Imports    []*ImportSpec   // imports in this file
967
        Unresolved []*Ident        // unresolved identifiers in this file
968
        Comments   []*CommentGroup // list of all comments in the source file
969
}
970
 
971
func (f *File) Pos() token.Pos { return f.Package }
972
func (f *File) End() token.Pos {
973
        if n := len(f.Decls); n > 0 {
974
                return f.Decls[n-1].End()
975
        }
976
        return f.Name.End()
977
}
978
 
979
// A Package node represents a set of source files
980
// collectively building a Go package.
981
//
982
type Package struct {
983
        Name    string             // package name
984
        Scope   *Scope             // package scope across all files
985
        Imports map[string]*Object // map of package id -> package object
986
        Files   map[string]*File   // Go source files by filename
987
}
988
 
989
func (p *Package) Pos() token.Pos { return token.NoPos }
990
func (p *Package) End() token.Pos { return token.NoPos }

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.