ttcn-cfg.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // CodeMirror, copyright (c) by Marijn Haverbeke and others
  2. // Distributed under an MIT license: https://codemirror.net/LICENSE
  3. ;(function (mod) {
  4. if (typeof exports == 'object' && typeof module == 'object')
  5. // CommonJS
  6. mod(require('../../lib/codemirror'))
  7. else if (typeof define == 'function' && define.amd)
  8. // AMD
  9. define(['../../lib/codemirror'], mod)
  10. // Plain browser env
  11. else mod(CodeMirror)
  12. })(function (CodeMirror) {
  13. 'use strict'
  14. CodeMirror.defineMode('ttcn-cfg', function (config, parserConfig) {
  15. var indentUnit = config.indentUnit,
  16. keywords = parserConfig.keywords || {},
  17. fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {},
  18. externalCommands = parserConfig.externalCommands || {},
  19. multiLineStrings = parserConfig.multiLineStrings,
  20. indentStatements = parserConfig.indentStatements !== false
  21. var isOperatorChar = /[\|]/
  22. var curPunc
  23. function tokenBase(stream, state) {
  24. var ch = stream.next()
  25. if (ch == '"' || ch == "'") {
  26. state.tokenize = tokenString(ch)
  27. return state.tokenize(stream, state)
  28. }
  29. if (/[:=]/.test(ch)) {
  30. curPunc = ch
  31. return 'punctuation'
  32. }
  33. if (ch == '#') {
  34. stream.skipToEnd()
  35. return 'comment'
  36. }
  37. if (/\d/.test(ch)) {
  38. stream.eatWhile(/[\w\.]/)
  39. return 'number'
  40. }
  41. if (isOperatorChar.test(ch)) {
  42. stream.eatWhile(isOperatorChar)
  43. return 'operator'
  44. }
  45. if (ch == '[') {
  46. stream.eatWhile(/[\w_\]]/)
  47. return 'number sectionTitle'
  48. }
  49. stream.eatWhile(/[\w\$_]/)
  50. var cur = stream.current()
  51. if (keywords.propertyIsEnumerable(cur)) return 'keyword'
  52. if (fileNCtrlMaskOptions.propertyIsEnumerable(cur)) return 'negative fileNCtrlMaskOptions'
  53. if (externalCommands.propertyIsEnumerable(cur)) return 'negative externalCommands'
  54. return 'variable'
  55. }
  56. function tokenString(quote) {
  57. return function (stream, state) {
  58. var escaped = false,
  59. next,
  60. end = false
  61. while ((next = stream.next()) != null) {
  62. if (next == quote && !escaped) {
  63. var afterNext = stream.peek()
  64. //look if the character if the quote is like the B in '10100010'B
  65. if (afterNext) {
  66. afterNext = afterNext.toLowerCase()
  67. if (afterNext == 'b' || afterNext == 'h' || afterNext == 'o') stream.next()
  68. }
  69. end = true
  70. break
  71. }
  72. escaped = !escaped && next == '\\'
  73. }
  74. if (end || !(escaped || multiLineStrings)) state.tokenize = null
  75. return 'string'
  76. }
  77. }
  78. function Context(indented, column, type, align, prev) {
  79. this.indented = indented
  80. this.column = column
  81. this.type = type
  82. this.align = align
  83. this.prev = prev
  84. }
  85. function pushContext(state, col, type) {
  86. var indent = state.indented
  87. if (state.context && state.context.type == 'statement') indent = state.context.indented
  88. return (state.context = new Context(indent, col, type, null, state.context))
  89. }
  90. function popContext(state) {
  91. var t = state.context.type
  92. if (t == ')' || t == ']' || t == '}') state.indented = state.context.indented
  93. return (state.context = state.context.prev)
  94. }
  95. //Interface
  96. return {
  97. startState: function (basecolumn) {
  98. return {
  99. tokenize: null,
  100. context: new Context((basecolumn || 0) - indentUnit, 0, 'top', false),
  101. indented: 0,
  102. startOfLine: true,
  103. }
  104. },
  105. token: function (stream, state) {
  106. var ctx = state.context
  107. if (stream.sol()) {
  108. if (ctx.align == null) ctx.align = false
  109. state.indented = stream.indentation()
  110. state.startOfLine = true
  111. }
  112. if (stream.eatSpace()) return null
  113. curPunc = null
  114. var style = (state.tokenize || tokenBase)(stream, state)
  115. if (style == 'comment') return style
  116. if (ctx.align == null) ctx.align = true
  117. if ((curPunc == ';' || curPunc == ':' || curPunc == ',') && ctx.type == 'statement') {
  118. popContext(state)
  119. } else if (curPunc == '{') pushContext(state, stream.column(), '}')
  120. else if (curPunc == '[') pushContext(state, stream.column(), ']')
  121. else if (curPunc == '(') pushContext(state, stream.column(), ')')
  122. else if (curPunc == '}') {
  123. while (ctx.type == 'statement') ctx = popContext(state)
  124. if (ctx.type == '}') ctx = popContext(state)
  125. while (ctx.type == 'statement') ctx = popContext(state)
  126. } else if (curPunc == ctx.type) popContext(state)
  127. else if (indentStatements && (((ctx.type == '}' || ctx.type == 'top') && curPunc != ';') || (ctx.type == 'statement' && curPunc == 'newstatement')))
  128. pushContext(state, stream.column(), 'statement')
  129. state.startOfLine = false
  130. return style
  131. },
  132. electricChars: '{}',
  133. lineComment: '#',
  134. fold: 'brace',
  135. }
  136. })
  137. function words(str) {
  138. var obj = {},
  139. words = str.split(' ')
  140. for (var i = 0; i < words.length; ++i) obj[words[i]] = true
  141. return obj
  142. }
  143. CodeMirror.defineMIME('text/x-ttcn-cfg', {
  144. name: 'ttcn-cfg',
  145. keywords: words(
  146. 'Yes No LogFile FileMask ConsoleMask AppendFile' +
  147. ' TimeStampFormat LogEventTypes SourceInfoFormat' +
  148. ' LogEntityName LogSourceInfo DiskFullAction' +
  149. ' LogFileNumber LogFileSize MatchingHints Detailed' +
  150. ' Compact SubCategories Stack Single None Seconds' +
  151. ' DateTime Time Stop Error Retry Delete TCPPort KillTimer' +
  152. ' NumHCs UnixSocketsEnabled LocalAddress'
  153. ),
  154. fileNCtrlMaskOptions: words(
  155. 'TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING' +
  156. ' TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP' +
  157. ' TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION' +
  158. ' TTCN_USER TTCN_FUNCTION TTCN_STATISTICS' +
  159. ' TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG' +
  160. ' EXECUTOR ERROR WARNING PORTEVENT TIMEROP' +
  161. ' VERDICTOP DEFAULTOP TESTCASE ACTION USER' +
  162. ' FUNCTION STATISTICS PARALLEL MATCHING DEBUG' +
  163. ' LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED' +
  164. ' DEBUG_ENCDEC DEBUG_TESTPORT' +
  165. ' DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE' +
  166. ' DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT' +
  167. ' DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED' +
  168. ' EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA' +
  169. ' EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS' +
  170. ' EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED' +
  171. ' FUNCTION_RND FUNCTION_UNQUALIFIED' +
  172. ' MATCHING_DONE MATCHING_MCSUCCESS' +
  173. ' MATCHING_MCUNSUCC MATCHING_MMSUCCESS' +
  174. ' MATCHING_MMUNSUCC MATCHING_PCSUCCESS' +
  175. ' MATCHING_PCUNSUCC MATCHING_PMSUCCESS' +
  176. ' MATCHING_PMUNSUCC MATCHING_PROBLEM' +
  177. ' MATCHING_TIMEOUT MATCHING_UNQUALIFIED' +
  178. ' PARALLEL_PORTCONN PARALLEL_PORTMAP' +
  179. ' PARALLEL_PTC PARALLEL_UNQUALIFIED' +
  180. ' PORTEVENT_DUALRECV PORTEVENT_DUALSEND' +
  181. ' PORTEVENT_MCRECV PORTEVENT_MCSEND' +
  182. ' PORTEVENT_MMRECV PORTEVENT_MMSEND' +
  183. ' PORTEVENT_MQUEUE PORTEVENT_PCIN' +
  184. ' PORTEVENT_PCOUT PORTEVENT_PMIN' +
  185. ' PORTEVENT_PMOUT PORTEVENT_PQUEUE' +
  186. ' PORTEVENT_STATE PORTEVENT_UNQUALIFIED' +
  187. ' STATISTICS_UNQUALIFIED STATISTICS_VERDICT' +
  188. ' TESTCASE_FINISH TESTCASE_START' +
  189. ' TESTCASE_UNQUALIFIED TIMEROP_GUARD' +
  190. ' TIMEROP_READ TIMEROP_START TIMEROP_STOP' +
  191. ' TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED' +
  192. ' USER_UNQUALIFIED VERDICTOP_FINAL' +
  193. ' VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT' +
  194. ' VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED'
  195. ),
  196. externalCommands: words('BeginControlPart EndControlPart BeginTestCase' + ' EndTestCase'),
  197. multiLineStrings: true,
  198. })
  199. })