go_parser/
parser.rs

1// Copyright 2022 The Goscript 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//
6// This code is adapted from the offical Go code written in Go
7// with license as follows:
8// Copyright 2013 The Go Authors. All rights reserved.
9// Use of this source code is governed by a BSD-style
10// license that can be found in the LICENSE file.
11
12use super::ast::*;
13use super::errors::{ErrorList, FilePosErrors};
14use super::objects::*;
15use super::position;
16use super::scanner;
17use super::scope::*;
18use super::token::{Token, LOWEST_PREC};
19use std::rc::Rc;
20
21macro_rules! new_scope {
22    ($owner:ident, $outer:expr) => {
23        $owner.objects.scopes.insert(Scope::new($outer))
24    };
25}
26
27macro_rules! new_ident {
28    ($owner:ident, $pos:expr, $name:expr, $entity:expr) => {
29        $owner.objects.idents.insert(Ident {
30            pos: $pos,
31            name: $name,
32            entity: $entity,
33        })
34    };
35}
36
37macro_rules! new_field {
38    ($owner:ident, $names:expr, $typ:expr, $tag:expr) => {
39        $owner.objects.fields.insert(Field {
40            names: $names,
41            typ: $typ,
42            tag: $tag,
43        })
44    };
45}
46
47// Parsing modes for parseSimpleStmt.
48#[derive(PartialEq, Eq)]
49enum ParseSimpleMode {
50    Basic,
51    LabelOk,
52    RangeOk,
53}
54
55pub struct Parser<'a> {
56    objects: &'a mut AstObjects,
57    scanner: scanner::Scanner<'a>,
58    errors: &'a ErrorList,
59
60    trace: bool,
61    indent: isize,
62
63    pos: position::Pos,
64    token: Token,
65
66    sync_pos: position::Pos,
67    sync_count: isize,
68
69    expr_level: isize,
70    in_rhs: bool,
71
72    pkg_scope: Option<ScopeKey>,
73    top_scope: Option<ScopeKey>,
74    unresolved: Vec<IdentKey>,
75    imports: Vec<SpecKey>, //ImportSpec
76
77    label_scope: Option<ScopeKey>,
78    target_stack: Vec<Vec<IdentKey>>,
79}
80
81impl<'a> Parser<'a> {
82    pub fn new(
83        objs: &'a mut AstObjects,
84        file: &'a mut position::File,
85        el: &'a ErrorList,
86        src: &'a str,
87        trace: bool,
88    ) -> Parser<'a> {
89        let s = scanner::Scanner::new(file, src, el);
90        let mut p = Parser {
91            objects: objs,
92            scanner: s,
93            errors: el,
94            trace: trace,
95            indent: 0,
96            pos: 0,
97            token: Token::NONE,
98            sync_pos: 0,
99            sync_count: 0,
100            expr_level: 0,
101            in_rhs: false,
102            pkg_scope: None,
103            top_scope: None,
104            unresolved: vec![],
105            imports: vec![],
106            label_scope: None,
107            target_stack: vec![],
108        };
109        p.next(); // get the first token ready
110        p
111    }
112
113    // ----------------------------------------------------------------------------
114    // Getters
115
116    pub fn get_errors(&self) -> &ErrorList {
117        self.errors
118    }
119
120    // ----------------------------------------------------------------------------
121    // Scoping support
122
123    fn open_scope(&mut self) {
124        self.top_scope = Some(new_scope!(self, self.top_scope));
125    }
126
127    fn close_scope(&mut self) {
128        self.top_scope = self.objects.scopes[self.top_scope.unwrap()].outer;
129    }
130
131    fn open_label_scope(&mut self) {
132        self.label_scope = Some(new_scope!(self, self.label_scope));
133        self.target_stack.push(vec![]);
134    }
135
136    fn close_label_scope(&mut self) {
137        let scope = &self.objects.scopes[*self.label_scope.as_ref().unwrap()];
138        match self.target_stack.pop() {
139            Some(v) => {
140                for i in v {
141                    let ident = &mut self.objects.idents[i];
142                    match scope.look_up(&ident.name) {
143                        Some(e) => {
144                            ident.entity = IdentEntity::Entity(*e);
145                        }
146                        None => {
147                            let s = format!("label {} undefined", ident.name);
148                            self.error(self.pos, s);
149                        }
150                    }
151                }
152            }
153            _ => panic!("invalid target stack."),
154        }
155        self.label_scope = self.objects.scopes[self.label_scope.unwrap()].outer;
156    }
157
158    fn declare(&mut self, decl: DeclObj, data: EntityData, kind: EntityKind, scope_ind: &ScopeKey) {
159        let mut names: Vec<IdentKey> = vec![];
160        let idents = match decl {
161            DeclObj::Field(id) => &(self.objects.fields[id].names),
162            DeclObj::Spec(id) => match &self.objects.specs[id] {
163                Spec::Value(vs) => &vs.names,
164                Spec::Type(ts) => {
165                    names.push(ts.name);
166                    &names
167                }
168                Spec::Import(_) => &names,
169            },
170            DeclObj::FuncDecl(i) => {
171                let func_decl = &self.objects.fdecls[i];
172                names.push(func_decl.name);
173                &names
174            }
175            DeclObj::LabeledStmt(i) => {
176                names.push(self.objects.l_stmts[i].label);
177                &names
178            }
179            DeclObj::AssignStmt(_) => {
180                unreachable!();
181            }
182            DeclObj::NoDecl => &names,
183        };
184        for id in idents.iter() {
185            let mut_ident = &mut self.objects.idents[*id];
186            let entity_obj = Entity::new(
187                kind.clone(),
188                mut_ident.name.clone(),
189                decl.clone(),
190                data.clone(),
191            );
192            let entity = self.objects.entities.insert(entity_obj);
193            mut_ident.entity = IdentEntity::Entity(entity);
194            let ident = &self.objects.idents[*id];
195            if ident.name != "_" {
196                let scope = &mut self.objects.scopes[*scope_ind];
197                match scope.insert(ident.name.clone(), entity) {
198                    Some(prev_decl) => {
199                        let p = self.objects.entities[prev_decl].pos(&self.objects);
200                        self.error(
201                            ident.pos,
202                            format!(
203                                "{} redeclared in this block\n\tprevious declaration at {}",
204                                ident.name,
205                                self.file().position(p)
206                            ),
207                        );
208                    }
209                    _ => {}
210                }
211            }
212        }
213    }
214
215    fn short_var_decl(&mut self, stmt: &Stmt) {
216        // Go spec: A short variable declaration may redeclare variables
217        // provided they were originally declared in the same block with
218        // the same type, and at least one of the non-blank variables is new.
219        let assign = if let Stmt::Assign(idx) = stmt {
220            *idx
221        } else {
222            unreachable!();
223        };
224        let list = &self.objects.a_stmts[assign].lhs;
225        let mut n = 0; // number of new variables
226        for expr in list {
227            match expr {
228                Expr::Ident(id) => {
229                    let ident = &mut self.objects.idents[*id];
230                    if ident.name != "_" {
231                        let top_scope = &mut self.objects.scopes[self.top_scope.unwrap()];
232                        match top_scope.look_up(&ident.name) {
233                            Some(e) => {
234                                ident.entity = IdentEntity::Entity(*e);
235                            }
236                            None => {
237                                let entity_obj = Entity::new(
238                                    EntityKind::Var,
239                                    ident.name.clone(),
240                                    DeclObj::AssignStmt(assign),
241                                    EntityData::NoData,
242                                );
243                                let entity = self.objects.entities.insert(entity_obj);
244                                top_scope.insert(ident.name.clone(), entity);
245                                ident.entity = IdentEntity::Entity(entity);
246                                n += 1;
247                            }
248                        }
249                    }
250                }
251                _ => {
252                    self.error_expected(expr.pos(&self.objects), "identifier on left side of :=");
253                }
254            }
255        }
256        if n == 0 {
257            self.error_str(
258                list[0].pos(&self.objects),
259                "no new variables on left side of :=",
260            )
261        }
262    }
263
264    // If x is an identifier, tryResolve attempts to resolve x by looking up
265    // the object it denotes. If no object is found and collectUnresolved is
266    // set, x is marked as unresolved and collected in the list of unresolved
267    // identifiers.
268    fn try_resolve(&mut self, x: &Expr, collect_unresolved: bool) {
269        if let Expr::Ident(i) = x {
270            let ident = &mut self.objects.idents[*i];
271            assert!(
272                ident.entity.is_none(),
273                "identifier already declared or resolved"
274            );
275            if ident.name == "_" {
276                return;
277            }
278            // try to resolve the identifier
279            let mut s = self.top_scope;
280            loop {
281                match s {
282                    Some(sidx) => {
283                        let scope = &self.objects.scopes[sidx];
284                        if let Some(entity) = scope.look_up(&ident.name) {
285                            ident.entity = IdentEntity::Entity(*entity);
286                            return;
287                        }
288                        s = scope.outer;
289                    }
290                    None => {
291                        break;
292                    }
293                }
294            }
295            // all local scopes are known, so any unresolved identifier
296            // must be found either in the file scope, package scope
297            // (perhaps in another file), or universe scope --- collect
298            // them so that they can be resolved later
299            if collect_unresolved {
300                ident.entity = IdentEntity::Sentinel;
301                self.unresolved.push(*i);
302            }
303        }
304    }
305
306    fn resolve(&mut self, x: &Expr) {
307        self.try_resolve(x, true)
308    }
309
310    // ----------------------------------------------------------------------------
311    // Parsing support
312
313    fn file(&self) -> &position::File {
314        self.scanner.file()
315    }
316
317    fn print_trace(&self, pos: position::Pos, msg: &str) {
318        if !self.trace {
319            return;
320        }
321        let f = self.file();
322        let p = f.position(pos);
323        let mut buf = format!("{:5}:{:3}:", p.line, p.column);
324        for _ in 0..self.indent {
325            buf.push_str("..");
326        }
327        print!("{}{}\n", buf, msg);
328    }
329
330    fn trace_begin(&mut self, msg: &str) {
331        let mut trace_str = msg.to_string();
332        trace_str.push('(');
333        self.print_trace(self.pos, &trace_str);
334        self.indent += 1;
335    }
336
337    fn trace_end(&mut self) {
338        self.indent -= 1;
339        self.print_trace(self.pos, ")");
340    }
341
342    fn next(&mut self) {
343        // Get next token and skip comments
344        loop {
345            let (token, pos) = self.scanner.scan();
346            match token {
347                Token::COMMENT(_) => {
348                    // Skip comment
349                    self.print_trace(pos, &format!("{}", token));
350                }
351                _ => {
352                    self.print_trace(pos, &format!("next: {}", token));
353                    self.token = token;
354                    self.pos = pos;
355                    break;
356                }
357            }
358        }
359    }
360
361    fn error_str(&self, pos: position::Pos, s: &str) {
362        FilePosErrors::new(self.file(), self.errors).parser_add_str(pos, s);
363    }
364
365    fn error(&self, pos: position::Pos, msg: String) {
366        FilePosErrors::new(self.file(), self.errors).parser_add(pos, msg);
367    }
368
369    fn error_expected(&self, pos: position::Pos, msg: &str) {
370        let mut mstr = "expected ".to_owned();
371        mstr.push_str(msg);
372        if pos == self.pos {
373            match &self.token {
374                Token::SEMICOLON(real) => {
375                    if !*real.as_bool() {
376                        mstr.push_str(", found newline");
377                    }
378                }
379                _ => {
380                    mstr.push_str(", found ");
381                    mstr.push_str(self.token.text());
382                }
383            }
384        }
385        self.error(pos, mstr);
386    }
387
388    fn expect(&mut self, token: &Token) -> position::Pos {
389        let pos = self.pos;
390        if self.token != *token {
391            self.error_expected(pos, &format!("'{}'", token));
392        }
393        self.next();
394        pos
395    }
396
397    // https://github.com/golang/go/issues/3008
398    // Same as expect but with better error message for certain cases
399    fn expect_closing(&mut self, token: &Token, context: &str) -> position::Pos {
400        if let Token::SEMICOLON(real) = token {
401            if !*real.as_bool() {
402                let msg = format!("missing ',' before newline in {}", context);
403                self.error(self.pos, msg);
404                self.next();
405            }
406        }
407        self.expect(token)
408    }
409
410    fn expect_semi(&mut self) {
411        // semicolon is optional before a closing ')' or '}'
412        match self.token {
413            Token::RPAREN | Token::RBRACE => {}
414            Token::SEMICOLON(_) => {
415                self.next();
416            }
417            _ => {
418                if let Token::COMMA = self.token {
419                    // permit a ',' instead of a ';' but complain
420                    self.error_expected(self.pos, "';'");
421                    self.next();
422                }
423                self.error_expected(self.pos, "';'");
424                self.advance(Token::is_stmt_start);
425            }
426        }
427    }
428
429    fn at_comma(&self, context: &str, follow: &Token) -> bool {
430        if self.token == Token::COMMA {
431            true
432        } else if self.token != *follow {
433            let mut msg = "missing ','".to_owned();
434            if let Token::SEMICOLON(real) = &self.token {
435                if !*real.as_bool() {
436                    msg.push_str(" before newline");
437                }
438            }
439            msg = format!("{} in {}", msg, context);
440            self.error(self.pos, msg);
441            true
442        } else {
443            false
444        }
445    }
446
447    // advance consumes tokens until the current token p.tok
448    // is in the 'to' set, or token.EOF. For error recovery.
449    fn advance(&mut self, to: fn(&Token) -> bool) {
450        while self.token != Token::EOF {
451            self.next();
452            if to(&self.token) {
453                // Return only if parser made some progress since last
454                // sync or if it has not reached 10 advance calls without
455                // progress. Otherwise consume at least one token to
456                // avoid an endless parser loop (it is possible that
457                // both parseOperand and parseStmt call advance and
458                // correctly do not advance, thus the need for the
459                // invocation limit p.syncCnt).
460                if self.pos == self.sync_pos && self.sync_count < 10 {
461                    self.sync_count += 1;
462                    break;
463                }
464                if self.pos > self.sync_pos {
465                    self.sync_pos = self.pos;
466                    self.sync_count = 0;
467                    break;
468                }
469                // Reaching here indicates a parser bug, likely an
470                // incorrect token list in this function, but it only
471                // leads to skipping of possibly correct code if a
472                // previous error is present, and thus is preferred
473                // over a non-terminating parse.
474            }
475        }
476    }
477
478    // safe_pos returns a valid file position for a given position: If pos
479    // is valid to begin with, safe_pos returns pos. If pos is out-of-range,
480    // safe_pos returns the EOF position.
481    //
482    // This is hack to work around "artificial" end positions in the AST which
483    // are computed by adding 1 to (presumably valid) token positions. If the
484    // token positions are invalid due to parse errors, the resulting end position
485    // may be past the file's EOF position, which would lead to panics if used
486    // later on.
487    fn safe_pos(&self, pos: position::Pos) -> position::Pos {
488        let max = self.file().base() + self.file().size();
489        if pos > max {
490            max
491        } else {
492            pos
493        }
494    }
495
496    // ----------------------------------------------------------------------------
497    // Identifiers
498
499    fn parse_ident(&mut self) -> IdentKey {
500        let pos = self.pos;
501        let mut name = "_".to_owned();
502        if let Token::IDENT(lit) = &self.token {
503            name = lit.as_str().clone();
504            self.next();
505        } else {
506            self.expect(&Token::IDENT("".to_owned().into()));
507        }
508        self.objects.idents.insert(Ident {
509            pos: pos,
510            name: name,
511            entity: IdentEntity::NoEntity,
512        })
513    }
514
515    fn parse_ident_list(&mut self) -> Vec<IdentKey> {
516        self.trace_begin("IdentList");
517
518        let mut list = vec![self.parse_ident()];
519        while self.token == Token::COMMA {
520            self.next();
521            list.push(self.parse_ident());
522        }
523
524        self.trace_end();
525        list
526    }
527
528    // ----------------------------------------------------------------------------
529    // Common productions
530    fn parse_expr_list(&mut self, lhs: bool) -> Vec<Expr> {
531        self.trace_begin("ExpressionList");
532
533        let expr = self.parse_expr(lhs);
534        let mut list = vec![self.check_expr(expr)];
535        while self.token == Token::COMMA {
536            self.next();
537            let expr = self.parse_expr(lhs);
538            list.push(self.check_expr(expr));
539        }
540
541        self.trace_end();
542        list
543    }
544
545    fn parse_lhs_list(&mut self) -> Vec<Expr> {
546        let bak = self.in_rhs;
547        self.in_rhs = false;
548        let list = self.parse_expr_list(true);
549        match self.token {
550            // lhs of a short variable declaration
551            // but doesn't enter scope until later:
552            // caller must call self.short_var_decl(list)
553            // at appropriate time.
554            Token::DEFINE => {}
555            // lhs of a label declaration or a communication clause of a select
556            // statement (parse_lhs_list is not called when parsing the case clause
557            // of a switch statement):
558            // - labels are declared by the caller of parse_lhs_list
559            // - for communication clauses, if there is a stand-alone identifier
560            //   followed by a colon, we have a syntax error; there is no need
561            //   to resolve the identifier in that case
562            Token::COLON => {}
563            _ => {
564                // identifiers must be declared elsewhere
565                for x in list.iter() {
566                    self.resolve(x);
567                }
568            }
569        }
570        self.in_rhs = bak;
571        list
572    }
573
574    fn parse_rhs_list(&mut self) -> Vec<Expr> {
575        let bak = self.in_rhs;
576        self.in_rhs = true;
577        let list = self.parse_expr_list(false);
578        self.in_rhs = bak;
579        list
580    }
581
582    // ----------------------------------------------------------------------------
583    // Types
584    fn parse_type(&mut self) -> Expr {
585        self.trace_begin("Type");
586
587        let typ = self.try_type();
588        let ret = if typ.is_none() {
589            let pos = self.pos;
590            self.error_expected(pos, "type");
591            self.next();
592            Expr::new_bad(pos, self.pos)
593        } else {
594            typ.unwrap()
595        };
596
597        self.trace_end();
598        ret
599    }
600
601    // If the result is an identifier, it is not resolved.
602    fn parse_type_name(&mut self) -> Expr {
603        self.trace_begin("TypeName");
604
605        let ident = self.parse_ident();
606        let x_ident = Expr::Ident(ident);
607        // don't resolve ident yet - it may be a parameter or field name
608        let ret = if let Token::PERIOD = self.token {
609            // ident is a package name
610            self.next();
611            self.resolve(&x_ident);
612            let sel = self.parse_ident();
613            Expr::new_selector(x_ident, sel)
614        } else {
615            x_ident
616        };
617
618        self.trace_end();
619        ret
620    }
621
622    fn parse_array_type(&mut self) -> Expr {
623        self.trace_begin("ArrayType");
624
625        let lpos = self.expect(&Token::LBRACK);
626        self.expr_level += 1;
627        let len = match self.token {
628            // always permit ellipsis for more fault-tolerant parsing
629            Token::ELLIPSIS => {
630                let ell = Expr::new_ellipsis(self.pos, None);
631                self.next();
632                Some(ell)
633            }
634            _ if self.token != Token::RBRACK => Some(self.parse_rhs()),
635            _ => None,
636        };
637        self.expr_level -= 1;
638        self.expect(&Token::RBRACK);
639        let elt = self.parse_type();
640
641        self.trace_end();
642        Expr::Array(Rc::new(ArrayType {
643            l_brack: lpos,
644            len: len,
645            elt: elt,
646        }))
647    }
648
649    fn make_ident_list(&mut self, exprs: &mut Vec<Expr>) -> Vec<IdentKey> {
650        exprs
651            .iter()
652            .map(|x| {
653                match x {
654                    Expr::Ident(ident) => *ident,
655                    _ => {
656                        let pos = x.pos(&self.objects);
657                        if let Expr::Bad(_) = x {
658                            // only report error if it's a new one
659                            self.error_expected(pos, "identifier")
660                        }
661                        new_ident!(self, pos, "_".to_owned(), IdentEntity::NoEntity)
662                    }
663                }
664            })
665            .collect()
666    }
667
668    fn parse_field_decl(&mut self, scope: ScopeKey) -> FieldKey {
669        self.trace_begin("FieldDecl");
670
671        // 1st FieldDecl
672        // A type name used as an anonymous field looks like a field identifier.
673        let mut list = vec![];
674        loop {
675            list.push(self.parse_var_type(false));
676            if self.token != Token::COMMA {
677                break;
678            }
679            self.next();
680        }
681
682        let mut idents = vec![];
683        let typ = match self.try_var_type(false) {
684            Some(t) => {
685                idents = self.make_ident_list(&mut list);
686                t
687            }
688            // ["*"] TypeName (AnonymousField)
689            None => {
690                let first = &list[0]; // we always have at least one element
691                if list.len() > 1 {
692                    self.error_expected(self.pos, "type");
693                    Expr::new_bad(self.pos, self.pos)
694                } else if !Parser::is_type_name(Parser::deref(first)) {
695                    self.error_expected(self.pos, "anonymous field");
696                    Expr::new_bad(
697                        first.pos(&self.objects),
698                        self.safe_pos(first.end(&self.objects)),
699                    )
700                } else {
701                    list.into_iter().nth(0).unwrap()
702                }
703            }
704        };
705
706        // Tag
707        let token = self.token.clone();
708        let tag = if let Token::STRING(_) = token {
709            let t = Some(Expr::new_basic_lit(self.pos, self.token.clone()));
710            self.next();
711            t
712        } else {
713            None
714        };
715
716        self.expect_semi();
717
718        let to_resolve = typ.clone_ident();
719        let field = new_field!(self, idents, typ, tag);
720        self.declare(
721            DeclObj::Field(field),
722            EntityData::NoData,
723            EntityKind::Var,
724            &scope,
725        );
726        if let Some(ident) = to_resolve {
727            self.resolve(&ident);
728        }
729
730        self.trace_end();
731        field
732    }
733
734    fn parse_struct_type(&mut self) -> Expr {
735        self.trace_begin("FieldDecl");
736
737        let stru = self.expect(&Token::STRUCT);
738        let lbrace = self.expect(&Token::LBRACE);
739        let scope = new_scope!(self, None);
740        let mut list = vec![];
741        loop {
742            match &self.token {
743                Token::IDENT(_) | Token::MUL | Token::LPAREN => {
744                    list.push(self.parse_field_decl(scope));
745                }
746                _ => {
747                    break;
748                }
749            }
750        }
751        let rbrace = self.expect(&Token::RBRACE);
752
753        self.trace_end();
754        Expr::Struct(Rc::new(StructType {
755            struct_pos: stru,
756            fields: FieldList::new(Some(lbrace), list, Some(rbrace)),
757            incomplete: false,
758        }))
759    }
760
761    fn parse_pointer_type(&mut self) -> Expr {
762        self.trace_begin("PointerType");
763
764        let star = self.expect(&Token::MUL);
765        let base = self.parse_type();
766
767        self.trace_end();
768        Expr::Star(Rc::new(StarExpr {
769            star: star,
770            expr: base,
771        }))
772    }
773
774    // If the result is an identifier, it is not resolved.
775    fn try_var_type(&mut self, is_param: bool) -> Option<Expr> {
776        if is_param {
777            if let Token::ELLIPSIS = self.token {
778                let pos = self.pos;
779                self.next();
780                let typ = if let Some(t) = self.try_ident_or_type() {
781                    self.resolve(&t);
782                    t
783                } else {
784                    self.error_str(pos, "'...' parameter is missing type");
785                    Expr::new_bad(pos, self.pos)
786                };
787                return Some(Expr::new_ellipsis(pos, Some(typ)));
788            }
789        }
790        self.try_ident_or_type()
791    }
792
793    fn parse_var_type(&mut self, is_param: bool) -> Expr {
794        match self.try_var_type(is_param) {
795            Some(typ) => typ,
796            None => {
797                let pos = self.pos;
798                self.error_expected(pos, "type");
799                self.next();
800                Expr::new_bad(pos, self.pos)
801            }
802        }
803    }
804
805    fn parse_parameter_list(&mut self, scope: ScopeKey, ellipsis_ok: bool) -> Vec<FieldKey> {
806        self.trace_begin("ParameterList");
807
808        // 1st ParameterDecl
809        // A list of identifiers looks like a list of type names.
810        let mut list = vec![];
811        loop {
812            list.push(self.parse_var_type(ellipsis_ok));
813            if self.token != Token::COMMA {
814                break;
815            }
816            self.next();
817            if self.token == Token::RPAREN {
818                break;
819            }
820        }
821        let mut params = vec![];
822        let typ = self.try_var_type(ellipsis_ok);
823        if let Some(t) = typ {
824            // IdentifierList Type
825            let idents = self.make_ident_list(&mut list);
826            let to_resolve = t.clone_ident();
827            let field = new_field!(self, idents, t, None);
828            params.push(field);
829            // Go spec: The scope of an identifier denoting a function
830            // parameter or result variable is the function body.
831            self.declare(
832                DeclObj::Field(field),
833                EntityData::NoData,
834                EntityKind::Var,
835                &scope,
836            );
837            if let Some(ident) = to_resolve {
838                self.resolve(&ident);
839            }
840            if !self.at_comma("parameter list", &Token::RPAREN) {
841                self.trace_end();
842                return params;
843            }
844            self.next();
845            while self.token != Token::RPAREN && self.token != Token::EOF {
846                let idents = self.parse_ident_list();
847                let t = self.parse_var_type(ellipsis_ok);
848                let to_resolve = t.clone_ident();
849                let field = new_field!(self, idents, t, None);
850                // warning: copy paste
851                params.push(field);
852                // Go spec: The scope of an identifier denoting a function
853                // parameter or result variable is the function body.
854                self.declare(
855                    DeclObj::Field(field),
856                    EntityData::NoData,
857                    EntityKind::Var,
858                    &scope,
859                );
860                if let Some(ident) = to_resolve {
861                    self.resolve(&ident);
862                }
863                if !self.at_comma("parameter list", &Token::RPAREN) {
864                    break;
865                }
866                self.next();
867            }
868        } else {
869            // Type { "," Type } (anonymous parameters)
870            for typ in list {
871                self.resolve(&typ);
872                params.push(new_field!(self, vec![], typ, None));
873            }
874        }
875        self.trace_end();
876        params
877    }
878
879    fn parse_parameters(&mut self, scope: ScopeKey, ellipsis_ok: bool) -> FieldList {
880        self.trace_begin("Parameters");
881
882        let mut params = vec![];
883        let lparen = Some(self.expect(&Token::LPAREN));
884        if self.token != Token::RPAREN {
885            params = self.parse_parameter_list(scope, ellipsis_ok);
886        }
887        let rparen = Some(self.expect(&Token::RPAREN));
888
889        self.trace_end();
890        FieldList::new(lparen, params, rparen)
891    }
892
893    fn parse_result(&mut self, scope: ScopeKey) -> Option<FieldList> {
894        self.trace_begin("Result");
895
896        let ret = if self.token == Token::LPAREN {
897            Some(self.parse_parameters(scope, false))
898        } else {
899            self.try_type().map(|t| {
900                let field = new_field!(self, vec![], t, None);
901                FieldList::new(None, vec![field], None)
902            })
903        };
904
905        self.trace_end();
906        ret
907    }
908
909    fn parse_signature(&mut self, scope: ScopeKey) -> (FieldList, Option<FieldList>) {
910        self.trace_begin("Signature");
911
912        let params = self.parse_parameters(scope, true);
913        let results = self.parse_result(scope);
914
915        self.trace_end();
916        (params, results)
917    }
918
919    fn parse_func_type(&mut self) -> (FuncType, ScopeKey) {
920        self.trace_begin("FuncType");
921
922        let pos = self.expect(&Token::FUNC);
923        let scope = new_scope!(self, self.top_scope);
924        let (params, results) = self.parse_signature(scope);
925
926        self.trace_end();
927        (FuncType::new(Some(pos), params, results), scope)
928    }
929
930    // method spec in interface
931    fn parse_method_spec(&mut self, scope: ScopeKey) -> FieldKey {
932        self.trace_begin("MethodSpec");
933
934        let mut idents = vec![];
935        let mut typ = self.parse_type_name();
936        let ident = typ.try_as_ident();
937        if ident.is_some() && self.token == Token::LPAREN {
938            idents = vec![*ident.unwrap()];
939            let scope = new_scope!(self, self.top_scope);
940            let (params, results) = self.parse_signature(scope);
941            typ = Expr::box_func_type(FuncType::new(None, params, results), &mut self.objects);
942        } else {
943            // embedded interface
944            self.resolve(&typ);
945        }
946        self.expect_semi();
947        let field = new_field!(self, idents, typ, None);
948        self.declare(
949            DeclObj::Field(field),
950            EntityData::NoData,
951            EntityKind::Fun,
952            &scope,
953        );
954
955        self.trace_end();
956        field
957    }
958
959    fn parse_interface_type(&mut self) -> InterfaceType {
960        self.trace_begin("InterfaceType");
961
962        let pos = self.expect(&Token::INTERFACE);
963        let lbrace = self.expect(&Token::LBRACE);
964        let scope = new_scope!(self, None);
965        let mut list = vec![];
966        loop {
967            if let Token::IDENT(_) = self.token {
968            } else {
969                break;
970            }
971            list.push(self.parse_method_spec(scope));
972        }
973        let rbrace = self.expect(&Token::RBRACE);
974
975        self.trace_end();
976        InterfaceType {
977            interface: pos,
978            methods: FieldList {
979                openning: Some(lbrace),
980                list: list,
981                closing: Some(rbrace),
982            },
983            incomplete: false,
984        }
985    }
986
987    fn parse_map_type(&mut self) -> MapType {
988        self.trace_begin("MapType");
989
990        let pos = self.expect(&Token::MAP);
991        self.expect(&Token::LBRACK);
992        let key = self.parse_type();
993        self.expect(&Token::RBRACK);
994        let val = self.parse_type();
995
996        self.trace_end();
997        MapType {
998            map: pos,
999            key: key,
1000            val: val,
1001        }
1002    }
1003
1004    fn parse_chan_type(&mut self) -> ChanType {
1005        self.trace_begin("ChanType");
1006
1007        let pos = self.pos;
1008        let arrow_pos: position::Pos;
1009        let dir: ChanDir;
1010        if let Token::CHAN = self.token {
1011            self.next();
1012            if let Token::ARROW = self.token {
1013                arrow_pos = self.pos;
1014                self.next();
1015                dir = ChanDir::Send;
1016            } else {
1017                arrow_pos = 0;
1018                dir = ChanDir::SendRecv;
1019            }
1020        } else {
1021            arrow_pos = self.expect(&Token::ARROW);
1022            self.expect(&Token::CHAN);
1023            dir = ChanDir::Recv;
1024        }
1025        let val = self.parse_type();
1026
1027        self.trace_end();
1028        ChanType {
1029            begin: pos,
1030            arrow: arrow_pos,
1031            dir: dir,
1032            val: val,
1033        }
1034    }
1035
1036    // Returns a ident or a type
1037    // If the result is an identifier, it is not resolved.
1038    fn try_ident_or_type(&mut self) -> Option<Expr> {
1039        match self.token {
1040            Token::IDENT(_) => Some(self.parse_type_name()),
1041            Token::LBRACK => Some(self.parse_array_type()),
1042            Token::STRUCT => Some(self.parse_struct_type()),
1043            Token::MUL => Some(self.parse_pointer_type()),
1044            Token::FUNC => {
1045                let (typ, _) = self.parse_func_type();
1046                Some(Expr::box_func_type(typ, &mut self.objects))
1047            }
1048            Token::INTERFACE => Some(Expr::Interface(Rc::new(self.parse_interface_type()))),
1049            Token::MAP => Some(Expr::Map(Rc::new(self.parse_map_type()))),
1050            Token::CHAN | Token::ARROW => Some(Expr::Chan(Rc::new(self.parse_chan_type()))),
1051            Token::LPAREN => {
1052                let lparen = self.pos;
1053                self.next();
1054                let typ = self.parse_type();
1055                let rparen = self.expect(&Token::RPAREN);
1056                Some(Expr::Paren(Rc::new(ParenExpr {
1057                    l_paren: lparen,
1058                    expr: typ,
1059                    r_paren: rparen,
1060                })))
1061            }
1062            _ => None,
1063        }
1064    }
1065
1066    fn try_type(&mut self) -> Option<Expr> {
1067        if let Some(typ) = self.try_ident_or_type() {
1068            self.resolve(&typ);
1069            Some(typ)
1070        } else {
1071            None
1072        }
1073    }
1074
1075    // ----------------------------------------------------------------------------
1076    // Blocks
1077
1078    fn parse_stmt_list(&mut self) -> Vec<Stmt> {
1079        self.trace_begin("Body");
1080
1081        let mut list = vec![];
1082        loop {
1083            match self.token {
1084                Token::CASE | Token::DEFAULT | Token::RBRACE | Token::EOF => {
1085                    break;
1086                }
1087                _ => {}
1088            };
1089            list.push(self.parse_stmt());
1090        }
1091
1092        self.trace_end();
1093        list
1094    }
1095
1096    fn parse_body(&mut self, scope: ScopeKey) -> BlockStmt {
1097        self.trace_begin("Body");
1098
1099        let lbrace = self.expect(&Token::LBRACE);
1100        self.top_scope = Some(scope); // open function scope
1101        self.open_label_scope();
1102        let list = self.parse_stmt_list();
1103        self.close_label_scope();
1104        self.close_scope();
1105        let rbrace = self.expect(&Token::RBRACE);
1106
1107        self.trace_end();
1108        BlockStmt::new(lbrace, list, rbrace)
1109    }
1110
1111    fn parse_block_stmt(&mut self) -> BlockStmt {
1112        self.trace_begin("BlockStmt");
1113
1114        let lbrace = self.expect(&Token::LBRACE);
1115        self.open_scope();
1116        let list = self.parse_stmt_list();
1117        self.close_scope();
1118        let rbrace = self.expect(&Token::RBRACE);
1119
1120        self.trace_end();
1121        BlockStmt::new(lbrace, list, rbrace)
1122    }
1123
1124    // ----------------------------------------------------------------------------
1125    // Expressions
1126
1127    fn parse_func_type_or_lit(&mut self) -> Expr {
1128        self.trace_begin("BlockStmt");
1129
1130        let (typ, scope) = self.parse_func_type();
1131        let typ_key = self.objects.ftypes.insert(typ);
1132        let ret = if self.token != Token::LBRACE {
1133            Expr::Func(typ_key)
1134        } else {
1135            self.expr_level += 1;
1136            let body = self.parse_body(scope);
1137            self.expr_level -= 1;
1138            Expr::FuncLit(Rc::new(FuncLit {
1139                typ: typ_key,
1140                body: Rc::new(body),
1141            }))
1142        };
1143
1144        self.trace_end();
1145        ret
1146    }
1147
1148    // parseOperand may return an expression or a raw type (incl. array
1149    // types of the form [...]T. Callers must verify the result.
1150    // If lhs is set and the result is an identifier, it is not resolved.
1151    fn parse_operand(&mut self, lhs: bool) -> Expr {
1152        self.trace_begin("Operand");
1153
1154        let ret = match self.token {
1155            Token::IDENT(_) => {
1156                let x = Expr::Ident(self.parse_ident());
1157                if !lhs {
1158                    self.resolve(&x);
1159                }
1160                x
1161            }
1162            Token::INT(_)
1163            | Token::FLOAT(_)
1164            | Token::IMAG(_)
1165            | Token::CHAR(_)
1166            | Token::STRING(_) => {
1167                let x = Expr::new_basic_lit(self.pos, self.token.clone());
1168                self.next();
1169                x
1170            }
1171            Token::LPAREN => {
1172                let lparen = self.pos;
1173                self.next();
1174                self.expr_level += 1;
1175                // types may be parenthesized: (some type)
1176                let x = self.parse_rhs_or_type();
1177                self.expr_level -= 1;
1178                let rparen = self.expect(&Token::RPAREN);
1179                Expr::Paren(Rc::new(ParenExpr {
1180                    l_paren: lparen,
1181                    expr: x,
1182                    r_paren: rparen,
1183                }))
1184            }
1185            Token::FUNC => self.parse_func_type_or_lit(),
1186            _ => {
1187                if let Some(typ) = self.try_ident_or_type() {
1188                    if let Expr::Ident(_) = typ {
1189                        // unreachable but would work, so don't panic
1190                        assert!(false, "should only get idents here");
1191                    }
1192                    typ
1193                } else {
1194                    let pos = self.pos;
1195                    self.error_expected(pos, "operand");
1196                    self.advance(Token::is_stmt_start);
1197                    Expr::new_bad(pos, self.pos)
1198                }
1199            }
1200        };
1201
1202        self.trace_end();
1203        ret
1204    }
1205
1206    fn parse_selector(&mut self, x: Expr) -> Expr {
1207        self.trace_begin("Selector");
1208        let sel = self.parse_ident();
1209        self.trace_end();
1210        Expr::Selector(Rc::new(SelectorExpr { expr: x, sel: sel }))
1211    }
1212
1213    fn parse_type_assertion(&mut self, x: Expr) -> Expr {
1214        self.trace_begin("TypeAssertion");
1215
1216        let lparen = self.expect(&Token::LPAREN);
1217        let typ = if self.token == Token::TYPE {
1218            // type switch: typ == nil, i.e.: x.(type)
1219            self.next();
1220            None
1221        } else {
1222            Some(self.parse_type())
1223        };
1224        let rparen = self.expect(&Token::RPAREN);
1225
1226        self.trace_end();
1227        Expr::TypeAssert(Rc::new(TypeAssertExpr {
1228            expr: x,
1229            l_paren: lparen,
1230            typ: typ,
1231            r_paren: rparen,
1232        }))
1233    }
1234
1235    fn parse_index_or_slice(&mut self, x: Expr) -> Expr {
1236        self.trace_begin("IndexOrSlice");
1237
1238        const N: usize = 3; // change the 3 to 2 to disable 3-index slices
1239        let lbrack = self.expect(&Token::LBRACK);
1240        self.expr_level += 1;
1241        let mut indices = vec![None, None, None];
1242        let mut colons = vec![0, 0, 0];
1243        let mut ncolons = 0;
1244        if self.token != Token::COLON {
1245            indices[0] = Some(self.parse_rhs());
1246        }
1247        while self.token == Token::COLON && ncolons < N - 1 {
1248            colons[ncolons] = self.pos;
1249            ncolons += 1;
1250            self.next();
1251            match self.token {
1252                Token::COLON | Token::RBRACK | Token::EOF => {}
1253                _ => indices[ncolons] = Some(self.parse_rhs()),
1254            }
1255        }
1256        self.expr_level -= 1;
1257        let rbrack = self.expect(&Token::RBRACK);
1258        let ret = if ncolons > 0 {
1259            let slice3 = ncolons == 2;
1260            if slice3 {
1261                // 3-index slices
1262                if indices[1].is_none() {
1263                    self.error_str(colons[0], "2nd index required in 3-index slice");
1264                    indices[1] = Some(Expr::new_bad(colons[0] + 1, colons[1]))
1265                }
1266                if indices[2].is_none() {
1267                    self.error_str(colons[1], "3rd index required in 3-index slice");
1268                    indices[2] = Some(Expr::new_bad(colons[1] + 1, colons[2]))
1269                }
1270            }
1271            let mut iter = indices.into_iter();
1272            Expr::Slice(Rc::new(SliceExpr {
1273                expr: x,
1274                l_brack: lbrack,
1275                low: iter.next().unwrap(), // unwrap the first of two Option
1276                high: iter.next().unwrap(),
1277                max: iter.next().unwrap(),
1278                slice3: slice3,
1279                r_brack: rbrack,
1280            }))
1281        } else {
1282            // the logic here differs from the original go code
1283            if indices[0].is_none() {
1284                self.error_str(lbrack, "expression for index value required");
1285                indices[0] = Some(Expr::new_bad(lbrack + 1, rbrack));
1286            }
1287            let index = indices.into_iter().nth(0).unwrap().unwrap();
1288            Expr::Index(Rc::new(IndexExpr {
1289                expr: x,
1290                l_brack: lbrack,
1291                index: index,
1292                r_brack: rbrack,
1293            }))
1294        };
1295
1296        self.trace_end();
1297        ret
1298    }
1299
1300    fn parse_call_or_conversion(&mut self, func: Expr) -> Expr {
1301        self.trace_begin("CallOrConversion");
1302
1303        let lparen = self.expect(&Token::LPAREN);
1304        self.expr_level += 1;
1305        let mut list = vec![];
1306        let mut ellipsis: Option<position::Pos> = None;
1307        while self.token != Token::RPAREN && self.token != Token::EOF && ellipsis.is_none() {
1308            //// builtins may expect a type: make(some_type)
1309            list.push(self.parse_rhs_or_type());
1310            if self.token == Token::ELLIPSIS {
1311                ellipsis = Some(self.pos);
1312                self.next();
1313            }
1314            if !self.at_comma("argument list", &Token::RPAREN) {
1315                break;
1316            }
1317            self.next();
1318        }
1319        self.expr_level -= 1;
1320        let rparen = self.expect_closing(&Token::RPAREN, "argument list");
1321
1322        self.trace_end();
1323        Expr::Call(Rc::new(CallExpr {
1324            func: func,
1325            l_paren: lparen,
1326            args: list,
1327            ellipsis: ellipsis,
1328            r_paren: rparen,
1329        }))
1330    }
1331
1332    fn parse_value(&mut self, key_ok: bool) -> Expr {
1333        self.trace_begin("Value");
1334
1335        let ret = if self.token == Token::LBRACE {
1336            self.parse_literal_value(None)
1337        } else {
1338            // Because the parser doesn't know the composite literal type, it cannot
1339            // know if a key that's an identifier is a struct field name or a name
1340            // denoting a value. The former is not resolved by the parser or the
1341            // resolver.
1342            //
1343            // Instead, _try_ to resolve such a key if possible. If it resolves,
1344            // it a) has correctly resolved, or b) incorrectly resolved because
1345            // the key is a struct field with a name matching another identifier.
1346            // In the former case we are done, and in the latter case we don't
1347            // care because the type checker will do a separate field lookup.
1348            //
1349            // If the key does not resolve, it a) must be defined at the top
1350            // level in another file of the same package, the universe scope, or be
1351            // undeclared; or b) it is a struct field. In the former case, the type
1352            // checker can do a top-level lookup, and in the latter case it will do
1353            // a separate field lookup.
1354            let x0 = self.parse_expr(key_ok);
1355            let x = self.check_expr(x0);
1356            if key_ok {
1357                if self.token == Token::COLON {
1358                    // Try to resolve the key but don't collect it
1359                    // as unresolved identifier if it fails so that
1360                    // we don't get (possibly false) errors about
1361                    // undeclared names.
1362                    self.try_resolve(&x, false)
1363                } else {
1364                    // not a key
1365                    self.resolve(&x)
1366                }
1367            }
1368            x
1369        };
1370
1371        self.trace_end();
1372        ret
1373    }
1374
1375    fn parse_element(&mut self) -> Expr {
1376        self.trace_begin("Element");
1377
1378        let x = self.parse_value(true);
1379        let ret = if self.token == Token::COLON {
1380            let colon = self.pos;
1381            self.next();
1382            Expr::KeyValue(Rc::new(KeyValueExpr {
1383                key: x,
1384                colon: colon,
1385                val: self.parse_value(false),
1386            }))
1387        } else {
1388            x
1389        };
1390
1391        self.trace_end();
1392        ret
1393    }
1394
1395    fn parse_element_list(&mut self) -> Vec<Expr> {
1396        self.trace_begin("ElementList");
1397
1398        let mut list = vec![];
1399        while self.token != Token::RBRACE && self.token != Token::EOF {
1400            list.push(self.parse_element());
1401            if !self.at_comma("composite literal", &Token::RBRACE) {
1402                break;
1403            }
1404            self.next();
1405        }
1406
1407        self.trace_end();
1408        list
1409    }
1410
1411    fn parse_literal_value(&mut self, typ: Option<Expr>) -> Expr {
1412        self.trace_begin("LiteralValue");
1413
1414        let lbrace = self.expect(&Token::LBRACE);
1415        self.expr_level += 1;
1416        let elts = if self.token != Token::RBRACE {
1417            self.parse_element_list()
1418        } else {
1419            vec![]
1420        };
1421        self.expr_level -= 1;
1422        let rbrace = self.expect_closing(&Token::RBRACE, "composite literal");
1423
1424        self.trace_end();
1425        Expr::CompositeLit(Rc::new(CompositeLit {
1426            typ: typ,
1427            l_brace: lbrace,
1428            elts: elts,
1429            r_brace: rbrace,
1430            incomplete: false,
1431        }))
1432    }
1433
1434    // checkExpr checks that x is an expression (and not a type).
1435    fn check_expr(&self, x: Expr) -> Expr {
1436        let unparenx = Parser::unparen(&x);
1437        match unparenx {
1438            Expr::Bad(_) => x,
1439            Expr::Ident(_) => x,
1440            Expr::BasicLit(_) => x,
1441            Expr::FuncLit(_) => x,
1442            Expr::CompositeLit(_) => x,
1443            Expr::Paren(_) => {
1444                unreachable!();
1445            }
1446            Expr::Selector(_) => x,
1447            Expr::Index(_) => x,
1448            Expr::Slice(_) => x,
1449            // If t.Type == nil we have a type assertion of the form
1450            // y.(type), which is only allowed in type switch expressions.
1451            // It's hard to exclude those but for the case where we are in
1452            // a type switch. Instead be lenient and test this in the type
1453            // checker.
1454            Expr::TypeAssert(_) => x,
1455            Expr::Call(_) => x,
1456            Expr::Star(_) => x,
1457            Expr::Unary(_) => x,
1458            Expr::Binary(_) => x,
1459            _ => {
1460                self.error_expected(self.pos, "expression");
1461                Expr::new_bad(x.pos(&self.objects), self.safe_pos(x.end(&self.objects)))
1462            }
1463        }
1464    }
1465
1466    // isTypeName reports whether x is a (qualified) TypeName.
1467    fn is_type_name(x: &Expr) -> bool {
1468        match x {
1469            Expr::Bad(_) | Expr::Ident(_) => true,
1470            Expr::Selector(s) => {
1471                if let Expr::Ident(_) = s.expr {
1472                    true
1473                } else {
1474                    false
1475                }
1476            }
1477            _ => false,
1478        }
1479    }
1480
1481    // isLiteralType reports whether x is a legal composite literal type.
1482    fn is_literal_type(x: &Expr) -> bool {
1483        match x {
1484            Expr::Bad(_) | Expr::Ident(_) | Expr::Array(_) | Expr::Struct(_) | Expr::Map(_) => true,
1485            Expr::Selector(s) => {
1486                if let Expr::Ident(_) = s.expr {
1487                    true
1488                } else {
1489                    false
1490                }
1491            }
1492            _ => false,
1493        }
1494    }
1495
1496    pub fn deref(x: &Expr) -> &Expr {
1497        if let Expr::Star(s) = x {
1498            &s.expr
1499        } else {
1500            x
1501        }
1502    }
1503
1504    pub fn unparen(x: &Expr) -> &Expr {
1505        if let Expr::Paren(p) = x {
1506            Parser::unparen(&p.expr)
1507        } else {
1508            x
1509        }
1510    }
1511
1512    // checkExprOrType checks that x is an expression or a type
1513    // (and not a raw type such as [...]T).
1514    fn check_expr_or_type(&self, x: Expr) -> Expr {
1515        let unparenx = Parser::unparen(&x);
1516        match unparenx {
1517            Expr::Paren(_) => {
1518                unreachable!()
1519            }
1520            Expr::Array(array) => {
1521                if let Some(expr) = &array.len {
1522                    if let Expr::Ellipsis(ell) = expr {
1523                        self.error_str(ell.pos, "expected array length, found '...'");
1524                        return Expr::new_bad(
1525                            unparenx.pos(&self.objects),
1526                            self.safe_pos(unparenx.end(&self.objects)),
1527                        );
1528                    }
1529                }
1530            }
1531            _ => {}
1532        }
1533        return x;
1534    }
1535
1536    fn parse_primary_expr(&mut self, mut lhs: bool) -> Expr {
1537        self.trace_begin("PrimaryExpr");
1538
1539        let mut x = self.parse_operand(lhs);
1540        loop {
1541            match self.token {
1542                Token::PERIOD => {
1543                    self.next();
1544                    if lhs {
1545                        self.resolve(&x);
1546                    }
1547                    match self.token {
1548                        Token::IDENT(_) => {
1549                            x = self.parse_selector(self.check_expr_or_type(x));
1550                        }
1551                        Token::LPAREN => {
1552                            x = self.parse_type_assertion(self.check_expr(x));
1553                        }
1554                        _ => {
1555                            let pos = self.pos;
1556                            self.error_expected(pos, "selector or type assertion");
1557                            self.next();
1558                            let sel = new_ident!(self, pos, "_".to_owned(), IdentEntity::NoEntity);
1559                            x = Expr::new_selector(x, sel);
1560                        }
1561                    }
1562                }
1563                Token::LBRACK => {
1564                    if lhs {
1565                        self.resolve(&x);
1566                    }
1567                    x = self.parse_index_or_slice(self.check_expr(x));
1568                }
1569                Token::LPAREN => {
1570                    if lhs {
1571                        self.resolve(&x);
1572                    }
1573                    x = self.parse_call_or_conversion(self.check_expr_or_type(x));
1574                }
1575                Token::LBRACE => {
1576                    if Parser::is_literal_type(&x)
1577                        && (self.expr_level >= 0 || !Parser::is_type_name(&x))
1578                    {
1579                        if lhs {
1580                            self.resolve(&x);
1581                        }
1582                        x = self.parse_literal_value(Some(x));
1583                    } else {
1584                        break;
1585                    }
1586                }
1587                _ => {
1588                    break;
1589                }
1590            }
1591            lhs = false; // no need to try to resolve again
1592        }
1593
1594        self.trace_end();
1595        x
1596    }
1597
1598    fn parse_unary_expr(&mut self, lhs: bool) -> Expr {
1599        self.trace_begin("UnaryExpr");
1600
1601        let ret = match self.token {
1602            Token::ADD | Token::SUB | Token::NOT | Token::XOR | Token::AND => {
1603                let pos = self.pos;
1604                let op = self.token.clone();
1605                self.next();
1606                let x = self.parse_unary_expr(false);
1607                Expr::new_unary_expr(pos, op, self.check_expr(x))
1608            }
1609            Token::ARROW => {
1610                // channel type or receive expression
1611                let mut arrow = self.pos;
1612                self.next();
1613
1614                // If the next token is token.CHAN we still don't know if it
1615                // is a channel type or a receive operation - we only know
1616                // once we have found the end of the unary expression. There
1617                // are two cases:
1618                //
1619                //   <- type  => (<-type) must be channel type
1620                //   <- expr  => <-(expr) is a receive from an expression
1621                //
1622                //   oxfeeefeee: a: [<- chan val_type_of_<-_chan]
1623                //               b: [<- chan val_type_of_chan]
1624                //
1625                // In the first case, the arrow must be re-associated with
1626                // the channel type parsed already:
1627                //
1628                //   <- (chan type)    =>  (<-chan type)
1629                //   <- (chan<- type)  =>  (<-chan (<-type))
1630
1631                let mut x = self.parse_unary_expr(false);
1632                // determine which case we have
1633                if let Expr::Chan(c) = &mut x {
1634                    // (<-type)
1635                    // re-associate position info and <-
1636                    let mut ctype = Rc::get_mut(c).unwrap(); // c is not shared
1637                    let mut dir = ChanDir::Send;
1638                    while dir == ChanDir::Send {
1639                        if ctype.dir == ChanDir::Recv {
1640                            // error: (<-type) is (<-(<-chan T))
1641                            self.error_expected(ctype.arrow, "'chan'")
1642                        }
1643                        let new_arrow = ctype.arrow;
1644                        ctype.begin = arrow;
1645                        ctype.arrow = arrow;
1646                        arrow = new_arrow;
1647                        dir = ctype.dir.clone();
1648                        ctype.dir = ChanDir::Recv;
1649                        if let Expr::Chan(c) = &mut ctype.val {
1650                            ctype = Rc::get_mut(c).unwrap(); // c is not shared
1651                        } else {
1652                            break;
1653                        }
1654                    }
1655                    if dir == ChanDir::Send {
1656                        self.error_expected(arrow, "channel type");
1657                    }
1658                    x
1659                } else {
1660                    Expr::new_unary_expr(arrow, Token::ARROW, self.check_expr(x))
1661                }
1662            }
1663            Token::MUL => {
1664                // pointer type or unary "*" expression
1665                let pos = self.pos;
1666                self.next();
1667                let x = self.parse_unary_expr(false);
1668                Expr::Star(Rc::new(StarExpr {
1669                    star: pos,
1670                    expr: self.check_expr_or_type(x),
1671                }))
1672            }
1673            _ => self.parse_primary_expr(lhs),
1674        };
1675
1676        self.trace_end();
1677        ret
1678    }
1679
1680    fn token_prec(&self) -> (Token, usize) {
1681        let token = if self.in_rhs && self.token == Token::ASSIGN {
1682            Token::EQL
1683        } else {
1684            self.token.clone()
1685        };
1686        let pre = token.precedence();
1687        (token, pre)
1688    }
1689
1690    fn parse_binary_expr(&mut self, lhs: bool, prec1: usize) -> Expr {
1691        self.trace_begin("BinaryExpr");
1692
1693        let mut x = self.parse_unary_expr(lhs);
1694        loop {
1695            let (op, prec) = self.token_prec();
1696            if prec < prec1 {
1697                break;
1698            }
1699            let pos = self.expect(&op);
1700            if lhs {
1701                self.resolve(&x);
1702            }
1703            let y = self.parse_binary_expr(false, prec + 1);
1704            x = Expr::Binary(Rc::new(BinaryExpr {
1705                expr_a: x,
1706                op_pos: pos,
1707                op: op,
1708                expr_b: y,
1709            }))
1710        }
1711
1712        self.trace_end();
1713        x
1714    }
1715
1716    fn parse_expr(&mut self, lhs: bool) -> Expr {
1717        self.trace_begin("Expression");
1718        let x = self.parse_binary_expr(lhs, LOWEST_PREC + 1);
1719        self.trace_end();
1720        x
1721    }
1722
1723    fn parse_rhs(&mut self) -> Expr {
1724        let bak = self.in_rhs;
1725        self.in_rhs = true;
1726        let x0 = self.parse_expr(false);
1727        let x1 = self.check_expr(x0);
1728        self.in_rhs = bak;
1729        x1
1730    }
1731
1732    fn parse_rhs_or_type(&mut self) -> Expr {
1733        let bak = self.in_rhs;
1734        self.in_rhs = true;
1735        let mut x = self.parse_expr(false);
1736        x = self.check_expr_or_type(x);
1737        self.in_rhs = bak;
1738        x
1739    }
1740
1741    // ----------------------------------------------------------------------------
1742    // Statements
1743
1744    // parseSimpleStmt returns true as 2nd result if it parsed the assignment
1745    // of a range clause (with mode == rangeOk). The returned statement is an
1746    // assignment with a right-hand side that is a single unary expression of
1747    // the form "range x". No guarantees are given for the left-hand side.
1748    fn parse_simple_stmt(&mut self, mode: ParseSimpleMode) -> (Stmt, bool) {
1749        self.trace_begin("SimpleStmt");
1750        let ret: Stmt;
1751        let mut is_range = false;
1752
1753        let x = self.parse_lhs_list();
1754        match self.token {
1755            Token::DEFINE
1756            | Token::ASSIGN
1757            | Token::ADD_ASSIGN
1758            | Token::SUB_ASSIGN
1759            | Token::MUL_ASSIGN
1760            | Token::QUO_ASSIGN
1761            | Token::REM_ASSIGN
1762            | Token::AND_ASSIGN
1763            | Token::OR_ASSIGN
1764            | Token::XOR_ASSIGN
1765            | Token::SHL_ASSIGN
1766            | Token::SHR_ASSIGN
1767            | Token::AND_NOT_ASSIGN => {
1768                // assignment statement, possibly part of a range clause
1769                let (mut pos, token) = (self.pos, self.token.clone());
1770                self.next();
1771                let y: Vec<Expr>;
1772                if mode == ParseSimpleMode::RangeOk
1773                    && self.token == Token::RANGE
1774                    && (token == Token::DEFINE || token == Token::ASSIGN)
1775                {
1776                    pos = self.pos;
1777                    self.next();
1778                    y = vec![Expr::new_unary_expr(pos, Token::RANGE, self.parse_rhs())];
1779                    is_range = true;
1780                } else {
1781                    y = self.parse_rhs_list();
1782                }
1783                ret = Stmt::new_assign(&mut self.objects, x, pos, token.clone(), y);
1784                if token == Token::DEFINE {
1785                    self.short_var_decl(&ret);
1786                }
1787            }
1788            _ => {
1789                if x.len() > 1 {
1790                    self.error_expected(x[0].pos(&self.objects), "1 expression");
1791                    // continue with first expression
1792                }
1793                let x0 = x.into_iter().nth(0).unwrap();
1794                ret = match self.token {
1795                    Token::COLON => {
1796                        // labeled statement
1797                        let colon = self.pos;
1798                        self.next();
1799                        let ident = match mode {
1800                            ParseSimpleMode::LabelOk => match x0 {
1801                                Expr::Ident(ident) => Some(ident),
1802                                _ => None,
1803                            },
1804                            _ => None,
1805                        };
1806                        match ident {
1807                            Some(ident) => {
1808                                // Go spec: The scope of a label is the body of the
1809                                // function in which it is declared and excludes the
1810                                // body of any nested function.
1811                                //
1812                                // wuhao todo: this messes up the declaration order! if the next stmt
1813                                // contains an exact same label, the error message would be wrong
1814                                // like this:
1815                                //
1816                                // L1:
1817                                // L1:
1818                                let s = self.parse_stmt();
1819                                let ls = LabeledStmt::arena_new(&mut self.objects, ident, colon, s);
1820                                self.declare(
1821                                    DeclObj::LabeledStmt(ls),
1822                                    EntityData::NoData,
1823                                    EntityKind::Lbl,
1824                                    &self.label_scope.unwrap(),
1825                                );
1826                                Stmt::Labeled(ls)
1827                            }
1828                            None => {
1829                                self.error_str(colon, "illegal label declaration");
1830                                Stmt::new_bad(x0.pos(&self.objects), colon + 1)
1831                            }
1832                        }
1833                    }
1834                    Token::ARROW => {
1835                        let arrow = self.pos;
1836                        self.next();
1837                        let y = self.parse_rhs();
1838                        Stmt::Send(Rc::new(SendStmt {
1839                            chan: x0,
1840                            arrow: arrow,
1841                            val: y,
1842                        }))
1843                    }
1844                    Token::INC | Token::DEC => {
1845                        let s = Stmt::IncDec(Rc::new(IncDecStmt {
1846                            expr: x0,
1847                            token_pos: self.pos,
1848                            token: self.token.clone(),
1849                        }));
1850                        self.next();
1851                        s
1852                    }
1853                    _ => Stmt::Expr(Box::new(x0)),
1854                }
1855            }
1856        }
1857
1858        self.trace_end();
1859        (ret, is_range)
1860    }
1861
1862    fn parse_call_expr(&mut self, call_type: &str) -> Option<Expr> {
1863        let x = self.parse_rhs_or_type(); // could be a conversion: (some type)(x)
1864        if let Expr::Call(_) = x {
1865            Some(x)
1866        } else {
1867            if !x.is_bad() {
1868                // only report error if it's a new one
1869                self.error(
1870                    self.safe_pos(x.end(&self.objects)),
1871                    format!("function must be invoked in {} statement", call_type),
1872                )
1873            }
1874            None
1875        }
1876    }
1877
1878    fn parse_go_stmt(&mut self) -> Stmt {
1879        self.trace_begin("GoStmt");
1880
1881        let pos = self.expect(&Token::GO);
1882        let call = self.parse_call_expr("go");
1883        self.expect_semi();
1884        let ret = match call {
1885            Some(c) => Stmt::Go(Rc::new(GoStmt { go: pos, call: c })),
1886            None => {
1887                Stmt::new_bad(pos, pos + 2) // "go".len() == 2
1888            }
1889        };
1890
1891        self.trace_end();
1892        ret
1893    }
1894
1895    fn parse_defer_stmt(&mut self) -> Stmt {
1896        self.trace_begin("DeferStmt");
1897
1898        let pos = self.expect(&Token::DEFER);
1899        let call = self.parse_call_expr("defer");
1900        self.expect_semi();
1901        let ret = match call {
1902            Some(c) => Stmt::Defer(Rc::new(DeferStmt {
1903                defer: pos,
1904                call: c,
1905            })),
1906            None => {
1907                Stmt::new_bad(pos, pos + 5) // "defer".len() == 5
1908            }
1909        };
1910
1911        self.trace_end();
1912        ret
1913    }
1914
1915    fn parse_return_stmt(&mut self) -> Stmt {
1916        self.trace_begin("ReturnStmt");
1917
1918        let pos = self.pos;
1919        self.expect(&Token::RETURN);
1920        let x = match self.token {
1921            Token::SEMICOLON(_) | Token::RBRACE => vec![],
1922            _ => self.parse_rhs_list(),
1923        };
1924
1925        self.trace_end();
1926        Stmt::Return(Rc::new(ReturnStmt {
1927            ret: pos,
1928            results: x,
1929        }))
1930    }
1931
1932    fn parse_branch_stmt(&mut self, token: Token) -> Stmt {
1933        self.trace_begin("BranchStmt");
1934
1935        let pos = self.expect(&token);
1936        let mut label = None;
1937        if let Token::IDENT(_) = self.token {
1938            if token != Token::FALLTHROUGH {
1939                let ident = self.parse_ident();
1940                label = Some(ident.clone());
1941                self.target_stack.last_mut().unwrap().push(ident);
1942            }
1943        }
1944        self.expect_semi();
1945
1946        self.trace_end();
1947        Stmt::Branch(Rc::new(BranchStmt {
1948            token_pos: pos,
1949            token: token,
1950            label: label,
1951        }))
1952    }
1953
1954    fn make_expr(&self, s: Option<Stmt>, want: &str) -> Option<Expr> {
1955        match s {
1956            Some(stmt) => match stmt {
1957                Stmt::Expr(x) => Some(self.check_expr(*x)),
1958                _ => {
1959                    let found = if let Stmt::Assign(_) = stmt {
1960                        "assignment"
1961                    } else {
1962                        "simple statement"
1963                    };
1964                    let extra = "(missing parentheses around composite literal?)";
1965                    let stri = format!("expected {}, found {} {}", want, found, extra);
1966                    let pos = stmt.pos(&self.objects);
1967                    self.error(pos, stri);
1968                    Some(Expr::new_bad(pos, self.safe_pos(stmt.end(&self.objects))))
1969                }
1970            },
1971            None => None,
1972        }
1973    }
1974
1975    fn parse_if_header(&mut self) -> (Option<Stmt>, Expr) {
1976        if self.token == Token::LBRACE {
1977            self.error_str(self.pos, "missing condition in if statement");
1978            return (None, Expr::new_bad(self.pos, self.pos));
1979        }
1980
1981        let outer = self.expr_level;
1982        self.expr_level = -1;
1983
1984        let mut init = match self.token {
1985            Token::SEMICOLON(_) => None,
1986            _ => {
1987                // accept potential variable declaration but complain
1988                if self.token == Token::VAR {
1989                    self.next();
1990                    self.error_str(self.pos, "var declaration not allowed in 'IF' initializer");
1991                }
1992                Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0)
1993            }
1994        };
1995
1996        let mut semi_real = false;
1997        let mut semi_pos = None;
1998        let cond_stmt = if self.token != Token::LBRACE {
1999            if let Token::SEMICOLON(real) = &self.token {
2000                semi_real = *real.as_ref();
2001                semi_pos = Some(self.pos);
2002                self.next();
2003            } else {
2004                self.expect(&Token::SEMICOLON(true.into()));
2005            }
2006            if self.token != Token::LBRACE {
2007                Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0)
2008            } else {
2009                None
2010            }
2011        } else {
2012            init.take()
2013        };
2014
2015        let cond = if let Some(_) = &cond_stmt {
2016            self.make_expr(cond_stmt, "boolean expression").unwrap()
2017        } else {
2018            if let Some(pos) = semi_pos {
2019                let msg = if semi_real {
2020                    "missing condition in if statement"
2021                } else {
2022                    "unexpected newline, expecting { after if clause"
2023                };
2024                self.error_str(pos, msg);
2025            }
2026            Expr::new_bad(self.pos, self.pos)
2027        };
2028
2029        self.expr_level = outer;
2030        return (init, cond);
2031    }
2032
2033    fn parse_if_stmt(&mut self) -> Stmt {
2034        self.trace_begin("IfStmt");
2035
2036        let pos = self.expect(&Token::IF);
2037        self.open_scope();
2038        let (init, cond) = self.parse_if_header();
2039        let body = self.parse_block_stmt();
2040        let els = if self.token == Token::ELSE {
2041            self.next();
2042            match self.token {
2043                Token::IF => Some(self.parse_if_stmt()),
2044                Token::LBRACE => {
2045                    let block = self.parse_block_stmt();
2046                    self.expect_semi();
2047                    Some(Stmt::box_block(block))
2048                }
2049                _ => {
2050                    self.error_expected(self.pos, "if statement or block");
2051                    Some(Stmt::new_bad(self.pos, self.pos))
2052                }
2053            }
2054        } else {
2055            self.expect_semi();
2056            None
2057        };
2058
2059        self.close_scope();
2060        self.trace_end();
2061        Stmt::If(Rc::new(IfStmt {
2062            if_pos: pos,
2063            init: init,
2064            cond: cond,
2065            body: Rc::new(body),
2066            els: els,
2067        }))
2068    }
2069
2070    fn parse_type_list(&mut self) -> Vec<Expr> {
2071        self.trace_begin("TypeList");
2072
2073        let mut list = vec![self.parse_type()];
2074        while self.token == Token::COMMA {
2075            self.next();
2076            list.push(self.parse_type());
2077        }
2078
2079        self.trace_end();
2080        list
2081    }
2082
2083    fn parse_case_clause(&mut self, type_switch: bool) -> CaseClause {
2084        self.trace_begin("CaseClause");
2085
2086        let pos = self.pos;
2087        let list = match self.token {
2088            Token::CASE => {
2089                self.next();
2090                if type_switch {
2091                    Some(self.parse_type_list())
2092                } else {
2093                    Some(self.parse_rhs_list())
2094                }
2095            }
2096            _ => {
2097                self.expect(&Token::DEFAULT);
2098                None
2099            }
2100        };
2101
2102        let colon = self.expect(&Token::COLON);
2103        self.open_scope();
2104        let body = self.parse_stmt_list();
2105        self.close_scope();
2106
2107        self.trace_end();
2108        CaseClause {
2109            case: pos,
2110            list: list,
2111            colon: colon,
2112            body: body,
2113        }
2114    }
2115
2116    fn is_type_switch_guard(&self, s: &Option<Stmt>) -> bool {
2117        match s {
2118            Some(stmt) => match stmt {
2119                Stmt::Expr(x) => x.is_type_switch_assert(),
2120                Stmt::Assign(idx) => {
2121                    let ass = &self.objects.a_stmts[*idx];
2122                    if ass.lhs.len() == 1
2123                        && ass.rhs.len() == 1
2124                        && ass.rhs[0].is_type_switch_assert()
2125                    {
2126                        match ass.token {
2127                            Token::ASSIGN => {
2128                                // permit v = x.(type) but complain
2129                                let s = "expected ':=', found '='";
2130                                self.error_str(ass.token_pos, s);
2131                                true
2132                            }
2133                            Token::DEFINE => true,
2134                            _ => false,
2135                        }
2136                    } else {
2137                        false
2138                    }
2139                }
2140                _ => false,
2141            },
2142            None => false,
2143        }
2144    }
2145
2146    fn parse_switch_stmt(&mut self) -> Stmt {
2147        self.trace_begin("SwitchStmt");
2148
2149        let pos = self.expect(&Token::SWITCH);
2150        self.open_scope();
2151
2152        let (mut s1, mut s2) = (None, None);
2153        if self.token != Token::LBRACE {
2154            let bak_lev = self.expr_level;
2155            self.expr_level = -1;
2156            if let Token::SEMICOLON(_) = self.token {
2157            } else {
2158                s2 = Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0);
2159            }
2160            if let Token::SEMICOLON(_) = self.token {
2161                self.next();
2162                s1 = s2.take();
2163                if self.token != Token::LBRACE {
2164                    // A TypeSwitchGuard may declare a variable in addition
2165                    // to the variable declared in the initial SimpleStmt.
2166                    // Introduce extra scope to avoid redeclaration errors:
2167                    //
2168                    //	switch t := 0; t := x.(T) { ... }
2169                    //
2170                    // (this code is not valid Go because the first t
2171                    // cannot be accessed and thus is never used, the extra
2172                    // scope is needed for the correct error message).
2173                    //
2174                    // If we don't have a type switch, s2 must be an expression.
2175                    // Having the extra nested but empty scope won't affect it.
2176                    self.open_scope();
2177                    s2 = Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0);
2178                    self.close_scope();
2179                }
2180            }
2181            self.expr_level = bak_lev;
2182        }
2183
2184        let type_switch = self.is_type_switch_guard(&s2);
2185        let lbrace = self.expect(&Token::LBRACE);
2186        let mut list = vec![];
2187        while self.token == Token::CASE || self.token == Token::DEFAULT {
2188            let clause = self.parse_case_clause(type_switch);
2189            list.push(Stmt::Case(Rc::new(clause)));
2190        }
2191        let rbrace = self.expect(&Token::RBRACE);
2192        self.expect_semi();
2193        let body = BlockStmt {
2194            l_brace: lbrace,
2195            list: list,
2196            r_brace: rbrace,
2197        };
2198        let ret = if type_switch {
2199            Stmt::TypeSwitch(Rc::new(TypeSwitchStmt {
2200                switch: pos,
2201                init: s1,
2202                assign: s2.unwrap(),
2203                body: Rc::new(body),
2204            }))
2205        } else {
2206            Stmt::Switch(Rc::new(SwitchStmt {
2207                switch: pos,
2208                init: s1,
2209                tag: self.make_expr(s2, "switch expression"),
2210                body: Rc::new(body),
2211            }))
2212        };
2213
2214        self.close_scope();
2215        self.trace_end();
2216        ret
2217    }
2218
2219    fn parse_comm_clause(&mut self) -> CommClause {
2220        self.trace_begin("CommClause");
2221        self.open_scope();
2222
2223        let pos = self.pos;
2224        let comm = if self.token == Token::CASE {
2225            self.next();
2226            let mut lhs = self.parse_lhs_list();
2227            let tk = self.token.clone();
2228            if self.token == Token::ARROW {
2229                // SendStmt
2230                if lhs.len() > 1 {
2231                    self.error_expected(lhs[0].pos(&self.objects), "1 expression");
2232                    // continue with first expression
2233                }
2234                let arrow = self.pos;
2235                self.next();
2236                let rhs = self.parse_rhs();
2237                Some(Stmt::Send(Rc::new(SendStmt {
2238                    chan: lhs.into_iter().nth(0).unwrap(),
2239                    arrow: arrow,
2240                    val: rhs,
2241                })))
2242            } else {
2243                // RecvStmt
2244                if tk == Token::ASSIGN || tk == Token::DEFINE {
2245                    // RecvStmt with assignment
2246                    if lhs.len() > 2 {
2247                        self.error_expected(lhs[0].pos(&self.objects), "1 or 2 expressions");
2248                        lhs.truncate(2);
2249                    }
2250                    let pos = self.pos;
2251                    self.next();
2252                    let rhs = self.parse_rhs();
2253                    let ass = Stmt::new_assign(&mut self.objects, lhs, pos, tk.clone(), vec![rhs]);
2254                    if tk == Token::DEFINE {
2255                        self.short_var_decl(&ass);
2256                    }
2257                    Some(ass)
2258                } else {
2259                    if lhs.len() > 1 {
2260                        self.error_expected(lhs[0].pos(&self.objects), "1 expression");
2261                        // continue with first expression
2262                    }
2263                    Some(Stmt::Expr(Box::new(lhs.into_iter().nth(0).unwrap())))
2264                }
2265            }
2266        } else {
2267            self.expect(&Token::DEFAULT);
2268            None
2269        };
2270        let colon = self.expect(&Token::COLON);
2271        let body = self.parse_stmt_list();
2272
2273        self.close_scope();
2274        self.trace_end();
2275        CommClause {
2276            case: pos,
2277            comm: comm,
2278            colon: colon,
2279            body: body,
2280        }
2281    }
2282
2283    fn parse_select_stmt(&mut self) -> Stmt {
2284        self.trace_begin("SelectStmt");
2285
2286        let pos = self.expect(&Token::SELECT);
2287        let lbrace = self.expect(&Token::LBRACE);
2288        let mut list = vec![];
2289        while self.token == Token::CASE || self.token == Token::DEFAULT {
2290            list.push(Stmt::Comm(Rc::new(self.parse_comm_clause())));
2291        }
2292        let rbrace = self.expect(&Token::RBRACE);
2293        self.expect_semi();
2294        let body = BlockStmt {
2295            l_brace: lbrace,
2296            list: list,
2297            r_brace: rbrace,
2298        };
2299
2300        self.trace_end();
2301        Stmt::Select(Rc::new(SelectStmt {
2302            select: pos,
2303            body: Rc::new(body),
2304        }))
2305    }
2306
2307    fn parse_for_stmt(&mut self) -> Stmt {
2308        self.trace_begin("ForStmt");
2309        let pos = self.expect(&Token::FOR);
2310        self.open_scope();
2311
2312        let (mut s1, mut s2, mut s3) = (None, None, None);
2313        let mut is_range = false;
2314        if self.token != Token::LBRACE {
2315            let bak_lev = self.expr_level;
2316            self.expr_level = -1;
2317            match self.token {
2318                Token::RANGE => {
2319                    // "for range x" (nil lhs in assignment)
2320                    let pos = self.pos;
2321                    self.next();
2322                    let unary = Expr::new_unary_expr(pos, Token::RANGE, self.parse_rhs());
2323                    s2 = Some(Stmt::new_assign(
2324                        &mut self.objects,
2325                        vec![],
2326                        0,
2327                        Token::NONE,
2328                        vec![unary],
2329                    ));
2330                    is_range = true;
2331                }
2332                Token::SEMICOLON(_) => {}
2333                _ => {
2334                    let ss = self.parse_simple_stmt(ParseSimpleMode::RangeOk);
2335                    s2 = Some(ss.0);
2336                    is_range = ss.1;
2337                }
2338            }
2339            if !is_range {
2340                if let Token::SEMICOLON(_) = self.token {
2341                    self.next();
2342                    s1 = s2.take();
2343                    if let Token::SEMICOLON(_) = self.token {
2344                    } else {
2345                        s2 = Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0);
2346                    }
2347                    self.expect_semi();
2348                    if self.token != Token::LBRACE {
2349                        s3 = Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0);
2350                    }
2351                }
2352            }
2353            self.expr_level = bak_lev;
2354        }
2355
2356        let body = self.parse_block_stmt();
2357        self.expect_semi();
2358
2359        let ret = if is_range {
2360            if let Stmt::Assign(idx) = s2.unwrap() {
2361                let ass = &self.objects.a_stmts[idx];
2362                let (key, val) = match ass.lhs.len() {
2363                    0 => (None, None),
2364                    1 => (Some(ass.lhs[0].clone()), None),
2365                    2 => {
2366                        let lhs0 = ass.lhs[0].clone();
2367                        let lhs1 = ass.lhs[1].clone();
2368                        (Some(lhs0), Some(lhs1))
2369                    }
2370                    _ => {
2371                        let pos = ass.lhs[0].pos(&self.objects);
2372                        self.error_expected(pos, "at most 2 expressions");
2373                        (None, None)
2374                    }
2375                };
2376                // parseSimpleStmt returned a right-hand side that
2377                // is a single unary expression of the form "range x"
2378                if let Expr::Unary(unary) = ass.rhs[0].clone() {
2379                    Stmt::Range(Rc::new(RangeStmt {
2380                        for_pos: pos,
2381                        key: key,
2382                        val: val,
2383                        token_pos: ass.token_pos,
2384                        token: ass.token.clone(),
2385                        expr: unary.expr.clone(),
2386                        body: Rc::new(body),
2387                    }))
2388                } else {
2389                    unreachable!();
2390                }
2391            } else {
2392                unreachable!();
2393            }
2394        } else {
2395            Stmt::For(Rc::new(ForStmt {
2396                for_pos: pos,
2397                init: s1,
2398                cond: self.make_expr(s2, "boolean or range expression"),
2399                post: s3,
2400                body: Rc::new(body),
2401            }))
2402        };
2403
2404        self.close_scope();
2405        self.trace_end();
2406        ret
2407    }
2408
2409    fn parse_stmt(&mut self) -> Stmt {
2410        self.trace_begin("Statement");
2411
2412        let ret = match &self.token {
2413            Token::CONST | Token::TYPE | Token::VAR =>
2414                Stmt::Decl(Rc::new(self.parse_decl(Token::is_stmt_start))),
2415            Token::IDENT(_) | Token::INT(_) | Token::FLOAT(_) | Token::IMAG(_) |
2416            Token::CHAR(_) | Token::STRING(_) | Token::FUNC | Token::LPAREN | // operands
2417		    Token::LBRACK | Token::STRUCT |
2418            Token::MAP | Token::CHAN | Token::INTERFACE | // composite types
2419		    Token::ADD | Token::SUB | Token::MUL | Token::AND |
2420            Token::XOR | Token::ARROW | Token::NOT => { // unary operators
2421                let s = self.parse_simple_stmt(ParseSimpleMode::LabelOk).0;
2422                if let Stmt::Labeled(_) = s {} else {self.expect_semi();}
2423                s
2424            },
2425            Token::GO => self.parse_go_stmt(),
2426            Token::DEFER => self.parse_defer_stmt(),
2427            Token::RETURN => self.parse_return_stmt(),
2428            Token::BREAK | Token::CONTINUE | Token::GOTO | Token::FALLTHROUGH =>
2429                self.parse_branch_stmt(self.token.clone()),
2430            Token::LBRACE => {
2431                let s = self.parse_block_stmt();
2432                self.expect_semi();
2433                Stmt::Block(Rc::new(s))
2434            },
2435            Token::IF => self.parse_if_stmt(),
2436            Token::SWITCH => self.parse_switch_stmt(),
2437            Token::SELECT => self.parse_select_stmt(),
2438            Token::FOR => self.parse_for_stmt(),
2439            Token::SEMICOLON(real) => {
2440                // Is it ever possible to have an implicit semicolon
2441                // producing an empty statement in a valid program?
2442                // (handle correctly anyway)
2443                let s = Stmt::Empty(Rc::new(
2444                    EmptyStmt{semi: self.pos, implicit: !*real.as_bool()}));
2445                self.next();
2446                s
2447            }
2448            Token::RBRACE => {
2449                // a semicolon may be omitted before a closing "}"
2450                Stmt::Empty(Rc::new(EmptyStmt{
2451                    semi: self.pos, implicit: false}))
2452            }
2453            _ => {
2454                let pos = self.pos;
2455                self.error_expected(pos, "statement");
2456                self.advance(Token::is_stmt_start);
2457                Stmt::new_bad(pos, self.pos)
2458            }
2459        };
2460
2461        self.trace_end();
2462        ret
2463    }
2464
2465    // ----------------------------------------------------------------------------
2466    // Declarations
2467
2468    fn is_valid_import(path: &str) -> bool {
2469        if path.len() < 3 || (!path.starts_with('"') || !path.ends_with('"')) {
2470            return false;
2471        }
2472        let result = &path[1..path.len() - 1];
2473        let mut illegal_chars: Vec<char> = r##"!"#$%&'()*,:;<=>?[\]^{|}`"##.chars().collect();
2474        illegal_chars.push('\u{FFFD}');
2475        result
2476            .chars()
2477            .find(|&x| !x.is_ascii_graphic() || x.is_whitespace() || illegal_chars.contains(&x))
2478            .is_none()
2479    }
2480
2481    fn parse_import_spec(&mut self, _: &Token, _: isize) -> SpecKey {
2482        self.trace_begin("ImportSpec");
2483
2484        let ident = match self.token {
2485            Token::PERIOD => {
2486                let i = new_ident!(self, self.pos, ".".to_owned(), IdentEntity::NoEntity);
2487                self.next();
2488                Some(i)
2489            }
2490            Token::IDENT(_) => Some(self.parse_ident()),
2491            _ => None,
2492        };
2493        let pos = self.pos;
2494        let path_token = match &self.token {
2495            Token::STRING(lit) => {
2496                let litstr: &String = lit.as_ref();
2497                if !Parser::is_valid_import(litstr) {
2498                    let msg = format!("{}{}", "invalid import path: ", litstr);
2499                    self.error(pos, msg);
2500                }
2501                let token = self.token.clone();
2502                self.next();
2503                token
2504            }
2505            _ => {
2506                // use expect() error handling
2507                let token = Token::STRING("_".to_owned().into());
2508                self.expect(&token);
2509                token
2510            }
2511        };
2512        self.expect_semi();
2513        let index = self.objects.specs.insert(Spec::Import(Rc::new(ImportSpec {
2514            name: ident,
2515            path: BasicLit {
2516                pos: pos,
2517                token: path_token,
2518            },
2519            end_pos: None,
2520        })));
2521        self.imports.push(index);
2522
2523        self.trace_end();
2524        index
2525    }
2526
2527    fn parse_value_spec<'p, 'k>(
2528        self_: &'p mut Parser<'a>,
2529        keyword: &'k Token,
2530        iota: isize,
2531    ) -> SpecKey {
2532        self_.trace_begin(&format!("{}{}", keyword.text(), "Spec"));
2533
2534        let pos = self_.pos;
2535        let idents = self_.parse_ident_list();
2536        let typ = self_.try_type();
2537        let values = match self_.token {
2538            Token::ASSIGN => {
2539                self_.next();
2540                self_.parse_rhs_list()
2541            }
2542            _ => vec![],
2543        };
2544        self_.expect_semi();
2545
2546        match keyword {
2547            Token::VAR => {
2548                if typ.is_none() && values.len() == 0 {
2549                    self_.error_str(pos, "missing variable type or initialization");
2550                }
2551            }
2552            Token::CONST => {
2553                if values.len() == 0 && (iota == 0 || typ.is_some()) {
2554                    self_.error_str(pos, "missing constant value");
2555                }
2556            }
2557            _ => {}
2558        }
2559
2560        // Go spec: The scope of a constant or variable identifier declared inside
2561        // a function begins at the end of the ConstSpec or VarSpec and ends at
2562        // the end of the innermost containing block.
2563        // (Global identifiers are resolved in a separate phase after parsing.)
2564        let spec = self_.objects.specs.insert(Spec::Value(Rc::new(ValueSpec {
2565            names: idents,
2566            typ,
2567            values,
2568        })));
2569        let kind = if let Token::VAR = keyword {
2570            EntityKind::Var
2571        } else {
2572            EntityKind::Con
2573        };
2574        self_.declare(
2575            DeclObj::Spec(spec),
2576            EntityData::ConIota(iota),
2577            kind,
2578            &self_.top_scope.unwrap(),
2579        );
2580
2581        self_.trace_end();
2582        spec
2583    }
2584
2585    fn parse_type_spec(&mut self, _: &Token, _: isize) -> SpecKey {
2586        self.trace_begin("TypeSpec");
2587
2588        let ident = self.parse_ident();
2589        // Go spec: The scope of a type identifier declared inside a function begins
2590        // at the identifier in the TypeSpec and ends at the end of the innermost
2591        // containing block.
2592        // (Global identifiers are resolved in a separate phase after parsing.)
2593        let placeholder = Expr::new_bad(0, 0);
2594        let spec_val = Spec::Type(Rc::new(TypeSpec {
2595            name: ident,
2596            assign: 0,
2597            typ: placeholder,
2598        }));
2599        let index = self.objects.specs.insert(spec_val);
2600        let scope = self.top_scope.unwrap();
2601        self.declare(
2602            DeclObj::Spec(index),
2603            EntityData::NoData,
2604            EntityKind::Typ,
2605            &scope,
2606        );
2607        let assign = if self.token == Token::ASSIGN {
2608            self.next();
2609            self.pos
2610        } else {
2611            0
2612        };
2613        let typ = self.parse_type();
2614        let spec = if let Spec::Type(boxts) = &mut self.objects.specs[index] {
2615            Rc::get_mut(boxts).unwrap()
2616        } else {
2617            unreachable!()
2618        };
2619        spec.assign = assign;
2620        spec.typ = typ;
2621        self.expect_semi();
2622
2623        self.trace_end();
2624        index
2625    }
2626
2627    fn parse_gen_decl(
2628        &mut self,
2629        keyword: &Token,
2630        f: fn(&mut Parser<'a>, &Token, isize) -> SpecKey,
2631    ) -> Decl {
2632        self.trace_begin(&format!("GenDecl({})", keyword.text()));
2633
2634        let pos = self.expect(keyword);
2635        let (lparen, rparen, list) = if self.token == Token::LPAREN {
2636            let lp = self.pos;
2637            self.next();
2638            let mut list = vec![];
2639            let mut iota = 0;
2640            while self.token != Token::RPAREN && self.token != Token::EOF {
2641                list.push(f(self, keyword, iota));
2642                iota += 1;
2643            }
2644            let rp = self.expect(&Token::RPAREN);
2645            self.expect_semi();
2646            (Some(lp), Some(rp), list)
2647        } else {
2648            (None, None, vec![f(self, keyword, 0)])
2649        };
2650
2651        self.trace_end();
2652        Decl::Gen(Rc::new(GenDecl {
2653            token_pos: pos,
2654            token: keyword.clone(),
2655            l_paran: lparen,
2656            specs: list,
2657            r_paren: rparen,
2658        }))
2659    }
2660
2661    fn parse_func_decl(&mut self) -> Decl {
2662        self.trace_begin("FunctionDecl");
2663
2664        let pos = self.expect(&Token::FUNC);
2665        let scope = new_scope!(self, self.top_scope);
2666        let recv = if self.token == Token::LPAREN {
2667            Some(self.parse_parameters(scope, false))
2668        } else {
2669            None
2670        };
2671        let ident = self.parse_ident();
2672        let (params, results) = self.parse_signature(scope);
2673        let body = if self.token == Token::LBRACE {
2674            Some(Rc::new(self.parse_body(scope)))
2675        } else {
2676            None
2677        };
2678        self.expect_semi();
2679
2680        let recv_is_none = recv.is_none();
2681        let typ = self.objects.ftypes.insert(FuncType {
2682            func: Some(pos),
2683            params: params,
2684            results: results,
2685        });
2686        let decl = self.objects.fdecls.insert(FuncDecl {
2687            recv: recv,
2688            name: ident,
2689            typ: typ,
2690            body: body,
2691        });
2692        if recv_is_none {
2693            // Go spec: The scope of an identifier denoting a constant, type,
2694            // variable, or function (but not method) declared at top level
2695            // (outside any function) is the package block.
2696            //
2697            // init() functions cannot be referred to and there may
2698            // be more than one - don't put them in the pkgScope
2699            if self.objects.idents[ident].name != "init" {
2700                self.declare(
2701                    DeclObj::FuncDecl(decl),
2702                    EntityData::NoData,
2703                    EntityKind::Fun,
2704                    &self.pkg_scope.unwrap(),
2705                );
2706            }
2707        }
2708
2709        self.trace_end();
2710        Decl::Func(decl)
2711    }
2712
2713    fn parse_decl(&mut self, sync: fn(&Token) -> bool) -> Decl {
2714        self.trace_begin("Declaration");
2715
2716        let decl = match self.token {
2717            Token::CONST | Token::VAR | Token::TYPE => {
2718                let token = self.token.clone();
2719                match token {
2720                    Token::CONST | Token::VAR => {
2721                        self.parse_gen_decl(&token, Parser::parse_value_spec)
2722                    }
2723                    Token::TYPE => self.parse_gen_decl(&token, Parser::parse_type_spec),
2724                    _ => {
2725                        unreachable!();
2726                    }
2727                }
2728            }
2729            Token::FUNC => self.parse_func_decl(),
2730            _ => {
2731                let pos = self.pos;
2732                self.error_expected(pos, "declaration");
2733                self.advance(sync);
2734                Decl::Bad(Rc::new(BadDecl {
2735                    from: pos,
2736                    to: self.pos,
2737                }))
2738            }
2739        };
2740
2741        self.trace_end();
2742        decl
2743    }
2744
2745    // ----------------------------------------------------------------------------
2746    // Source files
2747
2748    pub fn parse_file(&mut self) -> Option<File> {
2749        self.trace_begin("File");
2750
2751        let err_count = self.errors.len();
2752        let pos = self.expect(&Token::PACKAGE);
2753        // Go spec: The package clause is not a declaration;
2754        // the package name does not appear in any scope.
2755        let ident = self.parse_ident();
2756        if self.objects.idents[ident].name == "_" {
2757            self.error_str(self.pos, "invalid package name _");
2758        }
2759        self.expect_semi();
2760
2761        // Don't bother parsing the rest if we had errors parsing the package clause.
2762        // Likely not a Go source file at all.
2763        if self.errors.len() > err_count {
2764            self.trace_end();
2765            return None;
2766        }
2767
2768        self.open_scope();
2769        self.pkg_scope = self.top_scope;
2770        let mut decls = vec![];
2771        // import decls
2772        while self.token == Token::IMPORT {
2773            decls.push(self.parse_gen_decl(&Token::IMPORT, Parser::parse_import_spec));
2774        }
2775        // rest of package body
2776        while self.token != Token::EOF {
2777            decls.push(self.parse_decl(Token::is_decl_start))
2778        }
2779        self.close_scope();
2780        assert!(self.top_scope.is_none(), "unbalanced scopes");
2781        assert!(self.label_scope.is_none(), "unbalanced label scopes");
2782
2783        // resolve global identifiers within the same file
2784        self.unresolved = self
2785            .unresolved
2786            .to_owned()
2787            .into_iter()
2788            .filter_map(|x| {
2789                let ident = &mut self.objects.idents[x];
2790                let scope = &self.objects.scopes[self.pkg_scope.unwrap()];
2791                let entity = scope.look_up(&ident.name);
2792                if let Some(en) = entity {
2793                    ident.entity = IdentEntity::Entity(*en);
2794                    Some(x)
2795                } else {
2796                    None
2797                }
2798            })
2799            .collect();
2800
2801        self.trace_end();
2802        Some(File {
2803            package: pos,
2804            name: ident,
2805            decls: decls,
2806            scope: self.pkg_scope.unwrap(),
2807            imports: self.imports.clone(),
2808            unresolved: self.unresolved.clone(),
2809        })
2810    }
2811}
2812
2813#[cfg(test)]
2814mod test {
2815    use super::*;
2816
2817    #[test]
2818    fn test_parser() {
2819        let mut fs = position::FileSet::new();
2820        let f = fs.add_file("testfile1.gs".to_owned(), None, 1000);
2821
2822        let s1 = r###"
2823        func (p *someobj) testFunc(a, b *int) (i int) {
2824            for 我 := range iii {
2825                a = 1;
2826            }
2827        }
2828        "###;
2829        let o = &mut AstObjects::new();
2830        let el = &mut ErrorList::new();
2831        let mut p = Parser::new(o, f, el, s1, true);
2832        p.open_scope();
2833        p.pkg_scope = p.top_scope;
2834        p.parse_decl(Token::is_decl_start);
2835    }
2836}