Bug 502138 - argument type mismatch due to incorrect evaluation context of parameters in nested calls with java service wrappers
Summary: argument type mismatch due to incorrect evaluation context of parameters in n...
Status: RESOLVED FIXED
Alias: None
Product: Acceleo
Classification: Modeling
Component: Core (show other bugs)
Version: 3.6.0   Edit
Hardware: PC Windows All
: P3 major
Target Milestone: ---   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-09-26 05:56 EDT by Alexander Fuchs CLA
Modified: 2016-10-26 10:58 EDT (History)
0 users

See Also:


Attachments
Condensed example of the bug, includes generation and model project. (27.77 KB, application/x-zip-compressed)
2016-09-26 05:56 EDT, Alexander Fuchs CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Alexander Fuchs CLA 2016-09-26 05:56:58 EDT
Created attachment 264409 [details]
Condensed example of the bug, includes generation and model project.

Hi,

we are considering upgrading from Eclipse Luna 3.5 with Acceleo to Eclipse Modelling Neon 4.6.0 with Acceleo 3.6.4.201605040614.
Unfortunately, we hit on a bug as exposed in the attached condensed example.

In short:
- the evaluation of parameters of nested calls seems to be broken when using java service wrappers

- the attached example boils down do:

[query public combine(arg0 : String, arg1 : String) : String
  = invoke('org.eclipse.acceleo.sample.generator.services.DemoUtils', 'combine(java.lang.String, java.lang.String)', Sequence{arg0, arg1})
/]

[query private doNothingWithMtl(model : Model) : String = 'secondArgument' /]

[template public generateAll(model : Model)]
[comment @main/]
[file ('output.txt', false)]
[comment type mismatch when calling java function combine. /]
[combine('firstArgument', doNothingWithMtl(model))/]
[/file]
[/template]

- during evaluation temporaryInvocationVariable$0 is stored twice in the AcceleoEvaluationEnvironment.globalVariableMap:
  - once for 'firstArgument'
  - once for model

- when calling the java service wrappers function combine the wrong argument is taken from the map: model instead of 'firstArgument'

- this results in the error message:

org.eclipse.acceleo.engine.AcceleoEvaluationException: argument type mismatch


This behaviour prevents us from upgrading. I hope it will be fixed, or that a work-around is available.

Best,
	Alexander Fuchs
	
Installation of the example:
- extract
- import the two contained projects into a new eclipse workspace
- open acceleo perspective
- create a launch configuration with:
  Project = Generators
  Main class = org.eclipse.acceleo.sample.generator.main.Main
  Model = /Model/model.uml
  Target = /Generators
- run launch configuration

- complete call stack:
org.eclipse.acceleo.engine.AcceleoEvaluationException: argument type mismatch
	at org.eclipse.acceleo.engine.internal.environment.AcceleoLibraryOperationVisitor.invoke(AcceleoLibraryOperationVisitor.java:1218)
	at org.eclipse.acceleo.engine.internal.environment.AcceleoLibraryOperationVisitor.callNonStandardOperation(AcceleoLibraryOperationVisitor.java:136)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.visitOperationCallExp(AcceleoEvaluationVisitor.java:1220)
	at org.eclipse.ocl.ecore.impl.OperationCallExpImpl.accept(OperationCallExpImpl.java:386)
	at org.eclipse.ocl.AbstractEvaluationVisitor.visitExpression(AbstractEvaluationVisitor.java:242)
	at org.eclipse.ocl.EvaluationVisitorDecorator.visitExpression(EvaluationVisitorDecorator.java:150)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.switchExpression(AcceleoEvaluationVisitor.java:1965)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.visitExpression(AcceleoEvaluationVisitor.java:1049)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.visitAcceleoQueryInvocation(AcceleoEvaluationVisitor.java:879)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.switchExpression(AcceleoEvaluationVisitor.java:1942)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.visitExpression(AcceleoEvaluationVisitor.java:1049)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.visitAcceleoFileBlock(AcceleoEvaluationVisitor.java:431)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.switchExpression(AcceleoEvaluationVisitor.java:1926)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.visitExpression(AcceleoEvaluationVisitor.java:1049)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.visitAcceleoTemplate(AcceleoEvaluationVisitor.java:921)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.switchExpression(AcceleoEvaluationVisitor.java:1897)
	at org.eclipse.acceleo.engine.internal.evaluation.AcceleoEvaluationVisitor.visitExpression(AcceleoEvaluationVisitor.java:1049)
	at org.eclipse.ocl.internal.evaluation.QueryImpl.evaluate(QueryImpl.java:146)
	at org.eclipse.ocl.ecore.QueryImpl.evaluate(QueryImpl.java:56)
	at org.eclipse.acceleo.engine.generation.AcceleoEngine.doEvaluate(AcceleoEngine.java:365)
	at org.eclipse.acceleo.engine.generation.AcceleoEngine.evaluate(AcceleoEngine.java:142)
	at org.eclipse.acceleo.engine.service.AcceleoService.doGenerateTemplate(AcceleoService.java:984)
	at org.eclipse.acceleo.engine.service.AcceleoService.doGenerate(AcceleoService.java:641)
	at org.eclipse.acceleo.engine.service.AbstractAcceleoGenerator.generate(AbstractAcceleoGenerator.java:209)
	at org.eclipse.acceleo.engine.service.AbstractAcceleoGenerator.generate(AbstractAcceleoGenerator.java:172)
	at org.eclipse.acceleo.engine.service.AbstractAcceleoGenerator.doGenerate(AbstractAcceleoGenerator.java:159)
	at org.eclipse.acceleo.sample.generator.main.Main.doGenerate(Main.java:202)
	at org.eclipse.acceleo.sample.generator.main.Main.main(Main.java:160)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.acceleo.engine.internal.environment.AcceleoLibraryOperationVisitor.invoke(AcceleoLibraryOperationVisitor.java:1197)
	... 27 more
org.eclipse.acceleo.engine.AcceleoEvaluationException: Invalid result for expression self.invoke('org.eclipse.acceleo.sample.generator.services.DemoUtils', 'combine(java.lang.String, java.lang.String)', Sequence {arg0, arg1}) at line 4 in Module DemoUtils for query combine(String,String). Last recorded value of self was org.eclipse.uml2.uml.internal.impl.ModelImpl@5ddea849 (name: demoModel, visibility: <unset>) (URI: null) (viewpoint: <unset>). Problem found while generating the file 'E:\Daten\AcceleoBug\Generators\output.txt'.
	at main.generateAll(Model)(main.mtl:0)
	at main.generateAll(Model)(main.mtl:12)
	at main.generateAll(Model)(main.mtl:10)

	
	
- Call stack after putting both temporaryInvocationVariable$0 into AcceleoEvaluationEnvironment.globalVariableMap:

{temporaryInvocationVariable$0=[firstArgument, org.eclipse.uml2.uml.internal.impl.ModelImpl@2c42b421 (name: VisumNetwork, visibility: <unset>) (URI: null) (viewpoint: <unset>)], context$0=[org.eclipse.uml2.uml.internal.impl.ModelImpl@2c42b421 (name: VisumNetwork, visibility: <unset>) (URI: null) (viewpoint: <unset>)]}

AcceleoEvaluationEnvironment.add(String, Object) line: 230	
EvaluationVisitorImpl(EvaluationVisitorImpl<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>).visitVariable(Variable<C,PM>) line: 2380	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>(EvaluationVisitorDecorator<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>).visitVariable(Variable<C,PM>) line: 334	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.prepareInvocation(QueryInvocation) line: 1756	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.visitAcceleoQueryInvocation(QueryInvocation) line: 848	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.switchExpression(OCLExpression<C>) line: 1942	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.visitExpression(OCLExpression<C>) line: 1049	
QueryInvocationSpec.accept(U) line: 49	
AcceleoEvaluationVisitor$ParameterInitExpression.accept(U) line: 2046	
EvaluationVisitorImpl(AbstractEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>).safeVisitExpression(OCLExpression<C>) line: 569	
EvaluationVisitorImpl(EvaluationVisitorImpl<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>).visitVariable(Variable<C,PM>) line: 2378	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>(EvaluationVisitorDecorator<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>).visitVariable(Variable<C,PM>) line: 334	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.prepareInvocation(QueryInvocation) line: 1756	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.visitAcceleoQueryInvocation(QueryInvocation) line: 848	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.switchExpression(OCLExpression<C>) line: 1942	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.visitExpression(OCLExpression<C>) line: 1049	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.visitAcceleoTemplate(Template) line: 921	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.switchExpression(OCLExpression<C>) line: 1897	
AcceleoEvaluationVisitor<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.visitExpression(OCLExpression<C>) line: 1049	
QueryImpl<PK,C,O,P,EL,PM,S,COA,SSA,CT,CLS,E>.evaluate() line: 146	
QueryImpl.evaluate() line: 56	
AcceleoEngine.doEvaluate(Template, List<Object>) line: 365	
AcceleoEngine.evaluate(Template, List<Object>, File, IAcceleoGenerationStrategy, Monitor) line: 142	
AcceleoService.doGenerateTemplate(Template, List<Object>, File, Monitor) line: 984	
AcceleoService.doGenerate(Module, String, EObject, boolean, List<Object>, File, Monitor) line: 641	
VisionAcceleoGenerator(AbstractAcceleoGenerator).generate(Monitor, boolean) line: 209	
VisionAcceleoGenerator(AbstractAcceleoGenerator).generate(Monitor) line: 172	
VisionAcceleoGenerator(AbstractAcceleoGenerator).doGenerate(Monitor) line: 159	
VisionAcceleoGenerator.doGenerate(Monitor) line: 431	
VisionAcceleoGenerator.doTimedGenerate(Monitor, URI) line: 469	
VisionAcceleoGenerator.generateTarget(String, String, URI) line: 301	
Main.generateNetwork(String) line: 156	
Main.run(String[], String) line: 98	
GenerateAll.main(String[]) line: 7
Comment 1 Alexander Fuchs CLA 2016-10-26 10:58:57 EDT
Fixed with Acceleo 3.6.6, as shiped with Neon 4.6.1.