Xbase Interpreter: не удалось получить доступ к полю в экземпляре: null - PullRequest
0 голосов
/ 31 января 2019

Я проверяю идею сделать мой dsl Jvm-совместимым, и я хотел проверить возможность расширения Xbase и использования интерпретатора.Я попытался создать минимальный тестовый проект для использования с интерпретатором, но получаю ошибку во время выполнения.Я думаю, что понимаю общие концепции адаптации Xbase, но не уверен насчет того, как настройки / точки входа для интерпретатора, и не смог найти какую-либо информацию относительно ошибки, которую я получаю, или как ее устранить.Вот соответствующие файлы для моей ситуации:

Text.xtext:

import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase
import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types

Program returns Program:
    {Program}
    'program' name=ID '{'
    variables=Var_Section?
    run=XExpression?
    '}'
;

Var_Section returns VarSection:
    {VarSection}
    'variables' '{'
        decls+=XVariableDeclaration+
    '}'
;


@Override // Change syntax
XVariableDeclaration returns xbase::XVariableDeclaration:
    type=JvmTypeReference name=ID '=' right=XLiteral ';'
;
@Override // Do not allow declarations outside of variable region
XExpressionOrVarDeclaration returns xbase::XExpression:
    XExpression;

TestJvmModelInferrer:

def dispatch void infer(Program element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
        acceptor.accept(element.toClass(element.fullyQualifiedName)) [
            documentation = element.documentation
            if (element.variables !== null) {
                for (decl : element.variables.decls) {
                    members += decl.toField(decl.name, decl.type) [
                        static = true
                        initializer = decl.right
                        visibility = JvmVisibility.PUBLIC
                    ]
                }
            }

            if (element.run !== null) {
                members += element.run.toMethod('main', typeRef(Void::TYPE)) [
                    parameters += element.run.toParameter("args", typeRef(String).addArrayTypeDimension)
                    visibility = JvmVisibility.PUBLIC
                    static = true
                    body = element.run
                ]
            }
        ]
    }

Контрольный пример:

@Inject ParseHelper<Program> parseHelper
@Inject extension ValidationTestHelper
@Inject XbaseInterpreter interpreter
@Test
    def void basicInterpret() {
        val result = parseHelper.parse('''
        program program1 {
            variables {
                int var1 = 0;
                double var2 = 3.4;
            }
            var1 = 13
        }
        ''')
        result.assertNoErrors
        var interpretResult = interpreter.evaluate(result.run)
        println(interpretResult.result)

Частичная трассировка стека:

java.lang.IllegalStateException: Could not access field: program1.var1 on instance: null
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._assignValueTo(XbaseInterpreter.java:1262)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.assignValueTo(XbaseInterpreter.java:1221)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:1213)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:216)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:190)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:180)

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Вас может заинтересовать этот проект, в котором (помимо прочего) реализован интерпретатор для Xtend на основе интерпретатора Xbase.Это может быть немного устаревшим, и также не будет полностью поддерживать все концепции Xtend.Но это может быть отправной точкой, и ваши пожелания приветствуются: -)

https://github.com/kbirken/xtendency

0 голосов
/ 31 января 2019

Интерпретатор поддерживает только выражения, но не работает с типами, созданными JvmModelInferrer.Ваш код пытается работать с полями такого предполагаемого типа.

Вместо того, чтобы использовать интерпретатор, я бы рекомендовал использовать InMemoryCompiler в своем тесте.Примером доменной модели может служить вдохновение: https://github.com/eclipse/xtext-eclipse/blob/c2b15c3ec118c4c200e2b28ea72d8c9116fb6800/org.eclipse.xtext.xtext.ui.examples/projects/domainmodel/org.eclipse.xtext.example.domainmodel.tests/xtend-gen/org/eclipse/xtext/example/domainmodel/tests/XbaseIntegrationTest.java

...