Closed lspigariol closed 7 years ago
El error es aleatorio, Recién estuve jugando a hacer lo mismo y no se produjo el error.
Fijate cuando pase si copiás el stack trace completo que se ve en la ventana Log de Errores
o algo así (no se muy bien cómo se llama en español)
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
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...
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.
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)
Volvio a aparecer esta molesta ventana es similar al #1083 pero con otra causa
pude detectar qué es lo que lo genera
al hacer
se detecta el error Multiple markers at this line
pero al hacer
no informa error y al guardar salta la ventanita.