// UNION_BODY -> {UNION_FIELD_DECL} // UNION_FIELD_DECL -> [ATTRIBUTES] TYPE name [ordinal] semi func (p *Parser) parseUnionBody(union *mojom.MojomUnion) bool { if !p.OK() { return p.OK() } p.pushChildNode("unionBody") defer p.popNode() rbraceFound := false for attributes := p.parseAttributes(); !rbraceFound; attributes = p.parseAttributes() { if !p.OK() { return false } nextToken := p.peekNextToken("I was parsing a union body.") switch nextToken.Kind { case lexer.Name: fieldType := p.parseType() fieldName := p.readName() nameToken := p.lastConsumed tag, err := p.readOrdinal() if err != nil { p.err = p.newInvalidOrdinalError("union field", fieldName, nameToken, err) return false } if !p.matchSemicolon() { return false } union.AddField(p.DeclDataWithOrdinal(fieldName, nameToken, attributes, tag), fieldType) case lexer.RBrace: rbraceFound = true if attributes != nil { message := "Enum body ends with extraneouss attributes." p.err = &ParseError{ParserErrorCodeBadAttributeLocation, message} } break default: p.unexpectedTokenError(nextToken, "either another union field or }") return false } } return p.OK() }
// UNION_BODY -> {UNION_FIELD_DECL} // UNION_FIELD_DECL -> [ATTRIBUTES] TYPE name [ordinal] semi func (p *Parser) parseUnionBody(union *mojom.MojomUnion) bool { if !p.OK() { return p.OK() } p.pushChildNode("unionBody") defer p.popNode() rbraceFound := false for attributes := p.parseAttributes(); !rbraceFound; attributes = p.parseAttributes() { if !p.OK() { return false } nextToken := p.peekNextToken("I was parsing a union body.") switch nextToken.Kind { case lexer.NAME: fieldType := p.parseType() fieldName := p.readName() tag := p.readOrdinal() if !p.matchSemicolon() { return false } union.AddField(fieldType, fieldName, tag, attributes) case lexer.RBRACE: rbraceFound = true if attributes != nil { message := "Enum body ends with extranesous attributes." p.err = &ParseError{E_BAD_ATTRIBUTE_LOCATION, message} } break default: p.unexpectedTokenError(nextToken, "either another union field or }") return false } } return p.OK() }