*
* @return
* @throws RecognitionException
*/
public TypeDeclarationDescr declare() throws RecognitionException {
DeclareDescrBuilder declare = null;
try {
declare = helper.start( DeclareDescrBuilder.class,
null,
null );
// 'declare'
match( input,
DRLLexer.ID,
DroolsSoftKeywords.DECLARE,
null,
DroolsEditorType.KEYWORD );
if ( state.failed ) return null;
// type may be qualified when adding metadata
String type = qualifiedIdentifier();
if ( state.failed ) return null;
if ( state.backtracking == 0 ) declare.type( type );
if ( helper.validateIdentifierKey( DroolsSoftKeywords.EXTENDS ) ) {
match( input,
DRLLexer.ID,
DroolsSoftKeywords.EXTENDS,
null,
DroolsEditorType.KEYWORD );
if (! state.failed ) {
// Going for type includes generics, which is a no-no (JIRA-3040)
String superType = qualifiedIdentifier();
declare.superType(superType);
}
}
while ( input.LA( 1 ) == DRLLexer.AT ) {
// metadata*
annotation( declare );
if ( state.failed ) return null;
}
//boolean qualified = type.indexOf( '.' ) >= 0;
while ( //! qualified &&
input.LA( 1 ) == DRLLexer.ID && !helper.validateIdentifierKey( DroolsSoftKeywords.END ) ) {
// field*
field( declare );
if ( state.failed ) return null;
}
match( input,
DRLLexer.ID,
DroolsSoftKeywords.END,
null,
DroolsEditorType.KEYWORD );
if ( state.failed ) return null;
if ( input.LA( 1 ) == DRLLexer.SEMICOLON ) {
match( input,
DRLLexer.SEMICOLON,
null,
null,
DroolsEditorType.SYMBOL );
if ( state.failed ) return null;
}
} catch ( RecognitionException re ) {
reportError( re );
} finally {
helper.end( DeclareDescrBuilder.class,
null );
}
return (declare != null) ? declare.getDescr() : null;
}