大学でのマスター プロジェクトでは、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
、ブール値などを使用していません。
もちろん問題は、私たちが何か間違ったことをしているのか、それとも他にやらなければならないことがあるのかということです。以前は非常に小規模なプロジェクトで機能していましたが、いくつかの大きな変更の後、突然機能しなくなりました。