| RFC1213-MIB.mib |
|---|
IMPORTS
mgmt, NetworkAddress, IpAddress, Counter, Gauge,
TimeTicks
FROM RFC1155-SMI
OBJECT-TYPE
FROM RFC-1212;
|
For example, mgmt is defined in RFC1155-SMI.mib file or OBJECT-TYPE is defined in RFC-1212.mib file.
| RFC1155-SMI.mib |
|---|
mgmt OBJECT IDENTIFIER ::= { internet 2 }
|
| RFC-1212.mib |
|---|
OBJECT-TYPE MACRO ::=
BEGIN
TYPE NOTATION ::=
-- must conform to
-- RFC1155's ObjectSyntax
"SYNTAX" type(ObjectSyntax)
"ACCESS" Access
"STATUS" Status
DescrPart
ReferPart
IndexPart
DefValPart
VALUE NOTATION ::= value (VALUE ObjectName) <etc etc>
|
Therefore, we need to make the references link across the file.
Xtext provides this via special attributes "importedNamespace" or "importURI". Since each MIB is enclosed by Definition block and provides Import section - its more closely resemble namespace so "importedNamespace" will be my choice.
Before working directly on MIB grammar, I decided to get familiarize on Xtext import namespace concept using 15 Minutes Tutorial example.
Notice that root rule is using multiplicity - making it single instance causes "Open-Declaration" (i.e F3) feature to stop working - I take this as hint that each files data get appended into a single model container .
| Domainmodel.xtext |
|---|
Domainmodel: // (elements += AbstractElement)* elements = AbstractElement ; |
Therefore, the Mib grammar should be modified as follow.
| Mib.xtext |
|---|
MibModel: definitions+=Definition* ; Definition: name=ID 'DEFINITIONS' '::=' 'BEGIN' Export? imports=Import? (identifiers+=Identifier | DataType)+ 'END'; |
Additionally using that 15 Minutes Tutorial again, lets modify the import syntax something similar to Mib.
| blog.dmodel |
|---|
// import my.company.common.HasAuthor import HasAuthor from my.company.common |
Therefore the grammar need to be changed as follow:
| Domainmodel.xtext |
|---|
Import: // 'import' importedNamespace = QualifiedNameWithWildcard 'import' lastSegment=(ID|'*') 'from' qname=QualifiedName ; //QualifiedNameWithWildcard: // QualifiedName '.*'? //; |
Since "importedNamespace" attribute can't be used directly, we lose the default Xtext behaviour and need manual construct of Imported Namespace. This can be done by overriding getImportedNamespace() method from ImportedNamespaceAwareLocalScopeProvider.
| DomainmodelImportedNamespaceAwareLocalScopeProvider.xtend |
|---|
package org.example.domainmodel.scoping
import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider
import org.eclipse.emf.ecore.EObject
import org.example.domainmodel.domainmodel.Import
class DomainmodelImportedNamespaceAwareLocalScopeProvider extends ImportedNamespaceAwareLocalScopeProvider {
override String getImportedNamespace(EObject object) {
if (object instanceof Import)
(object as Import).qname + "." + (object as Import).lastSegment
}
}
|
And to bind this class, override configureIScopeProviderDelegate() as follow:
| DomainmodelRuntimeModule.java |
|---|
@Override
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(DomainmodelImportedNamespaceAwareLocalScopeProvider.class);
}
|
Now the new import syntax should work.
TODO: Why there is another alternative ImportedNamespaceAwareLocalScopeProvider binding through Model workflow file while we can override this through above method? When or any reason at all to use this?
| GenerateDomainmodel.mwe2 |
|---|
fragment = scoping.ImportNamespacesScopingFragment auto-inject {}
|
No comments:
Post a Comment