| How to infer Java enum [message #773874] |
Mon, 02 January 2012 14:22  |
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 #774341 is a reply to message #774091] |
Tue, 03 January 2012 13:32   |
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   |
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?
|
|
|
|
Powered by
FUDForum. Page generated in 0.74970 seconds