2

大学でのマスター プロジェクトでは、Xtext を使用して複数の DSL を作成しました。DSL の 1 つは、ユーザーがプロパティとメソッドを持つクラスを作成できるモデル エンティティ 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
}

そのように java.lang.*ImportedNamespaceAwareLocalScopeProviderを追加する をすでに使用してみました。getImportedNamespaceResolvers

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 {}

プロジェクトの残りの部分はすでに非常に複雑です (1 つのプロジェクトに 4 つの Xtext DSL と複数のジェネレーター)。ただし、完全に異なる DSL を除いて、それらはほぼ同じワークフローとRuntimeModule構成を使用します。別の DSL も使用しJvmTypeReference、ブール値などを使用していません。

もちろん問題は、私たちが何か間違ったことをしているのか、それとも他にやらなければならないことがあるのか​​ということです。以前は非常に小規模なプロジェクトで機能していましたが、いくつかの大きな変更の後、突然機能しなくなりました。

4

0 に答える 0