Xtext: не удалось разрешить ссылку на JvmType 'String'

Для нашего главного проекта в университете мы создали несколько DSL с использованием Xtext. Один из DSL - это DSL модельного объекта, который позволяет пользователю создавать класс со свойствами и методами.

Мы повторно используем Xbase, потому что, конечно, мы хотим, чтобы у методов был настоящий язык программирования, не изобретая колесо:

grammar … with org.eclipse.xtext.xbase.Xbase

generate …

EntityModel:
    'package' importedNamespace=QualifiedName
    …
    implementation=Entity;

Entity:
    'entity' name=ValidID '{'
        features+=Feature*
    '}';

Feature:
    LocalVariable | …;

LocalVariable:
    'var' (isStatic?='static')? name=ValidID ':' type=JvmTypeReference;

По какой-то причине, хотя тип LocalVariable установлен в JvmTypeReference, при использовании String (в реальной реализации) он всегда будет отображать ошибку

Xtext: не удалось разрешить ссылку на JvmType 'String'

package com.example
Entity foo {
    var bar: String
}

Мы уже пытались использовать ImportedNamespaceAwareLocalScopeProvider который в getImportedNamespaceResolvers добавляет java.lang.* вот так:

List<ImportNormalizer> implicitImports = super.getImportedNamespaceResolvers(context, ignoreCase);
List<ImportNormalizer> javaLangImports = singletonList(new ImportNormalizer(QualifiedName.create("java", "lang"), true, ignoreCase));
implicitImports.addAll(javaLangImports);
return implicitImports;

Даже если бы этот метод вызывался много раз, импорт все равно не работает. При осмотре EObject context параметр, он иногда возвращает java.lang.String (который, я думаю, для JvmTypeReference но все равно отображается ошибка.

в RuntimeModule новый поставщик области настроен так:

public void configureIScopeProviderDelegate(com.google.inject.Binder binder) {
    binder.bind(org.eclipse.xtext.scoping.IScopeProvider.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(MasterDSLImportedNamespaceAwareLocalScopeProvider.class);
}

в Workflow мы настроили

fragment = scoping.ImportNamespacesScopingFragment {}
fragment = exporting.QualifiedNamesFragment {}
fragment = builder.BuilderIntegrationFragment {}

Остальная часть проекта уже довольно сложна (4 Xtext DSL в одном проекте и несколько генераторов). Но за исключением совершенно разных DSL, они используют почти тот же рабочий процесс и RuntimeModule конфигурации. Другой DSL также использует JvmTypeReference и также не находит, например, логическое или что-то еще.

Вопрос, конечно, в том, что мы делаем что-то не так или нам нужно что-то еще делать. Раньше это работало, когда у нас был значительно меньший проект, но после некоторых серьезных изменений это перестало работать.

0 ответов

Другие вопросы по тегам