blob: 9174bec9576e338980a7963d4b61bb89771b0878 [file] [log] [blame]
Brian Silverman4e662aa2022-05-11 23:10:19 -07001// Copyright 2021 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9use proc_macro2::Ident;
10use quote::ToTokens;
11use syn::Result as ParseResult;
12use syn::{
13 parse::{Parse, ParseStream},
14 token::Comma,
15};
16
17#[derive(Default)]
18pub struct SubclassAttrs {
19 pub self_owned: bool,
20 pub superclass: Option<String>,
21}
22
23impl Parse for SubclassAttrs {
24 fn parse(input: ParseStream) -> ParseResult<Self> {
25 let mut me = Self::default();
26 let mut id = input.parse::<Option<Ident>>()?;
27 while id.is_some() {
28 match id {
29 Some(id) if id == "self_owned" => me.self_owned = true,
30 Some(id) if id == "superclass" => {
31 let args;
32 syn::parenthesized!(args in input);
33 let superclass: syn::LitStr = args.parse()?;
34 if me.superclass.is_some() {
35 return Err(syn::Error::new_spanned(
36 id.into_token_stream(),
37 "Expected single superclass specification",
38 ));
39 }
40 me.superclass = Some(superclass.value());
41 }
42 Some(id) => {
43 return Err(syn::Error::new_spanned(
44 id.into_token_stream(),
45 "Expected self_owned or superclass",
46 ))
47 }
48 None => {}
49 };
50 let comma = input.parse::<Option<Comma>>()?;
51 if comma.is_none() {
52 break;
53 }
54 id = input.parse::<Option<Ident>>()?;
55 }
56 Ok(me)
57 }
58}