Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » How to infer Java enum
How to infer Java enum [message #773874] Mon, 02 January 2012 14:22 Go to next message
Nicolas Guillot is currently offline Nicolas Guillot
Messages: 3
Registered: January 2012
Junior Member
Hello deer readers, I follow the xtext tutorial "Five simple steps to your JVM language" successfully but I failed to extends it to Java enumeration inference.

My grammar contains the following elements:
Enum:
	'enum' name=ValidID
	'{'
		literals+=(EnumLitteral)*
	'}'
;

EnumLitteral:
	name=ID (':' value=EnumValue)?
;

EnumValue:
	(STRING | INT | (INT '.' INT))
;


And the mapping file contains:
  def dispatch void infer(Enum element, 
                IAcceptor<JvmDeclaredType> acceptor, 
                boolean isPrelinkingPhase) {
                	//TODO
    acceptor.accept(element.toEnumerationType(element.name) [
      documentation = element.documentation
      for (literal : element.literals) {
      	val jvmLiteral = typesFactory.createJvmEnumerationLiteral
		jvmLiteral.simpleName = literal.name
		jvmLiteral.visibility = JvmVisibility::PUBLIC
		jvmLiteral.^static = true
		var t1 = typesFactory.createJvmParameterizedTypeReference
		t1.type = it
		jvmLiteral.type = t1
		literals +=	jvmLiteral
      }
    ])
  }


But when I try the editor, I have the following exception:
1    [Thread-1] ERROR org.eclipse.xtext.ui.editor.CompoundXtextEditorCallback  - Was configured with another client or not configured at all.
java.lang.IllegalStateException: Was configured with another client or not configured at all.
	at org.eclipse.xtext.ui.editor.DirtyStateEditorSupport.removeDirtyStateSupport(DirtyStateEditorSupport.java:336)
	at org.eclipse.xtext.ui.editor.AbstractDirtyStateAwareEditorCallback.beforeDispose(AbstractDirtyStateAwareEditorCallback.java:38)
	at org.eclipse.xtext.ui.editor.CompoundXtextEditorCallback.beforeDispose(CompoundXtextEditorCallback.java:69)
	at org.eclipse.xtext.ui.editor.XtextEditor.dispose(XtextEditor.java:501)


Anyone have an idea?
Re: How to infer Java enum [message #774091 is a reply to message #773874] Tue, 03 January 2012 03:41 Go to previous messageGo to next message
Sebastian Zarnekow is currently offline Sebastian Zarnekow
Messages: 2788
Registered: July 2009
Senior Member
Nicolas,

Is there anything else in the logs. The given exception trace indicates
a follow up problem.

Best regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com

Am 02.01.12 20:22, schrieb Nicolas Guillot:
> Hello deer readers, I follow the xtext tutorial "Five simple steps to
> your JVM language" successfully but I failed to extends it to Java
> enumeration inference.
>
> My grammar contains the following elements:
>
> Enum:
> 'enum' name=ValidID
> '{'
> literals+=(EnumLitteral)*
> '}'
> ;
>
> EnumLitteral:
> name=ID (':' value=EnumValue)?
> ;
>
> EnumValue:
> (STRING | INT | (INT '.' INT))
> ;
>
>
> And the mapping file contains:
>
> def dispatch void infer(Enum element, IAcceptor<JvmDeclaredType>
> acceptor, boolean isPrelinkingPhase) {
> //TODO
> acceptor.accept(element.toEnumerationType(element.name) [
> documentation = element.documentation
> for (literal : element.literals) {
> val jvmLiteral = typesFactory.createJvmEnumerationLiteral
> jvmLiteral.simpleName = literal.name
> jvmLiteral.visibility = JvmVisibility::PUBLIC
> jvmLiteral.^static = true
> var t1 = typesFactory.createJvmParameterizedTypeReference
> t1.type = it
> jvmLiteral.type = t1
> literals += jvmLiteral
> }
> ])
> }
>
>
> But when I try the editor, I have the following exception:
>
> 1 [Thread-1] ERROR
> org.eclipse.xtext.ui.editor.CompoundXtextEditorCallback - Was configured
> with another client or not configured at all.
> java.lang.IllegalStateException: Was configured with another client or
> not configured at all.
> at
> org.eclipse.xtext.ui.editor.DirtyStateEditorSupport.removeDirtyStateSupport(DirtyStateEditorSupport.java:336)
>
> at
> org.eclipse.xtext.ui.editor.AbstractDirtyStateAwareEditorCallback.beforeDispose(AbstractDirtyStateAwareEditorCallback.java:38)
>
> at
> org.eclipse.xtext.ui.editor.CompoundXtextEditorCallback.beforeDispose(CompoundXtextEditorCallback.java:69)
>
> at org.eclipse.xtext.ui.editor.XtextEditor.dispose(XtextEditor.java:501)
>
>
> Anyone have an idea?
Re: How to infer Java enum [message #774341 is a reply to message #774091] Tue, 03 January 2012 13:32 Go to previous messageGo to next message
Nicolas Guillot is currently offline Nicolas Guillot
Messages: 3
Registered: January 2012
Junior Member
Thanks for your interest and reply, when I create the following dsl in the editor:
ns test {
	enum aaa {
		a: "a"		
	}
}


I get the stack trace:
75260 [Worker-4] ERROR org.eclipse.xtext.builder.impl.XtextBuilder  - 
java.lang.UnsupportedOperationException
	at org.eclipse.emf.common.util.DelegatingEList$UnmodifiableEList.add(DelegatingEList.java:861)
	at org.eclipse.xtext.xbase.lib.CollectionExtensions.operator_add(CollectionExtensions.java:46)
	at org.xtext.jvmmodel.ApplicationJvmModelInferrer$2.apply(ApplicationJvmModelInferrer.java:144)
	at org.xtext.jvmmodel.ApplicationJvmModelInferrer$2.apply(ApplicationJvmModelInferrer.java:1)
	at org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder.toEnumerationType(JvmTypesBuilder.java:262)
	at org.xtext.jvmmodel.ApplicationJvmModelInferrer._infer(ApplicationJvmModelInferrer.java:150)
	at org.xtext.jvmmodel.ApplicationJvmModelInferrer.infer(ApplicationJvmModelInferrer.java:158)
	at org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer._infer(AbstractModelInferrer.java:27)
	at org.xtext.jvmmodel.ApplicationJvmModelInferrer.infer(ApplicationJvmModelInferrer.java:160)
	at org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer._infer(AbstractModelInferrer.java:27)
	at org.xtext.jvmmodel.ApplicationJvmModelInferrer.infer(ApplicationJvmModelInferrer.java:160)
	at org.eclipse.xtext.xbase.jvmmodel.JvmModelAssociator.installDerivedState(JvmModelAssociator.java:203)
	at org.eclipse.xtext.resource.DerivedStateAwareResource.installDerivedState(DerivedStateAwareResource.java:125)
	at org.eclipse.xtext.resource.DerivedStateAwareResourceDescriptionManager.internalGetResourceDescription(DerivedStateAwareResourceDescriptionManager.java:40)
	at org.eclipse.xtext.resource.impl.DefaultResourceDescriptionManager$1.get(DefaultResourceDescriptionManager.java:60)
	at org.eclipse.xtext.resource.impl.DefaultResourceDescriptionManager$1.get(DefaultResourceDescriptionManager.java:1)
	at org.eclipse.xtext.util.OnChangeEvictingCache.get(OnChangeEvictingCache.java:72)
	at org.eclipse.xtext.resource.impl.DefaultResourceDescriptionManager.getResourceDescription(DefaultResourceDescriptionManager.java:58)
	at org.eclipse.xtext.builder.clustering.ClusteringBuilderState.writeNewResourceDescriptions(ClusteringBuilderState.java:334)
	at org.eclipse.xtext.builder.clustering.ClusteringBuilderState.doUpdate(ClusteringBuilderState.java:118)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.update(AbstractBuilderState.java:107)
	at org.eclipse.xtext.builder.impl.XtextBuilder.doBuild(XtextBuilder.java:158)
	at org.eclipse.xtext.builder.impl.XtextBuilder.incrementalBuild(XtextBuilder.java:141)
	at org.eclipse.xtext.builder.impl.XtextBuilder.build(XtextBuilder.java:91)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:239)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:292)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:295)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:351)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:374)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:143)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:241)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)


The file "ApplicationJvmModelInferrer.java" corresponds to the xtend file "ApplicationJvmModelInferrer.xtend":
package org.xtext.jvmmodel
 
import com.google.inject.Inject
import org.eclipse.xtext.common.types.JvmDeclaredType
import org.eclipse.xtext.util.IAcceptor
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.common.types.JvmVisibility
import org.xtext.application.*
import org.eclipse.xtext.common.types.TypesFactory

/**
 * <p>Infers a JVM model from the source model.</p> 
 *
 * <p>The JVM model should contain all elements that would appear in the Java code 
 * which is generated from the source model. Other models link against the JVM model rather than the source model.</p>     
 */
class ApplicationJvmModelInferrer extends AbstractModelInferrer {

    /**
     * conveninence API to build and initialize JvmTypes and their members.
     */
	@Inject extension JvmTypesBuilder
	
	@Inject TypesFactory typesFactory

	@Inject extension IQualifiedNameProvider
  
  def dispatch void infer(Entity element, 
                IAcceptor<JvmDeclaredType> acceptor, 
                boolean isPrelinkingPhase) {
    
    acceptor.accept(element.toClass(element.fullyQualifiedName) [
      documentation = element.documentation
      for (feature : element.features) {
        switch feature {
          Property : {
            members += feature.toField(feature.name, feature.type)
            members += feature.toSetter(feature.name, feature.type)
            members += feature.toGetter(feature.name, feature.type)
          }
          Operation : {
            members += feature.toMethod(feature.name, feature.type) [
              for (p : feature.params) {
                parameters += p.toParameter(p.name, p.parameterType)
              }
              documentation = feature.documentation
              body = feature.body
            ]
          }
        }
      }
    ])
  }
  
  def dispatch void infer(Enum element, 
                IAcceptor<JvmDeclaredType> acceptor, 
                boolean isPrelinkingPhase) {
                	//TODO
    acceptor.accept(element.toEnumerationType(element.name) [
      documentation = element.documentation
      for (literal : element.literals) {
      	val jvmLiteral = typesFactory.createJvmEnumerationLiteral
		jvmLiteral.simpleName = literal.name
		jvmLiteral.visibility = JvmVisibility::PUBLIC
		jvmLiteral.^static = true
		var t1 = typesFactory.createJvmParameterizedTypeReference
		t1.type = it
		jvmLiteral.type = t1
		literals +=	jvmLiteral
      }
    ])
  }
  
}


And the generated line (ApplicationJvmModelInferrer.java:144) in error is:
EList<JvmEnumerationLiteral> _literals_1 = it.getLiterals();
CollectionExtensions.<JvmEnumerationLiteral>operator_add(_literals_1, jvmLiteral);


Do you see anything?
Re: How to infer Java enum [message #774629 is a reply to message #774341] Wed, 04 January 2012 05:04 Go to previous messageGo to next message
Sebastian Zarnekow is currently offline Sebastian Zarnekow
Messages: 2788
Registered: July 2009
Senior Member
Hi Nicolas,

JvmEnumerationType#getLiterals is a derived property. Please add the
literals to the #members list of the enumeration type.

Regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com

Am 03.01.12 19:32, schrieb Nicolas Guillot:
> Thanks for your interest and reply, when I create the following dsl in
> the editor:
>
> ns test {
> enum aaa {
> a: "a"
> }
> }
>
>
> I get the stack trace:
>
> 75260 [Worker-4] ERROR org.eclipse.xtext.builder.impl.XtextBuilder -
> java.lang.UnsupportedOperationException
> at
> org.eclipse.emf.common.util.DelegatingEList$UnmodifiableEList.add(DelegatingEList.java:861)
>
> at
> org.eclipse.xtext.xbase.lib.CollectionExtensions.operator_add(CollectionExtensions.java:46)
>
> at
> org.xtext.jvmmodel.ApplicationJvmModelInferrer$2.apply(ApplicationJvmModelInferrer.java:144)
>
> at
> org.xtext.jvmmodel.ApplicationJvmModelInferrer$2.apply(ApplicationJvmModelInferrer.java:1)
>
> at
> org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder.toEnumerationType(JvmTypesBuilder.java:262)
>
> at
> org.xtext.jvmmodel.ApplicationJvmModelInferrer._infer(ApplicationJvmModelInferrer.java:150)
>
> at
> org.xtext.jvmmodel.ApplicationJvmModelInferrer.infer(ApplicationJvmModelInferrer.java:158)
>
> at
> org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer._infer(AbstractModelInferrer.java:27)
>
> at
> org.xtext.jvmmodel.ApplicationJvmModelInferrer.infer(ApplicationJvmModelInferrer.java:160)
>
> at
> org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer._infer(AbstractModelInferrer.java:27)
>
> at
> org.xtext.jvmmodel.ApplicationJvmModelInferrer.infer(ApplicationJvmModelInferrer.java:160)
>
> at
> org.eclipse.xtext.xbase.jvmmodel.JvmModelAssociator.installDerivedState(JvmModelAssociator.java:203)
>
> at
> org.eclipse.xtext.resource.DerivedStateAwareResource.installDerivedState(DerivedStateAwareResource.java:125)
>
> at
> org.eclipse.xtext.resource.DerivedStateAwareResourceDescriptionManager.internalGetResourceDescription(DerivedStateAwareResourceDescriptionManager.java:40)
>
> at
> org.eclipse.xtext.resource.impl.DefaultResourceDescriptionManager$1.get(DefaultResourceDescriptionManager.java:60)
>
> at
> org.eclipse.xtext.resource.impl.DefaultResourceDescriptionManager$1.get(DefaultResourceDescriptionManager.java:1)
>
> at
> org.eclipse.xtext.util.OnChangeEvictingCache.get(OnChangeEvictingCache.java:72)
>
> at
> org.eclipse.xtext.resource.impl.DefaultResourceDescriptionManager.getResourceDescription(DefaultResourceDescriptionManager.java:58)
>
> at
> org.eclipse.xtext.builder.clustering.ClusteringBuilderState.writeNewResourceDescriptions(ClusteringBuilderState.java:334)
>
> at
> org.eclipse.xtext.builder.clustering.ClusteringBuilderState.doUpdate(ClusteringBuilderState.java:118)
>
> at
> org.eclipse.xtext.builder.builderState.AbstractBuilderState.update(AbstractBuilderState.java:107)
>
> at
> org.eclipse.xtext.builder.impl.XtextBuilder.doBuild(XtextBuilder.java:158)
> at
> org.eclipse.xtext.builder.impl.XtextBuilder.incrementalBuild(XtextBuilder.java:141)
>
> at org.eclipse.xtext.builder.impl.XtextBuilder.build(XtextBuilder.java:91)
> at
> org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)
> at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
> at
> org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
>
> at
> org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:239)
>
> at
> org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:292)
> at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
> at
> org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:295)
>
> at
> org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:351)
>
> at
> org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:374)
> at
> org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:143)
>
> at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:241)
> at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
>
>
> The file "ApplicationJvmModelInferrer.java" corresponds to the xtend
> file "ApplicationJvmModelInferrer.xtend":
>
> package org.xtext.jvmmodel
>
> import com.google.inject.Inject
> import org.eclipse.xtext.common.types.JvmDeclaredType
> import org.eclipse.xtext.util.IAcceptor
> import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
> import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
> import org.eclipse.xtext.naming.IQualifiedNameProvider
> import org.eclipse.xtext.common.types.JvmVisibility
> import org.xtext.application.*
> import org.eclipse.xtext.common.types.TypesFactory
>
> /**
> * <p>Infers a JVM model from the source model.</p> *
> * <p>The JVM model should contain all elements that would appear in the
> Java code * which is generated from the source model. Other models link
> against the JVM model rather than the source model.</p> */
> class ApplicationJvmModelInferrer extends AbstractModelInferrer {
>
> /**
> * conveninence API to build and initialize JvmTypes and their members.
> */
> @Inject extension JvmTypesBuilder
>
> @Inject TypesFactory typesFactory
>
> @Inject extension IQualifiedNameProvider
>
> def dispatch void infer(Entity element, IAcceptor<JvmDeclaredType>
> acceptor, boolean isPrelinkingPhase) {
> acceptor.accept(element.toClass(element.fullyQualifiedName) [
> documentation = element.documentation
> for (feature : element.features) {
> switch feature {
> Property : {
> members += feature.toField(feature.name, feature.type)
> members += feature.toSetter(feature.name, feature.type)
> members += feature.toGetter(feature.name, feature.type)
> }
> Operation : {
> members += feature.toMethod(feature.name, feature.type) [
> for (p : feature.params) {
> parameters += p.toParameter(p.name, p.parameterType)
> }
> documentation = feature.documentation
> body = feature.body
> ]
> }
> }
> }
> ])
> }
>
> def dispatch void infer(Enum element, IAcceptor<JvmDeclaredType>
> acceptor, boolean isPrelinkingPhase) {
> //TODO
> acceptor.accept(element.toEnumerationType(element.name) [
> documentation = element.documentation
> for (literal : element.literals) {
> val jvmLiteral = typesFactory.createJvmEnumerationLiteral
> jvmLiteral.simpleName = literal.name
> jvmLiteral.visibility = JvmVisibility::PUBLIC
> jvmLiteral.^static = true
> var t1 = typesFactory.createJvmParameterizedTypeReference
> t1.type = it
> jvmLiteral.type = t1
> literals += jvmLiteral
> }
> ])
> }
>
> }
>
>
> And the generated line (ApplicationJvmModelInferrer.java:144) in error is:
>
> EList<JvmEnumerationLiteral> _literals_1 = it.getLiterals();
> CollectionExtensions.<JvmEnumerationLiteral>operator_add(_literals_1,
> jvmLiteral);
>
>
> Do you see anything?
Re: How to infer Java enum [message #774898 is a reply to message #774091] Wed, 04 January 2012 16:49 Go to previous message
Nicolas Guillot is currently offline Nicolas Guillot
Messages: 3
Registered: January 2012
Junior Member
Thanks a lot, it works!

Previous Topic:Terminals overriding
Next Topic:Content assistant
Goto Forum:
  


Current Time: Mon May 20 09:20:02 EDT 2013

Powered by FUDForum. Page generated in 0.74970 seconds