Vscode-rust: Problemas de informes de extensión de Rust que no existen (?)

Creado en 17 sept. 2020  ·  3Comentarios  ·  Fuente: rust-lang/vscode-rust

Soy nuevo en Rust, por lo que es muy posible que me esté perdiendo algo obvio aquí, pero me encontré con un escenario extraño en el que la extensión VS Code (he deshabilitado todas las demás extensiones) informa problemas que no existen .

Escribí una macro que me permite anotar tipos con un identificador y crear una enumeración que contiene variantes para cada uno de esos tipos, así como una enumeración de 'enumeración de tipos' que es idéntica, pero sin datos asociados sobre las variantes. Construye A-OK sin quejas cargo build funciona.

Sin embargo, la extensión Rust en VS Code informa cuatro errores (E0428):

the name `Message1` is defined multiple times
`Message1` redefined here
note: `Message1` must be defined only once in the type namespace of this enum

the name `Message1` is defined multiple times
previous definition of the type `Message1` here
note: `Message1` must be defined only once in the type namespace of this enum

the name `Message2` is defined multiple times
`Message2` redefined here
note: `Message2` must be defined only once in the type namespace of this enum

the name `Message2` is defined multiple times
previous definition of the type `Message2` here
note: `Message2` must be defined only once in the type namespace of this enum

El código real en cuestión es:

    #[message(Test)]
    pub struct Message1 {
        pub val: i32,
    }

    #[message(Test)]
    pub struct Message2;

    #[write_message_type(Test)] // Red squiggly
    pub enum Test {
    }

cargo expand salidas:

    pub struct Message1 {
        pub val: i32,
    }
    pub struct Message2;
    pub enum TestTypes {
        Message1,
        Message2,
    }
    pub enum Test {
        Message1(Message1),
        Message2(Message2),
    }

Dado que la expansión es correcta (y la caja crea y produce los resultados esperados al envolver y desenvolver mensajes), no estoy seguro de si el código de la macro tiene mucha relevancia, pero por si acaso, aquí está. Tenga cuidado, es rápido, sucio, sin terminar y mi primer intento de escribir una macro (sin haber leído lo suficiente de antemano, francamente).

lazy_static! {
    static ref MESSAGE_MAP: Mutex<HashMap<String, Vec<String>>> = Mutex::new(HashMap::new());
}

#[proc_macro_attribute]
pub fn message(attr: TokenStream, item: TokenStream) -> TokenStream {
    match MESSAGE_MAP.lock() {
        Ok(mut map) => map.entry(attr.to_string()).or_insert(Vec::new()).push(
            syn::parse::<syn::DeriveInput>(item.clone())
                .expect("Invalid target for message attr")
                .ident
                .to_string(),
        ),
        Err(e) => panic!("Message map lock poisoned: '{}'.", e.to_string()),
    }

    item
}

#[proc_macro_attribute]
pub fn write_message_type(attr: TokenStream, _: TokenStream) -> TokenStream {
    let name = attr.to_string();
    match MESSAGE_MAP.lock() {
        Ok(map) => match map.get(&name) {
            Some(entries) => {
                let message_type_enumeration_name = syn::parse_str::<syn::Ident>(&(name.clone() + "Types")).expect("Invalid message wrapper name.");
                let type_entries: Vec<_>= entries.iter().map(|e| syn::parse_str::<syn::Ident>(e).expect("Something went horribly wrong enumerating the wrapped message types")).collect();

                let message_wrapper_name = syn::parse_str::<syn::Variant>(&name).expect("Invalid message wrapper name.");
                let wrapper_entries: Vec<_>= entries.iter().map(|e|{
                    let mut variant = e.clone();
                    variant += "(";
                    variant += e;
                    variant += ")";
                    syn::parse_str::<syn::Variant>(&variant).expect("Something went horribly wrong enumerating the wrapped message types")}).collect();

                     (quote! {
                    pub enum #message_type_enumeration_name {
                        #(#type_entries),*
                    }

                    pub enum #message_wrapper_name {
                        #(#wrapper_entries),*
                    }
                })
                .into()
            }
            None => panic!("Tried to expand message type wrappers '{}', but no message types were recorded for it!", name)
        },
        Err(e) => panic!("Message map lock poisoned: '{}'.", e.to_string()),
    }
}

VS Code está actualizado, la extensión Rust está actualizada y mi instalación de Win 10 está actualizada. Como puedo construir, no es el fin del mundo, pero sería bueno no tener esos errores en el panel de problemas; si es un problema con mi código, y no con la extensión, mis disculpas.

Comentario más útil

@JKAnderson409 tenga en cuenta que la sintaxis dustypomerleau.rust-syntax se fusionó con rust-analyzer recientemente.

Sí, eso fue una buena noticia. De hecho, le pedí a DustyPomerleau que intentara fusionarlo el mismo día que hice ese otro comentario. Ha facilitado el uso de las versiones nocturnas de rust-analyzer porque no necesito sobrescribir la gramática todos los días. La extensión rust-analyzer es ahora mi única extensión Rust.

Estoy agradecido de que @dustypomerleau haya hecho el esfuerzo de pasar por el proceso de revisión para que la extensión rust-analyzer pueda enviarse con una gran gramática de TextMate.

Todos 3 comentarios

He tenido este problema muchas veces, ha existido por un tiempo. En mi experiencia, rust-analyzer no tiene este problema y ese parece ser el servidor de idioma que se está desarrollando activamente. Si usa RLS con esta extensión, intente cambiar a rust-analyzer, ya sea como back-end de esta extensión o usando su propia extensión VS Code. Creo que rust-analyzer finalmente será RLS 2.0, pero ya es la experiencia IDE más fácil de usar y, francamente, simplemente mejor.

Solo uso esto porque uso una gramática alternativa (dustypomerleau.rust-syntax) que requiere esta extensión. El uso de esta extensión con rust-analyzer requería la instalación manual de un binario, que es otro problema que ha persistido durante meses. Es por eso que recomiendo usar la otra extensión. A pesar de esto y de que RLS es el analizador de óxido predeterminado de jure, parece haberlos eclipsado.

@JKAnderson409 tenga en cuenta que la sintaxis dustypomerleau.rust-syntax se fusionó con rust-analyzer recientemente.

@JKAnderson409 tenga en cuenta que la sintaxis dustypomerleau.rust-syntax se fusionó con rust-analyzer recientemente.

Sí, eso fue una buena noticia. De hecho, le pedí a DustyPomerleau que intentara fusionarlo el mismo día que hice ese otro comentario. Ha facilitado el uso de las versiones nocturnas de rust-analyzer porque no necesito sobrescribir la gramática todos los días. La extensión rust-analyzer es ahora mi única extensión Rust.

Estoy agradecido de que @dustypomerleau haya hecho el esfuerzo de pasar por el proceso de revisión para que la extensión rust-analyzer pueda enviarse con una gran gramática de TextMate.

¿Fue útil esta página
0 / 5 - 0 calificaciones