Custom scoping
As soon as a DSL introduces more involved features, such as nested blocks or inheritance relations, the scope provider must be customized according to the semantics of the language.
The Xtext generator generates an Xtend stub class for implementing a custom scope provider. In the SmallJava DSL, it is SmallJavaScopeProvider
.
In order to customize the scope provider we redefine the method getScope
, and we manually check the reference and the context's class, for example:
override getScope(EObject context, EReference reference) { if (reference == SmallJavaPackage.eINSTANCE.SJSymbolRef_Symbol) { if (context instanceof ...) ... } else if (reference == SmallJavaPackage.eINSTANCE.SJMemberSelection_Member) { ... } else { super.getScope(context, reference) } }
Scope for blocks
The default scope provider can be too permissive. For example, in SmallJava, it allows an expression to refer to a variable declaration that is defined after that expression...