RFC1213-MIB.mib |
---|
sysDescr OBJECT-TYPE SYNTAX DisplayString (SIZE (0..255)) ACCESS read-only STATUS mandatory DESCRIPTION "A textual description of the entity. This value should include the full name and version identification of the system's hardware type, software operating-system, and networking software. It is mandatory that this only contain printable ASCII characters." ::= { system 1 } |
Mib.xtext |
---|
ObjectType returns Identifier: name=Object imp=[Object] 'SYNTAX' mibType 'ACCESS' ID 'STATUS' ID ('DESCRIPTION' STRING)? ('REFERENCE' STRING)? ('INDEX' '{' mibType (',' mibType)* '}')? ('DEFVAL' '{' INT | STRING '}')? value=OidValue; |
When following scope restriction code is applied:
MibScopeProvider.xtend |
---|
def IScope scope_Identifier_imp(Identifier id, EReference ref) { Scopes::scopeFor(EcoreUtil2::getAllContentsOfType(id.eContainer as Definition, com.ravi.mib.xtext.mib.Object).filter[it.name == "OBJECT-TYPE"]) } |
Therefore, we are half way done, now need to make sure the auto-completion list is get filtered as well, apparently that is done separately in MibProposalProvider.xtend (This is under xtext generated ui project).
MibProposalProvider.xtend |
---|
class MibProposalProvider extends AbstractMibProposalProvider { override completeObjectType_Imp(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { lookupCrossReference(assignment.terminal as CrossReference, context, acceptor, [(EObjectOrProxy as com.ravi.mib.xtext.mib.Object).name == "OBJECT-TYPE"]) } } |
Now all works as it should be.
Few clarifications:
- Should not make "OBJECT-TYPE" directly as keyword in Xtext as this is used as import. Sure, we can look for a way to overcome this i.e accepting as identifier or keyword based on context, however "OBJECT-TYPE" is rightfully just a macro and not a keyword in ASN.1 (Mib syntax is based on this). Therefore, I prefer to leave it as identifier.
- I am not sure why auto-completion options for OidValue's parent works without the need to create similiar completeOidValue_parent() method. Hope someone can enlighten me on this.
- Notice that in this round in method "scope_Identifier_imp", I have used "Scopes::scopeFor(...)" instead of "new SimpleScope(Scopes::scopedElementsFor(...)". The latter gives us access to EObjectDescription (see also scopedElementsFor() with custom function argument to compute element name). However, for our case - no name customization is done, former is ideal.
No comments:
Post a Comment