Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Errores del Linter confusos al usar herencia ("shouldUseOverrideKeyword" y "shouldMatchSuperclassReturnValue") #175

Open
NicolasKalaydjian opened this issue Aug 11, 2024 · 3 comments
Labels
bug Something isn't working component: linter Linter / Validator reporter

Comments

@NicolasKalaydjian
Copy link

NicolasKalaydjian commented Aug 11, 2024

Hola buenas, soy Nico, ayudante de PdP.

  1. No estoy entendiendo por qué aparecen estos mensajes de error, parecieran no tener sentido.
  2. El segundo mensaje donde dice "valor del tipo devuelto" supongo deberia decir "tipo del valor devuelto".

Hice captura del mensaje del Linter y las pegue encima de la captura del codigo.
De cualquier forma dejo el codigo completo abajo para testear.

IDE: VS Code 1.92.1
SO: w10
Version Wollok: 0.2.7
Version de la extension "wollok-lsp-ide": 0.3.3
Version de node: 20.16.0

Error 1
image
Error 2 (esta tambien sale de la misma forma en la clase AntivirusTrial)
image

class Computadora {
    const property archivos = [] // lista de Archivo
    const programas = [] // lista de Programa
    var property antivirus = antivirusNulo

    /* Punto 1 */
    method agregarArchivo(archivo) {
        archivos.add(archivo)
    }

    method agregarArchivos(archivosNuevos) {
        archivos.addAll(archivosNuevos)
    }

    method eliminarArchivo(archivo) {
        archivos.remove(archivo)
    }
    
    method instalarPrograma(programaNuevo) {
        programas.add(programaNuevo)
    }
    
    method desinstalarPrograma(programaExistente) {
        programas.remove(programaExistente)
    }

    method afectarArchivosCon(virus) {
        archivos.forEach{ archivo => archivo.afectarCon(virus) }
    }

    method tieneComprobantePara(ransomware) = 
        archivos.any{ archivo => archivo.esComprobantePara(ransomware) }

    method tieneArchivosSecuestrablesPor(ransomware) =
        archivos.any{ archivo => archivo != ransomware.nuevoReadme() }

    method eliminarArchivos() {
        archivos.clear()
    }
    
    method ejecutarPrograma(unPrograma){ 
    	if(!antivirus.esMalware(unPrograma)) // si no es malware
    		unPrograma.ejecutarEn(self)	
    } // si el antivirus esta caducado, no analiza y el programa se ejecuta
}

/* Punto 2 */
class Archivo { 
    method peso()
    method afectarCon(virus)
    method esComprobantePara(ransomware) = false
}

class Texto inherits Archivo {
    var property contenido // string
    const property nombre // string

    override method peso() = (contenido.length() + nombre.length()) / 5
    override method afectarCon(virus) {
        contenido = virus.nombre()
    }
    override method esComprobantePara(ransomware) = 
        nombre == "comprobante de pago" and 
        contenido.contains(ransomware.cuenta())
    override method ==(otro) = nombre == otro.nombre() and
                                contenido == otro.contenido()
}

class Imagen inherits Archivo {
    var property resolucion // Resolucion
    var property nombre // string

    override method peso() = resolucion.totalDePixeles() / 100
    override method afectarCon(virus) {
        nombre = "Brad Pitt dentro de un caballo de madera gigante"
        resolucion = 
            new Resolucion(alto = resolucion.ancho(), 
                            ancho = resolucion.alto())
    }
}

class Resolucion {
    const property alto
    const property ancho

    method totalDePixeles() = alto * ancho
}

class Musica inherits Archivo {
    const property peso //
    const nombreCancion
    var nombreArtista
    //const anioSalida

    override method afectarCon(virus) {
        if(nombreCancion != "Pronta Entrega")
            nombreArtista = virus.nombre()
    }

    method nombre() = nombreCancion + " - " + nombreArtista
}

// PROGRAMAS

class ProgramaNormal {
    const property nombre

    /* Punto 3.a */
    method ejecutarEn(compu) {
        const archivoTexto = 
            new Texto(contenido = "información muy importante para el trabajo",
                      nombre = "datos." + nombre)
        compu.agregarArchivo(archivoTexto)
    }
}

class Virus {
    const property nombre

    /* Punto 3.b */
    method ejecutarEn(compu) {
        compu.afectarArchivosCon(self)
    }
}

class Ransomware {
    const property nombre
    const property cuenta
    const cantidad
    const archivosSecuestrados = []

    /* Punto 3.c */
    method ejecutarEn(compu) {
        if(compu.tieneComprobantePara(self))
            self.devolverArchivosA(compu)
        else 
            if(compu.tieneArchivosSecuestrablesPor(self))
                self.secuestrarArchivosDe(compu)
            else 
                throw new RansomwareException(message = "no se puede secuestrar")
    }

    method devolverArchivosA(compu) {
        compu.agregarArchivos(archivosSecuestrados)
    }

    method nuevoReadme() = 
        new Texto(contenido = "Pagame " + cantidad + " a la cuenta " + cuenta,
                nombre = "README")
    
    method secuestrarArchivosDe(compu) {
        archivosSecuestrados.addAll(compu.archivos())
        compu.eliminarArchivos()
        compu.agregarArchivo(self.nuevoReadme())
    }
}

class RansomwareException inherits Exception {}

// ANTIVIRUS

class Antivirus {
	const baseConocimiento // lista de nombres de malware
	method esMalware(unPrograma) = baseConocimiento.any({programa => programa == unPrograma.nombre()})
	method cuantosSonMalware(listaProgramas) = 
		listaProgramas.count{programa => self.esMalware(programa)}
}

class AntivirusGratuito inherits Antivirus{
	const fechaExpiracion
	
	override method esMalware(unPrograma) {
		if (new Date() > fechaExpiracion)
            return false
		else
            return super(unPrograma)
	}
}

class AntivirusTrial inherits Antivirus{
	const limiteChequeos
	var chequeosRealizados
	
	override method esMalware(unPrograma) {
		if (chequeosRealizados > limiteChequeos)
			return false
		else {
			chequeosRealizados += 1
			return super(unPrograma)  
		}
	}
}

class AntivirusPago inherits Antivirus{ 
	
}

object antivirusNulo {
	method esMalware(unPrograma) = false
}

class AntivirusCaducadoException inherits Exception {}


object theUltimateAntivirusBenchmark {
	const listaProgramasNormales = []
	const listaMalware = []
	
	method antivirusGanador(listaAntivirus) {
		return listaAntivirus.max{antivirus => antivirus.cuantosSonMalware(listaMalware) / listaMalware.length()
                                                - antivirus.cuantosSonMalware(listaProgramasNormales) /  listaProgramasNormales.length()}
	}
}
@NicolasKalaydjian NicolasKalaydjian changed the title Errores del Linter confusos al usar herencia ("tipo del valor de vuelto" y "deberia marcarse como override") Errores del Linter confusos al usar herencia ("shouldUseOverrideKeyword" y "shouldMatchSuperclassReturnValue") Aug 11, 2024
@PalumboN PalumboN added bug Something isn't working component: linter Linter / Validator reporter labels Aug 17, 2024
@NicolasKalaydjian
Copy link
Author

@PalumboN @fdodino
Creo que encontré el problema con el error 2 del "shouldMatchSuperclassReturnValue", pero tampoco la tengo tan clara asi que es para agarrar con pinzas, me parece que el Validator solamente esta viendo que la ultima sentencia del metodo sea un return, tanto en el metodo que se le hizo override como el de la superclase:

image
esto es en otro repo igual, en:
https://github.com/uqbar-project/wollok-ts/blob/6e7e0321540af7b25daee405d4df1eb81d9d29d8/src/validator/index.ts#L216-L223

Entonces el metodo con override no podria estar compuesto solamente por una sentencia if - else, ya que tomaria como ultima sentencia el else , necesita que esté el return por fuera

Aca se puede ver la diferencia y como en un caso tira error y en el otro no:

image

@NicolasKalaydjian
Copy link
Author

Respecto del error 1 (del shouldUseOverrideKeyword), logré aislarlo y esta bien que salga el error, era por tener un const property peso teniendo en la superclase un metodo que tambien se llama peso() . La cosa es que el error sale en la primer linea del código independientemente de que haya ahí, cuando debería salir en la linea del const property peso (tal vez con una descripcion diferente), de hecho tuve que andar sacando y poniendo codigo para ver que era lo que lo hacia saltar. Lo que se ve en la foto es el único codigo que dejé en el archivo.

Con error
image
Sin error
image
Linter:
image

@PalumboN
Copy link
Contributor

Buenísima la investigación @NicolasKalaydjian ! 🚀

Abrí 2 issues en TS:
uqbar-project/wollok-ts#264
uqbar-project/wollok-ts#265

Si querés encarar alguno te podemos dar una mano, cualquier cosa consultanos (por el issue correspondiente o por Discord).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working component: linter Linter / Validator reporter
Projects
None yet
Development

No branches or pull requests

2 participants