Inject xbasecompiler [message #1698432] |
Mon, 15 June 2015 12:30  |
Eclipse User |
|
|
|
I have a set of languages implemented with xtext. These languages also common aspects that are defined in a shared xtext language. The common language uses xbase to define variable and expression.
Then, in one language, I would like to process and compile the xbase variable and expression. The language itself does not use xbase directly but uses it through the common language.
When trying to use the XbaseCompiler, I then added a dependency with an injection like this (as defined in [1]):
@Inject XbaseCompiler xbaseCompiler
However, when starting my project, I got a long serie of exception (see below). How to know how to inject the appropriate class? And how to debug injected classes?
Thanks for any help or suggestion!
[1] http://www.rcp-vision.com/1796/xtext-2-1-using-xbase-variables/ and http://www.rcp-vision.com/1640/xtext-2-1-using-xbase-expressions/
Caused by: com.google.inject.internal.util.$ComputationException: com.google.inject.internal.util.$ComputationException: java.lang.StackOverflowError
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553)
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419)
at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
at com.google.inject.internal.FailableCache.get(FailableCache.java:50)
at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49)
at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:125)
at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:521)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
at com.google.inject.internal.InjectorImpl.createImplementedByBinding(InjectorImpl.java:732)
at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:618)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
at com.google.inject.internal.SingleFieldInjector.<init>(SingleFieldInjector.java:41)
at com.google.inject.internal.MembersInjectorStore.getInjectors(MembersInjectorStore.java:125)
at com.google.inject.internal.MembersInjectorStore.createWithListeners(MembersInjectorStore.java:95)
at com.google.inject.internal.MembersInjectorStore.access$000(MembersInjectorStore.java:34)
at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:42)
at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:39)
at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:39)
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549)
... 6559 more
Caused by: com.google.inject.internal.util.$ComputationException: java.lang.StackOverflowError
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553)
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419)
at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
at com.google.inject.internal.FailableCache.get(FailableCache.java:50)
at com.google.inject.internal.MembersInjectorStore.get(MembersInjectorStore.java:65)
at com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:73)
at com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:28)
at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:36)
at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:32)
at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:39)
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549)
... 6584 more
Caused by: java.lang.StackOverflowError
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.defineClass(ModuleClassLoader.java:272)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.defineClass(ClasspathManager.java:632)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findClassImpl(ClasspathManager.java:588)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClassImpl(ClasspathManager.java:540)
at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:527)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:324)
at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:320)
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:395)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:345)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:337)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:160)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:551)
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419)
at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
at com.google.inject.internal.FailableCache.get(FailableCache.java:50)
at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49)
at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:125)
at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:521)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
at com.google.inject.internal.SingleFieldInjector.<init>(SingleFieldInjector.java:41)
at com.google.inject.internal.MembersInjectorStore.getInjectors(MembersInjectorStore.java:125)
at com.google.inject.internal.MembersInjectorStore.createWithListeners(MembersInjectorStore.java:95)
at com.google.inject.internal.MembersInjectorStore.access$000(MembersInjectorStore.java:34)
at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:42)
at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:39)
at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:39)
at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549)
... 6594 more
|
|
|
|
|
Re: Inject xbasecompiler [message #1698468 is a reply to message #1698432] |
Mon, 15 June 2015 15:48   |
Eclipse User |
|
|
|
On 15/06/2015 18:30, Julien Delange wrote:
> I have a set of languages implemented with xtext. These languages also
> common aspects that are defined in a shared xtext language. The common
> language uses xbase to define variable and expression.
>
> Then, in one language, I would like to process and compile the xbase
> variable and expression. The language itself does not use xbase directly
> but uses it through the common language.
>
> When trying to use the XbaseCompiler, I then added a dependency with an
> injection like this (as defined in [1]):
>
> @Inject XbaseCompiler xbaseCompiler
>
> However, when starting my project, I got a long serie of exception (see
> below). How to know how to inject the appropriate class? And how to
> debug injected classes?
>
> Thanks for any help or suggestion!
>
> [1] http://www.rcp-vision.com/1796/xtext-2-1-using-xbase-variables/ and
> http://www.rcp-vision.com/1640/xtext-2-1-using-xbase-expressions/
>
Hi Julien
those blog posts I wrote are rather old now, and won't work anymore: you
should really use a JvmModelInferrer if you use Xbase :)
cheers
Lorenzo
--
Lorenzo Bettini, PhD in Computer Science, DI, Univ. Torino
HOME: http://www.lorenzobettini.it
Xtext Book:
http://www.packtpub.com/implementing-domain-specific-languages-with-xtext-and-xtend/book
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Re: Inject xbasecompiler [message #1698623 is a reply to message #1698619] |
Tue, 16 June 2015 13:54   |
Eclipse User |
|
|
|
Sure! Thanks for your help! I modified the domainmodel as follows:
grammar org.eclipse.xtext.example.domainmodel.Domainmodel with org.eclipse.xtext.xbase.Xbase
generate domainmodel "http://www.xtext.org/example/Domainmodel"
DomainModel:
importSection=XImportSection?
elements+=AbstractElement*;
AbstractElement:
PackageDeclaration | Entity;
PackageDeclaration:
'package' name=QualifiedName '{'
elements+=AbstractElement*
'}';
Entity:
'entity' name=ValidID ('extends' superType=JvmParameterizedTypeReference)? '{'
('features'
features+=Feature*)?
('vars'
vars+=XVariableDeclaration*)?
'}';
Feature:
Property | Operation ;
Property:
name=ValidID ':' type=JvmTypeReference;
Operation:
'op' name=ValidID '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' (':' type=JvmTypeReference)?
body=XBlockExpression;
Now, I have the following code
package blabla
{
entity foo
{
features
myprop : int
op op1 (int param1, int param2) : int
{
return param1;
}
vars
val implicit1 = 4
val implicit2 = 5
val float explicit = 5.0
val Integer integerObject = new Integer(5)
val foobar = implicit1 + implicit2
}
}
With that, I have two goals:
1. Detect the type of variables that are not strongly types but have an expression. For example, for implicit1, return int
2. Compiles the expression. For example, for foobar, having something that returns 9 directly
So, I tried to dig the documentation but it seems that some of it is outdated, so, having some pointers on where I should look into will definitively help!
Thanks!
Julien.
|
|
|
|
|
|
|
|
|
|
|
|
Re: Inject xbasecompiler [message #1698643 is a reply to message #1698639] |
Tue, 16 June 2015 17:26   |
Eclipse User |
|
|
|
hi,
still, if you do not use jvmmodel inferrer there will be no type calculation ?!? (XbaseTypeComputer will never be called by LogicalContainerAwareReentrantTypeResolver, variables will not be visible from each other)
thus i strictly recommend you to use that. e.g. as i proposed it.
or something like that
Entity:
'entity' name=ValidID ('extends' superType=JvmParameterizedTypeReference)? '{'
('features'
features+=Feature*)?
(vars=Vars)?
'}';
Vars returns xbase::XBlockExpression:
{Vars}'vars'
expressions+=XVariableDeclaration*
;
if (entity.vars != null) {
members+=entity.toMethod("vars", Void.TYPE.typeRef()) [
body = entity.vars
]
}
still, compile and interpret is not the same at all ?!?
class ProcessLogicDefault implements IProcessLogic
{
@Inject extension JvmTypesBuilder
@Inject extension IQualifiedNameProvider
@Inject XbaseInterpreter interpreter
override process(PackageDeclaration pkg) {
println ("package" + pkg)
pkg.elements.filter(Entity).forEach[e | processEntity (e)]
}
def processEntity(Entity entity) {
val ctx = new DefaultEvaluationContext()
entity.vars.expressions.filter(XVariableDeclaration).forEach[v | processVar(v, ctx)]
}
def processVar(XVariableDeclaration v, IEvaluationContext ctx) {
try {
val IEvaluationResult r = interpreter.evaluate(v, ctx, CancelIndicator.NullImpl)
println(v.name + " = " + ctx.getValue(QualifiedName.create(v.name)))
} catch(Exception e) {
e.printStackTrace
}
}
}
|
|
|
|
Powered by
FUDForum. Page generated in 0.05938 seconds