Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » Could not invoke method: org.eclipse.xtext.xbase.lib.BooleanExtensions.operator_and(boolean,boolean)([Solved] Xtext grammar with xbase extension, XExpressions can not be evaluated)
Could not invoke method: org.eclipse.xtext.xbase.lib.BooleanExtensions.operator_and(boolean,boolean) [message #890495] Fri, 22 June 2012 08:26 Go to next message
masija . is currently offline masija .
Messages: 59
Registered: July 2010
Member
Hi @all,

I am developing a small expression language.
An example could look like this:

Constraint myConstraint{
referenceToAnotherModel modelElement1 && modelElement2
}

For this I map the Object referenceToAnotherModel with the JvmModelInferer to Java, and add a boolean field for each model element.
If I try to interpret the constraints, everything works fine for one model element.
As soon as I use expressions with &&, || or ! I get some java.lang.IllegalStateExceptions. For example "Could not invoke method: org.eclipse.xtext.xbase.lib.BooleanExtensions.operator_and(boolean,boolean) on instance: null" Even if Ijust use !true as an expression.

The project has a reference to the xtext.xbase.lib (2.3) and the xbase examples work just fine...

My first thought was, that my implementation of XbaseInterpreter was wron, but even wehen I remove it, and just use the standard interpreter, these errors occur.

If you have any help for me, I would be very grateful Wink

Best regards,
masija

[Updated on: Mon, 25 June 2012 05:12]

Report message to a moderator

Re: Could not invoke method: org.eclipse.xtext.xbase.lib.BooleanExtensions.operator_and(boolean,bool [message #890690 is a reply to message #890495] Fri, 22 June 2012 17:02 Go to previous messageGo to next message
Jan Kohnlein is currently offline Jan Kohnlein
Messages: 570
Registered: July 2009
Senior Member
Have you overwritten any rules from the Xbase grammar?

Am 22.06.12 14:26, schrieb masija .:
> Hi @all,
>
> I am developing a small expression language.
> An example could look like this:
>
> Constraint myConstraint{
> referenceToAnotherModel modelElement1 && modelElement2
> }
>
> For this I map the Object referenceToAnotherModel with the
> JvmModelInferer to Java, and add a boolean field for each model element.
> If I try to interpret the constraints, everything works fine for one
> model element.
> As soon as I use expressions with &&, || or ! I get some
> java.lang.IllegalStateExceptions. For example "Could not invoke method:
> org.eclipse.xtext.xbase.lib.BooleanExtensions.operator_and(boolean,boolean)
> on instance: null" Even if Ijust use !true as an expression.
>
> The project has a reference to the xtext.xbase.lib (2.3) and the xbase
> examples work just fine...
>
> My first thought was, that my implementation of XbaseInterpreter was
> wron, but even wehen I remove it, and just use the standard interpreter,
> these errors occur.
>
> If you have any help for me, I would be very grateful ;)
>
> Best regards,
> masija


--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com
Re: Could not invoke method: org.eclipse.xtext.xbase.lib.BooleanExtensions.operator_and(boolean,bool [message #890871 is a reply to message #890690] Sat, 23 June 2012 05:31 Go to previous messageGo to next message
masija . is currently offline masija .
Messages: 59
Registered: July 2010
Member
Hi Jan, first of all, thanks for your reply, but no I haven't overwritten rules from the xbase grammar...
My grammar looks like this:



grammar my.grammar.Grammar  with	org.eclipse.xtext.xbase.Xbase

generate grammar "http://myGrammar/Grammar"

"uri.of.the.referenced.Model.ecore" as otherModel
Model:
	imports+=Import+
	constraint+=Constraint+
	;
Constraint:
	'constraint' name=ID '{'
	ref=[otherModel::Entity|FQN]
	query=XExpression 
	'}'
	;

Import:
	'import' importedNamespace=FqnWithWildCard;

FqnWithWildCard:
	FQN ('.*')?;

FQN:
	ID ('.' ID)*;
	

So far, i created a JvmModelInferer which maps the imported entities model elements to boolean fields.

def dispatch void infer(Constraint element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
	   		
	   		if(element.ref != null	)
	   			if(element.ref.eIsProxy) {
	   				EcoreUtil::resolve(element.ref,element.eResource.resourceSet)
	   				element.eResource.resourceSet.getResource(EcoreUtil::getURI(element.ref).trimFragment,true)
	   				EcoreUtil::resolve(element.ref,element.eResource.resourceSet)
	   			}
	   		
	   			
	   			
		   		acceptor.accept(element.ref.toClass(element.ref.id)).initializeLater([
		   			    
		   			var f = element.ref.root.toField(element.ref.root.id,element.ref.root.newTypeRef(Boolean::TYPE))
		   			f.setVisibility(JvmVisibility::PUBLIC)
		   			members += f
		   			for (group: element.ref.root.children){
		   				for( feature: group.features ) {
		   					 var cf = feature.toField(feature.id,feature.newTypeRef(Boolean::TYPE))
		   					 cf.setVisibility(JvmVisibility::PUBLIC)
		   				         members += cf
		   					
							if (!feature.children.empty){
								members+= addChildFeaturesAsMembers(feature, members)
							}
							
		   			}
		   				
		   					   			
		   			members+=element.toMethod("checkConstraint",element.newTypeRef(Boolean::TYPE)) [
		   				body = element.query
		   			]
		   			])
   			}
}
   		
def EList<JvmMember> addChildFeaturesAsMembers(Feature feature, EList<JvmMember> members){
	        	val groups = feature.children
	      		var counter = 0
	       
			while (counter <  groups.size){
			
				for (childFeature: groups.get(counter).features){
					var cf = childFeature.toField(childFeature.id,childFeature.newTypeRef(Boolean::TYPE))
		   			cf.setVisibility(JvmVisibility::PUBLIC)
		   			members += cf
				
					if (!childFeature.children.empty){
						members+= addChildFeaturesAsMembers(childFeature, members)
					}
				}
			counter = counter+1
				
			}
					
			return members	
			
   			
} 


After that I created a an IdentifiableSimpleNameProvider

public class MyGrammarIdentifiableSimpleNameProvider  extends
		IdentifiableSimpleNameProvider {

	
	
	@Override
	public String getSimpleName(JvmIdentifiableElement element) {
		if (element instanceof JvmGenericType)
			return "this";
		return super.getSimpleName(element);
	}
}


and an interpreter which overrides the method featureCallField and returns basically true or false, dependent on some other models content... here is a simplified version

public class MyGrammarInterpreter extends XbaseInterpreter {

	@Inject
	private IJvmModelAssociations jvmModelAssociator;

	@Override
	protected Object featureCallField(JvmField jvmField, Object receiver) {
		
		if(receiver instanceof Entity) {
			
			return true	
		}
		return super.featureCallField(jvmField, receiver);
	}	

}


The interpreter and the name provider were both bound in the runtime module... Perhaps this information provides some valuable insight to understand my problem Wink

[Updated on: Sat, 23 June 2012 09:25]

Report message to a moderator

Re: Could not invoke method: org.eclipse.xtext.xbase.lib.BooleanExtensions.operator_and(boolean,bool [message #891568 is a reply to message #890871] Mon, 25 June 2012 05:11 Go to previous message
masija . is currently offline masija .
Messages: 59
Registered: July 2010
Member
Hi @ all,

thanks to the help of Sven Efftinge, the problem is solved now...
The default class loader doesnn't have xbase.lib on the classpath. So the solution to my problem was, to bind a classloader in the UIModule.


	public java.lang.ClassLoader bindClassLoaderToInstance() {
return getClass().getClassLoader();
}


After that, the expressions can be evaluated, so thanks to Sven for his help Wink

Best regards
Masija

[Updated on: Mon, 25 June 2012 05:29]

Report message to a moderator

Previous Topic:Inconsistent JVM type fragments
Next Topic:Xtext mwe workflow fails - sometimes
Goto Forum:
  


Current Time: Tue May 21 22:35:48 EDT 2013

Powered by FUDForum. Page generated in 0.02133 seconds