2017-06-02 5 views
0

Je travaille sur une grammaire Xtext utilisant Xbase. La grammaire permet à l'utilisateur de créer un ensemble de classes Java avec des supertypes à partir d'un fichier DSL. J'ai donc créé une règle comme suit:types générés dans Xtext/Xbase grammaire

javaClass: 
    name=ID ':' supertype=JvmParameterizedTypeReference 

Mon générateur pour les fichiers de classe fonctionne très bien aussi longtemps que le type ne fait pas référence à un fichier de classe qui est en cours de création par le DSL. Lorsqu'une classe ClassA est créée par exemple à la ligne 3, et une autre classe ClassB avec supertype = ClassA définie à la ligne 4, l'analyseur n'accepte pas le fichier.

Je sais que cela parce que ClassA n'est pas un type connu quand ClassB est analysé, car le générateur est démarré après que le fichier entier ont été analysés.

Est-il néanmoins possible de résoudre mon problème et permettre aux utilisateurs de se référer à des classes qui ont été déclarées plus tôt dans le même fichier DSL?

Répondre

1

-vous en déduire un modèle de machine virtuelle Java? Il permet d'abord les classes d'index disponibles, puis infère les modèles JVM pour eux lorsque toutes les classes sont connues. Voir: https://eclipse.org/Xtext/documentation/305_xbase.html#xbase-inferred-type

+0

Oui, je déduis un modèle. J'ai défini la méthode infer dans la classe modelInferrer pour la racine de ce fichier, qui est appelée après que le fichier entier a été analysé. J'ai essayé de définir en plus des méthodes infer pour chaque type de classe défini. Cela pourrait résoudre mon problème, mais ces méthodes ne sont jamais appelées. – Thomas

+0

Pourriez-vous montrer le code? Il se pourrait que vous oubliez le mot-clé "dispatch". Vous devriez appeler la méthode 'accept' sur chaque classe pour les indexer. –

+0

J'ai trouvé le problème entre-temps - il semble que la méthode infer n'est appelée que pour l'élément le plus haut qui correspond. Une fois que la méthode infer est appelée pour un noeud, elle ne sera plus appelée pour aucun noeud contenu. Merci de votre aide! – Thomas