XBase: Adding explicit import statement using JvmModelInferrer [message #1739684] |
Wed, 03 August 2016 15:18  |
Eclipse User |
|
|
|
I would like to control the visibility of Entity and Attributes using packages. So use
package com.company.pkg1{
entity Entity1{
ref Entity2
ref Entity3
}
}
package com.company.pkg2{
entity Entity2{
}
}
package com.company.pkg3{
entity Entity2{
}
}
I would like to restrict the visibility and access of Entity3 inside Entity1. So I would like to import only com.company.pkg2 to the generated java class of Entity1, so that only Entity 2 can be accessed.I use JvmModelInferrer to map and generate java class. I could not find the way to explicitly import packages using jvmModelInferer.
Note : I am able to get the visibility of the type using ImportedNamespaceAwareLocalScopeProvider, however need to selectively import a different package for different entity based on the use case at runtime.
|
|
|
|
|
|
Re: XBase: Adding explicit import statement using JvmModelInferrer [message #1739825 is a reply to message #1739818] |
Thu, 04 August 2016 14:41   |
Eclipse User |
|
|
|
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
}
}
|
|
|
|
Powered by
FUDForum. Page generated in 0.06130 seconds