mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-04 14:28:22 +00:00
Update to ASF header / add when missing (#1437)
This commit is contained in:
parent
fb42425d51
commit
9934f3d931
64 changed files with 1006 additions and 427 deletions
|
@ -1,3 +1,20 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
[package]
|
||||
name = "sqlparser_derive"
|
||||
description = "proc macro for sqlparser"
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
<!---
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
-->
|
||||
|
||||
# SQL Parser Derive Macro
|
||||
|
||||
## Visit
|
||||
|
|
|
@ -1,31 +1,53 @@
|
|||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
use proc_macro2::TokenStream;
|
||||
use quote::{format_ident, quote, quote_spanned, ToTokens};
|
||||
use syn::spanned::Spanned;
|
||||
use syn::{
|
||||
parse::{Parse, ParseStream},
|
||||
parse_macro_input, parse_quote, Attribute, Data, DeriveInput,
|
||||
Fields, GenericParam, Generics, Ident, Index, LitStr, Meta, Token
|
||||
parse_macro_input, parse_quote, Attribute, Data, DeriveInput, Fields, GenericParam, Generics,
|
||||
Ident, Index, LitStr, Meta, Token,
|
||||
};
|
||||
|
||||
|
||||
/// Implementation of `[#derive(Visit)]`
|
||||
#[proc_macro_derive(VisitMut, attributes(visit))]
|
||||
pub fn derive_visit_mut(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
||||
derive_visit(input, &VisitType {
|
||||
visit_trait: quote!(VisitMut),
|
||||
visitor_trait: quote!(VisitorMut),
|
||||
modifier: Some(quote!(mut)),
|
||||
})
|
||||
derive_visit(
|
||||
input,
|
||||
&VisitType {
|
||||
visit_trait: quote!(VisitMut),
|
||||
visitor_trait: quote!(VisitorMut),
|
||||
modifier: Some(quote!(mut)),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
/// Implementation of `[#derive(Visit)]`
|
||||
#[proc_macro_derive(Visit, attributes(visit))]
|
||||
pub fn derive_visit_immutable(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
||||
derive_visit(input, &VisitType {
|
||||
visit_trait: quote!(Visit),
|
||||
visitor_trait: quote!(Visitor),
|
||||
modifier: None,
|
||||
})
|
||||
derive_visit(
|
||||
input,
|
||||
&VisitType {
|
||||
visit_trait: quote!(Visit),
|
||||
visitor_trait: quote!(Visitor),
|
||||
modifier: None,
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
struct VisitType {
|
||||
|
@ -34,15 +56,16 @@ struct VisitType {
|
|||
modifier: Option<TokenStream>,
|
||||
}
|
||||
|
||||
fn derive_visit(
|
||||
input: proc_macro::TokenStream,
|
||||
visit_type: &VisitType,
|
||||
) -> proc_macro::TokenStream {
|
||||
fn derive_visit(input: proc_macro::TokenStream, visit_type: &VisitType) -> proc_macro::TokenStream {
|
||||
// Parse the input tokens into a syntax tree.
|
||||
let input = parse_macro_input!(input as DeriveInput);
|
||||
let name = input.ident;
|
||||
|
||||
let VisitType { visit_trait, visitor_trait, modifier } = visit_type;
|
||||
let VisitType {
|
||||
visit_trait,
|
||||
visitor_trait,
|
||||
modifier,
|
||||
} = visit_type;
|
||||
|
||||
let attributes = Attributes::parse(&input.attrs);
|
||||
// Add a bound `T: Visit` to every type parameter T.
|
||||
|
@ -87,7 +110,10 @@ impl Parse for WithIdent {
|
|||
let mut result = WithIdent { with: None };
|
||||
let ident = input.parse::<Ident>()?;
|
||||
if ident != "with" {
|
||||
return Err(syn::Error::new(ident.span(), "Expected identifier to be `with`"));
|
||||
return Err(syn::Error::new(
|
||||
ident.span(),
|
||||
"Expected identifier to be `with`",
|
||||
));
|
||||
}
|
||||
input.parse::<Token!(=)>()?;
|
||||
let s = input.parse::<LitStr>()?;
|
||||
|
@ -131,17 +157,26 @@ impl Attributes {
|
|||
}
|
||||
|
||||
// Add a bound `T: Visit` to every type parameter T.
|
||||
fn add_trait_bounds(mut generics: Generics, VisitType{visit_trait, ..}: &VisitType) -> Generics {
|
||||
fn add_trait_bounds(mut generics: Generics, VisitType { visit_trait, .. }: &VisitType) -> Generics {
|
||||
for param in &mut generics.params {
|
||||
if let GenericParam::Type(ref mut type_param) = *param {
|
||||
type_param.bounds.push(parse_quote!(sqlparser::ast::#visit_trait));
|
||||
type_param
|
||||
.bounds
|
||||
.push(parse_quote!(sqlparser::ast::#visit_trait));
|
||||
}
|
||||
}
|
||||
generics
|
||||
}
|
||||
|
||||
// Generate the body of the visit implementation for the given type
|
||||
fn visit_children(data: &Data, VisitType{visit_trait, modifier, ..}: &VisitType) -> TokenStream {
|
||||
fn visit_children(
|
||||
data: &Data,
|
||||
VisitType {
|
||||
visit_trait,
|
||||
modifier,
|
||||
..
|
||||
}: &VisitType,
|
||||
) -> TokenStream {
|
||||
match data {
|
||||
Data::Struct(data) => match &data.fields {
|
||||
Fields::Named(fields) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue