|
|
|
|
Re: XBase: Adding explicit import statement using JvmModelInferrer [message #1739825 is a reply to message #1739818] |
Thu, 04 August 2016 18:41 |
|
what do you mean by required package? for the use inside the expression?
package org.xtext.example.mydsl2
import javax.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.xbase.scoping.XImportSectionNamespaceScopeProvider
import org.xtext.example.mydsl2.myDsl.Entity
import org.xtext.example.mydsl2.myDsl.Package
class MyDslXImportSectionNamespaceScopeProvider extends XImportSectionNamespaceScopeProvider {
@Inject IQualifiedNameProvider nameProvider;
override protected internalGetImportedNamespaceResolvers(EObject context, boolean ignoreCase) {
val result = newArrayList
result += super.internalGetImportedNamespaceResolvers(context, ignoreCase)
if (context instanceof Entity) {
val prev = getPrevPack(context)
if (prev != null) {
val name = nameProvider.getFullyQualifiedName(prev);
result += this.createImportedNamespaceResolver(name+".*", ignoreCase)
}
}
result
}
def getPrevPack(Entity ctx) {
val pack = EcoreUtil2.getContainerOfType(ctx, Package)
val prev = EcoreUtil2.getPreviousSibling(pack)
if (prev != null && prev instanceof Package) {
return prev as Package
}
return null
}
}
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
override configureIScopeProviderDelegate(Binder binder) {
binder.bind(IScopeProvider).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(MyDslXImportSectionNamespaceScopeProvider);
}
}
class MyDslJvmModelInferrer extends AbstractModelInferrer {
@Inject extension JvmTypesBuilder
@Inject extension IQualifiedNameConverter
def dispatch void infer(Entity entity, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
// Here you explain how your model is mapped to Java elements, by writing the actual translation code.
val pack = EcoreUtil2.getContainerOfType(entity, Package)
val name = pack.name+"."+entity.name
acceptor.accept(entity.toClass(name.toQualifiedName)) [
members += entity.toMethod("dummy", Void.TYPE.typeRef()) [
body = entity.body
]
]
}
}
grammar org.xtext.example.mydsl2.MyDsl with org.eclipse.xtext.xbase.Xbase
generate myDsl "http://www.xtext.org/example/mydsl2/MyDsl"
Model:
packages+=Package*;
Package:
"package" name=QualifiedName "{"
enitities+=Entity*
"}"
;
Entity:
"entity" name=ID
body=XBlockExpression
;
package a {
entity A {
}
}
package b {
entity B {
var A a;
var C c; // not ok
}
}
package c {
entity C {
var B a; // ok
var A a; // not ok
}
}
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
|
Powered by
FUDForum. Page generated in 0.02941 seconds