uqbar-project / wollok

Wollok Programming Language
GNU General Public License v3.0
60 stars 16 forks source link

Error updating text editor (import) #1230

Closed lspigariol closed 7 years ago

lspigariol commented 7 years ago

Volvio a aparecer esta molesta ventana image es similar al #1083 pero con otra causa

pude detectar qué es lo que lo genera

al hacer

import 
class Nada {}

se detecta el error Multiple markers at this line

pero al hacer

import 
describe "nada" {}

no informa error y al guardar salta la ventanita.

fdodino commented 7 years ago

El error es aleatorio, Recién estuve jugando a hacer lo mismo y no se produjo el error.

anim

Fijate cuando pase si copiás el stack trace completo que se ve en la ventana Log de Errores

image

o algo así (no se muy bien cómo se llama en español)

lspigariol commented 7 years ago

el error salta cuando guardas. (en tu videito se ve el * en el nombre del archivo...)

igual, te copio el staktrace de la ventana "anotacion de errores"

org.eclipse.emf.common.util.WrappedException: java.lang.IllegalArgumentException: Segment cannot be null at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:230) at org.eclipse.xtext.linking.lazy.LazyLinkingResource.doResolveLazyCrossReference(LazyLinkingResource.java:189) at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReference(LazyLinkingResource.java:148) at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReferences(LazyLinkingResource.java:134) at org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences(EcoreUtil2.java:498) at org.eclipse.xtext.resource.impl.DefaultResourceDescription.computeReferenceDescriptions(DefaultResourceDescription.java:135) at org.eclipse.xtext.resource.impl.DefaultResourceDescription$2.get(DefaultResourceDescription.java:123) at org.eclipse.xtext.resource.impl.DefaultResourceDescription$2.get(DefaultResourceDescription.java:120) at org.eclipse.xtext.util.OnChangeEvictingCache.get(OnChangeEvictingCache.java:77) at org.eclipse.xtext.resource.impl.DefaultResourceDescription.getReferenceDescriptions(DefaultResourceDescription.java:120) at org.eclipse.xtext.resource.DescriptionUtils.collectOutgoingReferences(DescriptionUtils.java:29) at org.eclipse.xtext.resource.impl.DefaultResourceDescriptionManager.isAffected(DefaultResourceDescriptionManager.java:117) at org.eclipse.xtext.ui.editor.DirtyStateEditorSupport.isReparseRequired(DirtyStateEditorSupport.java:649) at org.eclipse.xtext.ui.editor.DirtyStateEditorSupport$UpdateEditorStateJob$1.exec(DirtyStateEditorSupport.java:161) at org.eclipse.xtext.ui.editor.DirtyStateEditorSupport$UpdateEditorStateJob$1.exec(DirtyStateEditorSupport.java:1) at org.eclipse.xtext.resource.OutdatedStateManager.exec(OutdatedStateManager.java:91) at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.internalReadOnly(XtextDocument.java:520) at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.readOnly(XtextDocument.java:492) at org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:133) at org.eclipse.xtext.ui.editor.DirtyStateEditorSupport$UpdateEditorStateJob.run(DirtyStateEditorSupport.java:146) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) Caused by: java.lang.IllegalArgumentException: Segment cannot be null at org.eclipse.xtext.naming.QualifiedName.append(QualifiedName.java:257) at org.uqbar.project.wollok.scoping.WollokImportedNamespaceAwareLocalScopeProvider$5.apply(WollokImportedNamespaceAwareLocalScopeProvider.java:214) at org.uqbar.project.wollok.scoping.WollokImportedNamespaceAwareLocalScopeProvider$5.apply(WollokImportedNamespaceAwareLocalScopeProvider.java:1) at org.eclipse.xtext.xbase.lib.internal.FunctionDelegate.apply(FunctionDelegate.java:42) at com.google.common.collect.Iterators$8.transform(Iterators.java:794) at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48) at com.google.common.collect.Iterators$5.next(Iterators.java:553) at com.google.common.collect.Iterators$5.next(Iterators.java:553) at com.google.common.collect.Iterators.addAll(Iterators.java:357) at com.google.common.collect.Iterables.addAll(Iterables.java:351) at com.google.common.collect.Sets.newLinkedHashSet(Sets.java:328) at org.eclipse.xtext.xbase.lib.IterableExtensions.toSet(IterableExtensions.java:592) at org.uqbar.project.wollok.scoping.WollokGlobalScopeProvider.objectsFromLocalImport(WollokGlobalScopeProvider.java:140) at org.uqbar.project.wollok.scoping.WollokGlobalScopeProvider.doImportedObjects(WollokGlobalScopeProvider.java:125) at org.uqbar.project.wollok.scoping.WollokGlobalScopeProvider$2.apply(WollokGlobalScopeProvider.java:86) at org.uqbar.project.wollok.scoping.WollokGlobalScopeProvider$2.apply(WollokGlobalScopeProvider.java:1) at org.uqbar.project.wollok.scoping.cache.MapBasedWollokGlobalScopeCache.get(MapBasedWollokGlobalScopeCache.java:25) at org.uqbar.project.wollok.scoping.WollokGlobalScopeProvider.importedObjects(WollokGlobalScopeProvider.java:89) at org.uqbar.project.wollok.scoping.WollokGlobalScopeProvider.getScope(WollokGlobalScopeProvider.java:59) at org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider.getScope(DefaultGlobalScopeProvider.java:61) at org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider.getScope(AbstractGlobalScopeProvider.java:50) at org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider.getGlobalScope(AbstractGlobalScopeDelegatingScopeProvider.java:46) at org.eclipse.xtext.scoping.impl.AbstractGlobalScopeDelegatingScopeProvider.getGlobalScope(AbstractGlobalScopeDelegatingScopeProvider.java:42) at org.uqbar.project.wollok.scoping.WollokImportedNamespaceAwareLocalScopeProvider.getResourceScope(WollokImportedNamespaceAwareLocalScopeProvider.java:66) at org.uqbar.project.wollok.scoping.WollokImportedNamespaceAwareLocalScopeProvider.getScope(WollokImportedNamespaceAwareLocalScopeProvider.java:58) at org.uqbar.project.wollok.scoping.WollokImportedNamespaceAwareLocalScopeProvider.getScope(WollokImportedNamespaceAwareLocalScopeProvider.java:56) at org.uqbar.project.wollok.scoping.WollokImportedNamespaceAwareLocalScopeProvider.getScope(WollokImportedNamespaceAwareLocalScopeProvider.java:56) at org.uqbar.project.wollok.scoping.WollokImportedNamespaceAwareLocalScopeProvider.getScope(WollokImportedNamespaceAwareLocalScopeProvider.java:56) at org.uqbar.project.wollok.scoping.WollokImportedNamespaceAwareLocalScopeProvider.getScope(WollokImportedNamespaceAwareLocalScopeProvider.java:56) at org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.delegateGetScope(AbstractDeclarativeScopeProvider.java:72) at org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.getScope(AbstractDeclarativeScopeProvider.java:104) at org.eclipse.xtext.linking.impl.DefaultLinkingService.getScope(DefaultLinkingService.java:59) at org.eclipse.xtext.linking.impl.DefaultLinkingService.getLinkedObjects(DefaultLinkingService.java:120) at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:247) at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:222) ... 20 more

fdodino commented 7 years ago

Ah, como lo corté para que no dure tanto el video, ahora me agarró la dude de si efectivamente no lo grabé...

Pero buenísimo que tenemos el stack trace, yo recuerdo haber tenido un error parecido haciendo imports vacíos...

fdodino commented 7 years ago

Hola @lspigariol , estuve jugando un poco más y detecté que sí había grabado, pero el problema ocurre cuando vos grabás "rápido". Es decir, si esperás un segundo a que el entorno se actualice, no ocurre ese error. En cambio, si escribís e inmediatamente grabás, hay un problema (imagino de threads concurrentes) que dejan el contexto con un resourceSet en null que causa este inconveniente.

fdodino commented 7 years ago

Paso el mail que mandé a Pablo y Nico:

Descubrí algo de una de las fallas del scope que tira: si escribo

import example.*

y cambio a

import example.pepita

y grabo al toque, estalla el editor (tanto para wko como para clases).

El problema se da acá:

    def objectsFromLocalImport(Resource context, Iterable<String> importsEntry, Iterable<IEObjectDescription> objectsFromManifests){
        synchronized (context) {
            val imports = (importsEntry.map[ #[it]  + localScopeProvider.allRelativeImports(it, context.implicitPackage) ].flatten).toSet

            val resourceSet = context.resourceSet

            val importedObjects = imports.filter[
                                EN ALGUN  MOMENTO ACA
                it !== null && !objectsFromManifests.exists[o| o.matchesImport(it)]
            ]
            .map[ 
                toResource(context)

El error puntual es que el resourceSet del context queda en null. Y eso revienta el toResource posterior. Le tiré un workaround

    def objectsFromLocalImport(Resource context, Iterable<String> importsEntry, Iterable<IEObjectDescription> objectsFromManifests){
        synchronized (context) {
            val imports = (importsEntry.map[ #[it]  + localScopeProvider.allRelativeImports(it, context.implicitPackage) ].flatten).toSet

            val resourceSet = context.resourceSet

            val importedObjects = imports.filter[

                if (context.resourceSet === null) {
                    println("RESOURCE SET ES NULL en objectsFromLocalImport!")
                    context.assign("resourceSet", resourceSet)
                }

                it !== null && !objectsFromManifests.exists[o| o.matchesImport(it)]
            ]
            .map[ 
                toResource(context)

Y con eso falla silenciosamente por atrás, pero compila ok y funciona a los ojos del usuario. Obviamente mi intención no es subir ese código choto, sino ayudar a entender que el problema debe ser de threads concurrentes. Y debe quedar nulo el resourceSet cuando uno escribe "example.pepita", y ahí trata de calcular el highlighting, se activa el Linker, te pide el scope y en el medio grabás y el resourceSet se recalcula para el contexto y se va todo al cuerno.

Porque si escribís "example.pepita" y esperás un segundito a que el entorno lo termine de calcular, ahí anda perfecto. El problema es cuando le das grabar al toque, mientras se está reconfigurando el entorno.

Probé meterle synchronized en los métodos en cuestión (getScope de WollokImportedNamespaceAwareLocalScopeProvider, getResourceScope de la misma clase, e incluso varios métodos de WollokGlobalScopeProvider como el toResource) pero no tuve éxito.

El error silencioso que tira es éste:

java.lang.NullPointerException
    at org.eclipse.xtext.builder.clustering.CurrentDescriptions$ResourceSetAware.getExportedObjects(CurrentDescriptions.java:199)
    at org.eclipse.xtext.resource.impl.ResourceDescriptionsBasedContainer.getExportedObjects(ResourceDescriptionsBasedContainer.java:65)
    at org.eclipse.xtext.resource.containers.StateBasedContainer.getExportedObjects(StateBasedContainer.java:127)
    at org.eclipse.xtext.resource.containers.FilterUriContainer.getExportedObjects(FilterUriContainer.java:69)
    at org.eclipse.xtext.scoping.impl.SelectableBasedScope.getLocalElementsByName(SelectableBasedScope.java:47)
    at org.eclipse.xtext.scoping.impl.AbstractScope.getElements(AbstractScope.java:134)
    at org.eclipse.xtext.scoping.impl.AbstractScope$2.get(AbstractScope.java:142)
    at org.eclipse.xtext.scoping.impl.AbstractScope$2.get(AbstractScope.java:139)
    at org.eclipse.xtext.scoping.impl.AbstractScope$ParentIterable.iterator(AbstractScope.java:60)
    at com.google.common.collect.Iterables$3.transform(Iterables.java:509)
    at com.google.common.collect.Iterables$3.transform(Iterables.java:506)
    at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
    at com.google.common.collect.Iterators$5.hasNext(Iterators.java:543)
    at org.eclipse.xtext.xbase.lib.IteratorExtensions.findFirst(IteratorExtensions.java:100)
    at org.eclipse.xtext.xbase.lib.IterableExtensions.findFirst(IterableExtensions.java:80)
    at org.uqbar.project.wollok.scoping.WollokImportScope.getElements(WollokImportScope.java:94)
    at org.uqbar.project.wollok.scoping.WollokImportScope.getElements(WollokImportScope.java:94)
    at org.uqbar.project.wollok.scoping.WollokImportScope.getElements(WollokImportScope.java:94)
    at org.uqbar.project.wollok.scoping.WollokImportScope.getSingleElement(WollokImportScope.java:122)