eclipse-xtext / eclipse-xtext/xtext
EObjectAtOffsetHelper throws NPE with Fragments and AST rewrite
Open
@szarnekow is already working on this.
Since Feb 12, 2019.
- Dominant language
- Java
- Stars
- 831
- Forks
- 330
- Avg merge
- 3d 7h
- Merged PRs (30d)
- 12
Description
we have the following grammar
Model:
elements+=Element*
;
Call:
"call" name=ID
;
Element:
Call | OtherCall
;
// if i replace this with v1=ID "=" v2=ID it works
CallParameter returns Expression:
PathExpression (
{Assignment.assignee=current} '='
value=ID
)
;
PathExpression:
path=ID
;
OtherCall:
{OtherCall}
'other' SomeDefinition;
fragment SomeDefinition returns Definition:
simpleName=ID
'{'
(parameters+=CallParameter ';')*
( 'target' '='
( targets+=[Call]
) ';'
(parameters+=CallParameter ';')*
)
'}'
;
the following unit test show the bad behavior of EObjectAtOffsetHelper
@ExtendWith(InjectionExtension)
@InjectWith(MyDslInjectorProvider)
class MyDslParsingTest {
@Inject
ParseHelper<Model> parseHelper
@Inject
EObjectAtOffsetHelper objectAtOffsetHelper
@Test
def void loadModel() {
val model = '''
call Call1
call Call2
other Other1 {
x=y;
target=Call1;
}
'''
val result = parseHelper.parse(model)
Assertions.assertNotNull(result)
val errors = result.eResource.errors
Assertions.assertTrue(errors.isEmpty, '''Unexpected errors: ?errors.join(", ")?''')
val index = model.lastIndexOf("Call1")
val o = objectAtOffsetHelper.resolveCrossReferencedElementAt(result.eResource as XtextResource, index+1)
println(o)
// should return Call1
// throws NPE
}
}
java.lang.NullPointerException
at org.eclipse.xtext.resource.EObjectAtOffsetHelper.resolveCrossReferencedElement(EObjectAtOffsetHelper.java:139)
at org.eclipse.xtext.resource.EObjectAtOffsetHelper.getCrossReferencedElement(EObjectAtOffsetHelper.java:84)
at org.eclipse.xtext.resource.EObjectAtOffsetHelper.resolveCrossReferencedElementAt(EObjectAtOffsetHelper.java:53)
at org.xtext.example.mydsl2.tests.MyDslParsingTest.loadModel(MyDslParsingTest.java:62)
workaround:
inline the fragment
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.