diff runtime/syntax/idl.vim @ 20:4ac1dce8dd5e v7.0012

updated for version 7.0012
author vimboss
date Mon, 26 Jul 2004 12:53:41 +0000
parents 3ba373b54370
children dc8197342755
line wrap: on
line diff
--- a/runtime/syntax/idl.vim
+++ b/runtime/syntax/idl.vim
@@ -1,203 +1,314 @@
 " Vim syntax file
-" Language:	IDL (Interface Description Language)
-" Maintainer:	Jody Goldberg <jgoldberg@home.com> or <jody@gnome.org>
-" Last Change:	2004 Jul 12
+" Language:    IDL (Interface Description Language)
+" Created By:  Jody Goldberg <jody@gnome.org>
+" Maintainer:  Michael Geddes <michaelrgeddes@optushome.com.au>
+" Last Change:  2004 Jul 20
 
 " This is an experiment.  IDL's structure is simple enough to permit a full
 " grammar based approach to rather than using a few heuristics.  The result
 " is large and somewhat repetative but seems to work.
 
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
-  syntax clear
-elseif exists("b:current_syntax")
+" There are some Microsoft extensions to idl files that are here.  Some of
+" them are disabled by defining idl_no_ms_extensions.
+"
+" The more complex of the extensions are disabled by defining idl_no_extensions.
+"
+
+if exists("b:current_syntax")
   finish
 endif
 
+if exists("idlsyntax_showerror")
+  syn match idlError +\S+ skipwhite skipempty nextgroup=idlError
+endif
+
+syn region idlCppQuote start='\<cpp_quote\s*(' end=')' contains=idlString
+
 " Misc basic
-syn match	idlId		contained "[a-zA-Z][a-zA-Z0-9_]*"
-syn match	idlSemiColon	contained ";"
-syn match	idlCommaArg	contained ","			skipempty skipwhite nextgroup=idlSimpDecl
-syn region	idlArraySize1	contained start=:\[: end=:\]:	skipempty skipwhite nextgroup=idlArraySize1,idlSemiColon,idlCommaArg contains=idlArraySize1,idlLiteral
-syn match   idlSimpDecl	 contained "[a-zA-Z][a-zA-Z0-9_]*"	skipempty skipwhite nextgroup=idlSemiColon,idlCommaArg,idlArraySize1
-syn region  idlSting	 contained start=+"+  skip=+\\\(\\\\\)*"+  end=+"+
-syn match   idlLiteral	 contained "[1-9]\d*\(\.\d*\)\="
-syn match   idlLiteral	 contained "\.\d\+"
-syn keyword idlLiteral	 contained TRUE FALSE
+syn match   idlId          contained "[a-zA-Z][a-zA-Z0-9_]*" skipwhite skipempty nextgroup=idlEnumComma,idlEnumNumber
+syn match   idlEnumComma   contained ","
+syn match   idlEnumNumber  contained "=" skipwhite skipempty nextgroup=idlString,idlLiteral
+syn match   idlSemiColon   contained ";"
+syn match   idlCommaArg    contained ","                      skipempty skipwhite nextgroup=idlSimpDecl
+syn region  idlArraySize1  contained start=:\[: end=:\]:      skipempty skipwhite nextgroup=idlArraySize1,idlError,idlSemiColon,idlCommaArg contains=idlArraySize1,idlLiteral
+syn match   idlSimpDecl    contained "[a-zA-Z][a-zA-Z0-9_]*"  skipempty skipwhite nextgroup=idlError,idlSemiColon,idlCommaArg,idlArraySize1
+syn region  idlString      contained start=+"+  skip=+\\\(\\\\\)*"+  end=+"+
+syn match   idlLiteral     contained "[1-9]\d*\(\.\d*\)\="
+syn match   idlLiteral     contained "0"
+syn match   idlLiteral     contained "\.\d\+"
+syn match   idlLiteral     contained "0x[0-9A-Fa-f]\+"
+syn match   idlLiteral     contained "0[0-7]\+"
+syn keyword idlLiteral     contained TRUE FALSE
 
 " Comments
-syn keyword idlTodo contained	TODO FIXME XXX
-syn region idlComment		start="/\*"  end="\*/" contains=idlTodo
-syn match  idlComment		"//.*" contains=idlTodo
-syn match  idlCommentError	"\*/"
+syn keyword idlTodo        contained TODO FIXME XXX
+syn region idlComment      start="/\*"  end="\*/" contains=idlTodo
+syn match  idlComment      "//.*" contains=idlTodo
+syn match  idlCommentError "\*/"
 
 " C style Preprocessor
-syn region idlIncluded contained start=+"+  skip=+\\\(\\\\\)*"+  end=+"+
-syn match  idlIncluded contained "<[^>]*>"
-syn match  idlInclude		"^[ \t]*#[ \t]*include\>[ \t]*["<]" contains=idlIncluded,idlString
-syn region idlPreCondit	start="^[ \t]*#[ \t]*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)"  skip="\\$"  end="$" contains=idlComment,idlCommentError
-syn region idlDefine	start="^[ \t]*#[ \t]*\(define\>\|undef\>\)" skip="\\$" end="$" contains=idlLiteral, idlString
+syn region idlIncluded    contained start=+"+  skip=+\\\(\\\\\)*"+  end=+"+
+syn match  idlIncluded    contained "<[^>]*>"
+syn match  idlInclude     "^[ \t]*#[ \t]*include\>[ \t]*["<]" contains=idlIncluded,idlString
+syn region idlPreCondit   start="^[ \t]*#[ \t]*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)"  skip="\\$"  end="$" contains=idlComment,idlCommentError
+syn region idlDefine      start="^[ \t]*#[ \t]*\(define\>\|undef\>\)" skip="\\$" end="$" contains=idlLiteral,idlString
 
 " Constants
-syn keyword idlConst	const	skipempty skipwhite nextgroup=idlBaseType,idlBaseTypeInt
+syn keyword idlConst    const                             skipempty skipwhite nextgroup=idlBaseType,idlBaseTypeInt
 
 " Attribute
-syn keyword idlROAttr	readonly	skipempty skipwhite nextgroup=idlAttr
-syn keyword idlAttr	attribute	skipempty skipwhite nextgroup=idlBaseTypeInt,idlBaseType
+syn keyword idlROAttr   readonly                          skipempty skipwhite nextgroup=idlAttr
+syn keyword idlAttr     attribute                         skipempty skipwhite nextgroup=idlBaseTypeInt,idlBaseType
 
 " Types
-syn region  idlD4	contained start="<" end=">"	skipempty skipwhite nextgroup=idlSimpDecl	contains=idlSeqType,idlBaseTypeInt,idlBaseType,idlLiteral
-syn keyword idlSeqType	contained sequence		skipempty skipwhite nextgroup=idlD4
-syn keyword idlBaseType		contained	float double char boolean octet any	skipempty skipwhite nextgroup=idlSimpDecl
-syn keyword idlBaseTypeInt	contained	short long		skipempty skipwhite nextgroup=idlSimpDecl
-syn keyword idlBaseType		contained	unsigned		skipempty skipwhite nextgroup=idlBaseTypeInt
-syn region  idlD1		contained	start="<" end=">"	skipempty skipwhite nextgroup=idlSimpDecl	contains=idlString,idlLiteral
-syn keyword idlBaseType		contained	string	skipempty skipwhite nextgroup=idlD1,idlSimpDecl
-syn match   idlBaseType		contained	"[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*"	skipempty skipwhite nextgroup=idlSimpDecl
+syn region  idlD4          contained start="<" end=">"    skipempty skipwhite nextgroup=idlSimpDecl contains=idlSeqType,idlBaseTypeInt,idlBaseType,idlLiteral
+syn keyword idlSeqType     contained sequence             skipempty skipwhite nextgroup=idlD4
+syn keyword idlBaseType    contained float double char boolean octet any skipempty skipwhite nextgroup=idlSimpDecl
+syn keyword idlBaseTypeInt contained short long           skipempty skipwhite nextgroup=idlSimpDecl
+syn keyword idlBaseType    contained unsigned             skipempty skipwhite nextgroup=idlBaseTypeInt
+syn region  idlD1          contained start="<" end=">"    skipempty skipwhite nextgroup=idlSimpDecl contains=idlString,idlLiteral
+syn keyword idlBaseType    contained string               skipempty skipwhite nextgroup=idlD1,idlSimpDecl
+syn match   idlBaseType    contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*"  skipempty skipwhite nextgroup=idlSimpDecl
 
 " Modules
-syn region  idlModuleContent contained start="{" end="}"	skipempty skipwhite nextgroup=idlSemiColon contains=idlUnion,idlStruct,idlEnum,idlInterface,idlComment,idlTypedef,idlConst,idlException,idlModule
-syn match   idlModuleName contained	"[a-zA-Z0-9_]\+"	skipempty skipwhite nextgroup=idlModuleContent,idlSemiColon
-syn keyword idlModule			module			skipempty skipwhite nextgroup=idlModuleName
+syn region  idlModuleContent contained start="{" end="}"  skipempty skipwhite nextgroup=idlError,idlSemiColon contains=idlUnion,idlStruct,idlEnum,idlInterface,idlComment,idlTypedef,idlConst,idlException,idlModule
+syn match   idlModuleName  contained "[a-zA-Z0-9_]\+"     skipempty skipwhite nextgroup=idlModuleContent,idlError,idlSemiColon
+syn keyword idlModule      module                         skipempty skipwhite nextgroup=idlModuleName
 
 " Interfaces
-syn region  idlInterfaceContent contained start="{" end="}"	skipempty skipwhite nextgroup=idlSemiColon contains=idlUnion,idlStruct,idlEnum,idlComment,idlROAttr,idlAttr,idlOp,idlOneWayOp,idlException,idlConst,idlTypedef
-syn match   idlInheritFrom2 contained "," skipempty skipwhite nextgroup=idlInheritFrom
-syn match idlInheritFrom contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlInheritFrom2,idlInterfaceContent
-syn match idlInherit contained	":"		skipempty skipwhite nextgroup=idlInheritFrom
-syn match   idlInterfaceName contained	"[a-zA-Z0-9_]\+"	skipempty skipwhite nextgroup=idlInterfaceContent,idlInherit,idlSemiColon
-syn keyword idlInterface		interface		skipempty skipwhite nextgroup=idlInterfaceName
+syn cluster idlCommentable contains=idlComment
+syn cluster idlContentCluster contains=idlUnion,idlStruct,idlEnum,idlROAttr,idlAttr,idlOp,idlOneWayOp,idlException,idlConst,idlTypedef,idlAttributes,idlErrorSquareBracket,idlErrorBracket,idlInterfaceSections
+
+syn region  idlInterfaceContent contained start="{" end="}"   skipempty skipwhite nextgroup=idlError,idlSemiColon contains=@idlContentCluster,@idlCommentable
+syn match   idlInheritFrom2 contained ","                     skipempty skipwhite nextgroup=idlInheritFrom
+syn match   idlInheritFrom contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlInheritFrom2,idlInterfaceContent
+syn match   idlInherit contained ":"                            skipempty skipwhite nextgroup=idlInheritFrom
+syn match   idlInterfaceName contained "[a-zA-Z0-9_]\+"       skipempty skipwhite nextgroup=idlInterfaceContent,idlInherit,idlError,idlSemiColon
+syn keyword idlInterface     interface dispinterface          skipempty skipwhite nextgroup=idlInterfaceName
+syn keyword idlInterfaceSections contained properties methods skipempty skipwhite nextgroup=idlSectionColon,idlError
+syn match   idlSectionColon contained ":"
 
 
+syn match   idlLibraryName  contained  "[a-zA-Z0-9_]\+"       skipempty skipwhite nextgroup=idlLibraryContent,idlError,idlSemiColon
+syn keyword idlLibrary      library                           skipempty skipwhite nextgroup=idlLibraryName
+syn region  idlLibraryContent contained start="{" end="}"     skipempty skipwhite nextgroup=idlError,idlSemiColon contains=@idlCommentable,idlAttributes,idlErrorSquareBracket,idlErrorBracket,idlImportlib,idlCoclass,idlTypedef,idlInterface
+
+syn keyword idlImportlib contained importlib                  skipempty skipwhite nextgroup=idlStringArg
+syn region idlStringArg contained start="(" end=")"           contains=idlString nextgroup=idlError,idlSemiColon,idlErrorBrace,idlErrorSquareBracket
+
+syn keyword idlCoclass coclass contained                      skipempty skipwhite nextgroup=idlCoclassName
+syn match   idlCoclassName "[a-zA-Z0-9_]\+" contained         skipempty skipwhite nextgroup=idlCoclassDefinition,idlError,idlSemiColon
+
+syn region idlCoclassDefinition contained start="{" end="}"   contains=idlCoclassAttributes,idlInterface,idlErrorBracket,idlErrorSquareBracket skipempty skipwhite nextgroup=idlError,idlSemiColon
+syn region idlCoclassAttributes contained start=+\[+ end=+]+  skipempty skipwhite nextgroup=idlInterface contains=idlErrorBracket,idlErrorBrace,idlCoclassAttribute
+syn keyword idlCoclassAttribute contained default source
+"syn keyword idlInterface       interface                      skipempty skipwhite nextgroup=idlInterfaceStubName
+
+syn match idlImportString       +"\f\+"+                      skipempty skipwhite nextgroup=idlError,idlSemiColon
+syn keyword idlImport           import                        skipempty skipwhite nextgroup=idlImportString
+
+syn region  idlAttributes start="\[" end="\]"                 contains=idlAttribute,idlAttributeParam,idlErrorBracket,idlErrorBrace,idlComment
+syn keyword idlAttribute contained propput propget propputref id helpstring object uuid pointer_default
+if !exists('idl_no_ms_extensions')
+syn keyword idlAttribute contained nonextensible dual version aggregatable restricted hidden noncreatable oleautomation
+endif
+syn region idlAttributeParam contained start="(" end=")"      contains=idlString,idlUuid,idlLiteral,idlErrorBrace,idlErrorSquareBracket
+" skipwhite nextgroup=idlArraySize,idlParmList contains=idlArraySize,idlLiteral
+syn match idlErrorBrace contained "}"
+syn match idlErrorBracket contained ")"
+syn match idlErrorSquareBracket contained "\]"
+
+syn match idlUuid         contained +[0-9a-zA-Z]\{8}-\([0-9a-zA-Z]\{4}-\)\{3}[0-9a-zA-Z]\{12}+
+
 " Raises
-syn keyword idlRaises	contained raises	skipempty skipwhite nextgroup=idlRaises,idlContext,idlSemiColon
+syn keyword idlRaises     contained raises               skipempty skipwhite nextgroup=idlRaises,idlContext,idlError,idlSemiColon
 
 " Context
-syn keyword idlContext	contained context	skipempty skipwhite nextgroup=idlRaises,idlContext,idlSemiColon
+syn keyword idlContext    contained context              skipempty skipwhite nextgroup=idlRaises,idlContext,idlError,idlSemiColon
 
 " Operation
-syn match   idlParmList	contained "," skipempty skipwhite nextgroup=idlOpParms
-syn region  idlArraySize contained start="\[" end="\]"	skipempty skipwhite nextgroup=idlArraySize,idlParmList contains=idlArraySize,idlLiteral
-syn match   idlParmName contained "[a-zA-Z0-9_]\+"	skipempty skipwhite nextgroup=idlParmList,idlArraySize
-syn keyword idlParmInt	contained short long		skipempty skipwhite nextgroup=idlParmName
-syn keyword idlParmType	contained unsigned		skipempty skipwhite nextgroup=idlParmInt
-syn region  idlD3	contained start="<" end=">"	skipempty skipwhite nextgroup=idlParmName	contains=idlString,idlLiteral
-syn keyword idlParmType	contained string		skipempty skipwhite nextgroup=idlD3,idlParmName
-syn keyword idlParmType	contained void float double char boolean octet any	  skipempty skipwhite nextgroup=idlParmName
-syn match   idlParmType	contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlParmName
-syn keyword idlOpParms	contained in out inout		skipempty skipwhite nextgroup=idlParmType
+syn match   idlParmList   contained ","                  skipempty skipwhite nextgroup=idlOpParms
+syn region  idlArraySize  contained start="\[" end="\]"  skipempty skipwhite nextgroup=idlArraySize,idlParmList contains=idlArraySize,idlLiteral
+syn match   idlParmName   contained "[a-zA-Z0-9_]\+"     skipempty skipwhite nextgroup=idlParmList,idlArraySize
+syn keyword idlParmInt    contained short long           skipempty skipwhite nextgroup=idlParmName
+syn keyword idlParmType   contained unsigned             skipempty skipwhite nextgroup=idlParmInt
+syn region  idlD3         contained start="<" end=">"    skipempty skipwhite nextgroup=idlParmName contains=idlString,idlLiteral
+syn keyword idlParmType   contained string               skipempty skipwhite nextgroup=idlD3,idlParmName
+syn keyword idlParmType   contained void float double char boolean octet any    skipempty skipwhite nextgroup=idlParmName
+syn match   idlParmType   contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlParmName
+syn keyword idlOpParms    contained in out inout         skipempty skipwhite nextgroup=idlParmType
+
+if !exists('idl_no_ms_extensions')
+syn keyword idlOpParms    contained retval optional      skipempty skipwhite nextgroup=idlParmType
+  syn match idlOpParms contained +\<\(iid_is\|defaultvalue\)\s*([^)]*)+ skipempty skipwhite nextgroup=idlParamType
 
-syn region idlOpContents contained start="(" end=")"	skipempty skipwhite nextgroup=idlRaises,idlContext,idlSemiColon contains=idlOpParms
-syn match   idlOpName   contained "[a-zA-Z0-9_]\+"	skipempty skipwhite nextgroup=idlOpContents
-syn keyword idlOpInt	contained short long		skipempty skipwhite nextgroup=idlOpName
-syn region  idlD2	contained start="<" end=">"	skipempty skipwhite nextgroup=idlOpName	contains=idlString,idlLiteral
-syn keyword idlOp	contained unsigned		skipempty skipwhite nextgroup=idlOpInt
-syn keyword idlOp	contained string		skipempty skipwhite nextgroup=idlD2,idlOpName
-syn keyword idlOp	contained void float double char boolean octet any		skipempty skipwhite nextgroup=idlOpName
-syn match   idlOp	contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*"	skipempty skipwhite nextgroup=idlOpName
-syn keyword idlOp	contained void			skipempty skipwhite nextgroup=idlOpName
-syn keyword idlOneWayOp	contained oneway		skipempty skipwhite nextgroup=idOp
+  syn keyword idlVariantType  contained BSTR VARIANT VARIANT_BOOL long short unsigned double CURRENCY DATE
+  syn region idlSafeArray contained matchgroup=idlVariantType start=+SAFEARRAY(\s*+ end=+)+ contains=idlVariantType
+endif
+
+syn region  idlOpContents contained start="(" end=")"    skipempty skipwhite nextgroup=idlRaises,idlContext,idlError,idlSemiColon contains=idlOpParms,idlSafeArray,idlVariantType,@idlCommentable
+syn match   idlOpName   contained "[a-zA-Z0-9_]\+"       skipempty skipwhite nextgroup=idlOpContents
+syn keyword idlOpInt    contained short long             skipempty skipwhite nextgroup=idlOpName
+syn region  idlD2       contained start="<" end=">"      skipempty skipwhite nextgroup=idlOpName contains=idlString,idlLiteral
+syn keyword idlOp       contained unsigned               skipempty skipwhite nextgroup=idlOpInt
+syn keyword idlOp       contained string                 skipempty skipwhite nextgroup=idlD2,idlOpName
+syn keyword idlOp       contained void float double char boolean octet any  skipempty skipwhite nextgroup=idlOpName
+syn match   idlOp       contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlOpName
+syn keyword idlOp       contained void                   skipempty skipwhite nextgroup=idlOpName
+syn keyword idlOneWayOp contained oneway                 skipempty skipwhite nextgroup=idOp
 
 " Enum
-syn region  idlEnumContents contained start="{" end="}"		skipempty skipwhite nextgroup=idlSemiColon, idlSimpDecl contains=idlId,idlComment
-syn match   idlEnumName contained	"[a-zA-Z0-9_]\+"	skipempty skipwhite nextgroup=idlEnumContents
-syn keyword idlEnum			enum			skipempty skipwhite nextgroup=idlEnumName
+syn region  idlEnumContents contained start="{" end="}"  skipempty skipwhite nextgroup=idlError,idlSemiColon,idlSimpDecl contains=idlId,idlAttributes,@idlCommentable
+syn match   idlEnumName contained "[a-zA-Z0-9_]\+"       skipempty skipwhite nextgroup=idlEnumContents
+syn keyword idlEnum     enum                             skipempty skipwhite nextgroup=idlEnumName,idlEnumContents
 
 " Typedef
-syn keyword idlTypedef			typedef			skipempty skipwhite nextgroup=idlBaseType, idlBaseTypeInt, idlSeqType
+syn keyword idlTypedef typedef                          skipempty skipwhite nextgroup=idlTypedefOtherTypeQualifier,idlDefBaseType,idlDefBaseTypeInt,idlDefSeqType,idlDefv1Enum,idlDefEnum,idlDefOtherType,idlDefAttributes,idlError
+
+if !exists('idl_no_extensions')
+  syn keyword idlTypedefOtherTypeQualifier contained struct enum interface nextgroup=idlDefBaseType,idlDefBaseTypeInt,idlDefSeqType,idlDefv1Enum,idlDefEnum,idlDefOtherType,idlDefAttributes,idlError skipwhite
+
+  syn region  idlDefAttributes        contained start="\[" end="\]" contains=idlAttribute,idlAttributeParam,idlErrorBracket,idlErrorBrace skipempty skipwhite nextgroup=idlDefBaseType,idlDefBaseTypeInt,idlDefSeqType,idlDefv1Enum,idlDefEnum,idlDefOtherType,idlError
+
+  syn keyword idlDefBaseType      contained float double char boolean octet any  skipempty skipwhite nextgroup=idlTypedefDecl,idlError
+  syn keyword idlDefBaseTypeInt   contained short long                           skipempty skipwhite nextgroup=idlTypedefDecl,idlError
+  syn match idlDefOtherType       contained +\<\k\+\>+ skipempty                 nextgroup=idlTypedefDecl,idlError
+  " syn keyword idlDefSeqType     contained sequence                             skipempty skipwhite nextgroup=idlD4
+
+  " Enum typedef
+  syn keyword idlDefEnum          contained enum skipempty                       skipwhite nextgroup=idlDefEnumName,idlDefEnumContents
+  syn match   idlDefEnumName      contained "[a-zA-Z0-9_]\+"                     skipempty skipwhite nextgroup=idlDefEnumContents,idlTypedefDecl
+  syn region  idlDefEnumContents  contained start="{" end="}"                    skipempty skipwhite nextgroup=idlError,idlTypedefDecl contains=idlId,idlAttributes
+
+  syn match   idlTypedefDecl      contained "[a-zA-Z0-9_]\+"                     skipempty skipwhite nextgroup=idlError,idlSemiColon
+endif
 
 " Struct
-syn region  idlStructContent contained start="{" end="}" skipempty skipwhite nextgroup=idlSemiColon, idlSimpDecl	contains=idlBaseType, idlBaseTypeInt, idlSeqType,idlComment, idlEnum, idlUnion
-syn match   idlStructName contained	"[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlStructContent
-syn keyword idlStruct			struct		 skipempty skipwhite nextgroup=idlStructName
+syn region  idlStructContent   contained start="{" end="}"   skipempty skipwhite nextgroup=idlError,idlSemiColon,idlSimpDecl contains=idlBaseType,idlBaseTypeInt,idlSeqType,@idlCommentable,idlEnum,idlUnion
+syn match   idlStructName      contained "[a-zA-Z0-9_]\+"    skipempty skipwhite nextgroup=idlStructContent
+syn keyword idlStruct          struct                        skipempty skipwhite nextgroup=idlStructName
 
 " Exception
-syn keyword idlException exception skipempty skipwhite nextgroup=idlStructName
+syn keyword idlException       exception                     skipempty skipwhite nextgroup=idlStructName
 
 " Union
-syn match   idlColon contained ":"	skipempty skipwhite nextgroup=idlCase,idlSeqType,idlBaseType,idlBaseTypeInt
-syn region  idlCaseLabel contained start="" skip="::" end=":"me=e-1	skipempty skipwhite nextgroup=idlColon contains=idlLiteral,idlString
-syn keyword idlCase		contained case				skipempty skipwhite nextgroup=idlCaseLabel
-syn keyword idlCase		contained default			skipempty skipwhite nextgroup=idlColon
-syn region  idlUnionContent	contained start="{" end="}"		skipempty skipwhite nextgroup=idlSemiColon,idlSimpDecl	contains=idlCase
-syn region  idlSwitchType	contained start="(" end=")"		skipempty skipwhite nextgroup=idlUnionContent
-syn keyword idlUnionSwitch	contained switch			skipempty skipwhite nextgroup=idlSwitchType
-syn match   idlUnionName	contained "[a-zA-Z0-9_]\+"		skipempty skipwhite nextgroup=idlUnionSwitch
-syn keyword idlUnion		union				skipempty skipwhite nextgroup=idlUnionName
+syn match   idlColon            contained ":"                skipempty skipwhite nextgroup=idlCase,idlSeqType,idlBaseType,idlBaseTypeInt
+syn region  idlCaseLabel        contained start="" skip="::" end=":"me=e-1 skipempty skipwhite nextgroup=idlColon contains=idlLiteral,idlString
+syn keyword idlCase             contained case               skipempty skipwhite nextgroup=idlCaseLabel
+syn keyword idlCase             contained default            skipempty skipwhite nextgroup=idlColon
+syn region  idlUnionContent     contained start="{" end="}"  skipempty skipwhite nextgroup=idlError,idlSemiColon,idlSimpDecl contains=idlCase
+syn region  idlSwitchType       contained start="(" end=")"  skipempty skipwhite nextgroup=idlUnionContent
+syn keyword idlUnionSwitch      contained switch             skipempty skipwhite nextgroup=idlSwitchType
+syn match   idlUnionName        contained "[a-zA-Z0-9_]\+"   skipempty skipwhite nextgroup=idlUnionSwitch
+syn keyword idlUnion            union                        skipempty skipwhite nextgroup=idlUnionName
 
-syn sync lines=200
+if !exists('idl_no_extensions')
+  syn sync match  idlInterfaceSync grouphere idlInterfaceContent "\<\(disp\)\=interface\>\s\+\k\+\s*:\s*\k\+\_s*{" skipempty skipwhite nextgroup=idlError,idlSemiColon contains=@idlContentCluster,@idlCommentable
+  syn sync maxlines=1000 minlines=100
+else
+  syn sync lines=200
+endif
+" syn sync fromstart
+
+if !exists("did_idl_syntax_inits")
+  let did_idl_syntax_inits = 1
+  " The default methods for highlighting.  Can be overridden later
+  command -nargs=+ HiLink hi def link <args>
 
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_idl_syntax_inits")
-  if version < 508
-    let did_idl_syntax_inits = 1
-    command -nargs=+ HiLink hi link <args>
-  else
-    command -nargs=+ HiLink hi def link <args>
-  endif
+  HiLink idlInclude             Include
+  HiLink idlPreProc             PreProc
+  HiLink idlPreCondit           PreCondit
+  HiLink idlDefine              Macro
+  HiLink idlIncluded            String
+  HiLink idlString              String
+  HiLink idlComment             Comment
+  HiLink idlTodo                Todo
+  HiLink idlLiteral             Number
+  HiLink idlUuid                Number
+  HiLink idlType                Type
+  HiLink idlVariantType         idlType
 
-  HiLink idlInclude		Include
-  HiLink idlPreProc		PreProc
-  HiLink idlPreCondit		PreCondit
-  HiLink idlDefine		Macro
-  HiLink idlIncluded		String
-  HiLink idlString		String
-  HiLink idlComment		Comment
-  HiLink idlTodo		Todo
-  HiLink idlLiteral		Number
+  HiLink idlModule              Keyword
+  HiLink idlInterface           Keyword
+  HiLink idlEnum                Keyword
+  HiLink idlStruct              Keyword
+  HiLink idlUnion               Keyword
+  HiLink idlTypedef             Keyword
+  HiLink idlException           Keyword
+  HiLink idlTypedefOtherTypeQualifier keyword
+
+  HiLink idlModuleName          Typedef
+  HiLink idlInterfaceName       Typedef
+  HiLink idlEnumName            Typedef
+  HiLink idlStructName          Typedef
+  HiLink idlUnionName           Typedef
 
-  HiLink idlModule		Keyword
-  HiLink idlInterface		Keyword
-  HiLink idlEnum		Keyword
-  HiLink idlStruct		Keyword
-  HiLink idlUnion		Keyword
-  HiLink idlTypedef		Keyword
-  HiLink idlException		Keyword
+  HiLink idlBaseTypeInt         idlType
+  HiLink idlBaseType            idlType
+  HiLink idlSeqType             idlType
+  HiLink idlD1                  Paren
+  HiLink idlD2                  Paren
+  HiLink idlD3                  Paren
+  HiLink idlD4                  Paren
+  "HiLink idlArraySize          Paren
+  "HiLink idlArraySize1         Paren
+  HiLink idlModuleContent       Paren
+  HiLink idlUnionContent        Paren
+  HiLink idlStructContent       Paren
+  HiLink idlEnumContents        Paren
+  HiLink idlInterfaceContent    Paren
 
-  HiLink idlModuleName		Typedef
-  HiLink idlInterfaceName	Typedef
-  HiLink idlEnumName		Typedef
-  HiLink idlStructName		Typedef
-  HiLink idlUnionName		Typedef
+  HiLink idlSimpDecl            Identifier
+  HiLink idlROAttr              StorageClass
+  HiLink idlAttr                Keyword
+  HiLink idlConst               StorageClass
+
+  HiLink idlOneWayOp            StorageClass
+  HiLink idlOp                  idlType
+  HiLink idlParmType            idlType
+  HiLink idlOpName              Function
+  HiLink idlOpParms             SpecialComment
+  HiLink idlParmName            Identifier
+  HiLink idlInheritFrom         Identifier
+  HiLink idlAttribute           SpecialComment
 
-  HiLink idlBaseTypeInt		idlType
-  HiLink idlBaseType		idlType
-  HiLink idlSeqType		idlType
-  HiLink idlD1			Paren
-  HiLink idlD2			Paren
-  HiLink idlD3			Paren
-  HiLink idlD4			Paren
-  "HiLink idlArraySize		Paren
-  "HiLink idlArraySize1		Paren
-  HiLink idlModuleContent	Paren
-  HiLink idlUnionContent	Paren
-  HiLink idlStructContent	Paren
-  HiLink idlEnumContents	Paren
-  HiLink idlInterfaceContent	Paren
+  HiLink idlId                  Constant
+  "HiLink idlCase               Keyword
+  HiLink idlCaseLabel           Constant
+
+  HiLink idlErrorBracket        Error
+  HiLink idlErrorBrace          Error
+  HiLink idlErrorSquareBracket  Error
 
-  HiLink idlSimpDecl		Identifier
-  HiLink idlROAttr		StorageClass
-  HiLink idlAttr		Keyword
-  HiLink idlConst		StorageClass
+  HiLink idlImport              Keyword
+  HiLink idlImportString        idlString
+  HiLink idlCoclassAttribute    StorageClass
+  HiLink idlLibrary             Keyword
+  HiLink idlImportlib           Keyword
+  HiLink idlCoclass             Keyword
+  HiLink idlLibraryName         Typedef
+  HiLink idlCoclassName         Typedef
+  " hi idlLibraryContent guifg=red
+  HiLink idlTypedefDecl         Typedef
+  HiLink idlDefEnum             Keyword
+  HiLink idlDefv1Enum           Keyword
+  HiLink idlDefEnumName         Typedef
+  HiLink idlDefEnumContents     Paren
+  HiLink idlDefBaseTypeInt      idlType
+  HiLink idlDefBaseType         idlType
+  HiLink idlDefSeqType          idlType
+  HiLink idlInterfaceSections   Label
 
-  HiLink idlOneWayOp		StorageClass
-  HiLink idlOp			idlType
-  HiLink idlParmType		idlType
-  HiLink idlOpName		Function
-  HiLink idlOpParms		StorageClass
-  HiLink idlParmName		Identifier
-  HiLink idlInheritFrom		Identifier
-
-  HiLink idlId			Constant
-  "HiLink idlCase		Keyword
-  HiLink idlCaseLabel		Constant
-
+  if exists("idlsyntax_showerror")
+    if exists("idlsyntax_showerror_soft")
+      hi default idlError guibg=#d0ffd0
+    else
+      HiLink idlError Error
+    endif
+  endif
   delcommand HiLink
 endif
 
 let b:current_syntax = "idl"
 
-" vim: ts=8
+" vim: sw=2 et