Blame data/language-specs/groovy.lang

Packit a7d494
Packit a7d494
Packit a7d494
Packit a7d494
 This file is part of GtkSourceView
Packit a7d494
Packit a7d494
 Copyright (C) 2003 Gustavo Giráldez <gustavo.giraldez@gmx.net>
Packit a7d494
 Copyright (C) 2006 Jeff Walden <jwalden@mit.edu>
Packit a7d494
 Copyright (C) 2017 Roman Donchenko
Packit a7d494
Packit a7d494
 GtkSourceView is free software; you can redistribute it and/or
Packit a7d494
 modify it under the terms of the GNU Lesser General Public
Packit a7d494
 License as published by the Free Software Foundation; either
Packit a7d494
 version 2.1 of the License, or (at your option) any later version.
Packit a7d494
Packit a7d494
 GtkSourceView is distributed in the hope that it will be useful,
Packit a7d494
 but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a7d494
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a7d494
 Lesser General Public License for more details.
Packit a7d494
Packit a7d494
 You should have received a copy of the GNU Lesser General Public License
Packit a7d494
 along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit a7d494
Packit a7d494
-->
Packit a7d494
<language id="groovy" name="Groovy" version="2.0" _section="Source">
Packit a7d494
  <metadata>
Packit a7d494
    <property name="globs">*.groovy</property>
Packit a7d494
    <property name="line-comment-start">//</property>
Packit a7d494
    <property name="block-comment-start">/*</property>
Packit a7d494
    <property name="block-comment-end">*/</property>
Packit a7d494
  </metadata>
Packit a7d494
Packit a7d494
  <styles>
Packit a7d494
    <style id="comment"           name="Comment"                   map-to="def:comment"/>
Packit a7d494
    <style id="escaped-character" name="Escaped Character"         map-to="def:special-char"/>
Packit a7d494
    <style id="interpolation"     name="Interpolation Syntax"      map-to="def:special-char"/>
Packit a7d494
    <style id="interpolated"      name="Interpolated Expression"   map-to="def:identifier"/>
Packit a7d494
    <style id="string"            name="String"                    map-to="def:string"/>
Packit a7d494
    <style id="external"          name="External"                  map-to="def:preprocessor"/>
Packit a7d494
    <style id="declaration"       name="Declaration"               map-to="def:type"/>
Packit a7d494
    <style id="storage-class"     name="Storage Class"             map-to="def:type"/>
Packit a7d494
    <style id="scope-declaration" name="Scope Declaration"         map-to="def:type"/>
Packit a7d494
    <style id="operator"          name="Operator"                  map-to="def:operator"/>
Packit a7d494
    <style id="keyword"           name="Keyword"                   map-to="def:keyword"/>
Packit a7d494
    <style id="null-value"        name="Null Value"                map-to="def:special-constant"/>
Packit a7d494
    <style id="boolean"           name="Boolean value"             map-to="def:boolean"/>
Packit a7d494
    <style id="number"            name="Number"                    map-to="def:number"/>
Packit a7d494
    <style id="type"              name="Data Type"                 map-to="def:type"/>
Packit a7d494
  </styles>
Packit a7d494
Packit a7d494
  <definitions>
Packit a7d494
    <define-regex id="escaped-character" extended="true">
Packit a7d494
      \\(
Packit a7d494
        # character escape
Packit a7d494
        [nrtbf"'\\$] |
Packit a7d494
        # unicode escape
Packit a7d494
        u[0-9A-Fa-f]{4} |
Packit a7d494
        # octal escape
Packit a7d494
        [0-3] ([0-7] [0-7]?)? | [4-7] [0-7]?
Packit a7d494
      )
Packit a7d494
    </define-regex>
Packit a7d494
Packit a7d494
    <define-regex id="letter" extended="true">
Packit a7d494
      [a-zA-Z\x{c0}-\x{d6}\x{d8}-\x{f6}\x{f8}-\x{ff}\x{100}-\x{fffe}_]
Packit a7d494
    </define-regex>
Packit a7d494
Packit a7d494
    <context id="escaped-character">
Packit a7d494
      <include>
Packit a7d494
        <context style-ref="escaped-character">
Packit a7d494
          <match>\%{escaped-character}</match>
Packit a7d494
        </context>
Packit a7d494
        <context ref="def:line-continue"/>
Packit a7d494
        <context style-ref="def:error">
Packit a7d494
          
Packit a7d494
          <match>\\</match>
Packit a7d494
        </context>
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="placeholder">
Packit a7d494
      <include>
Packit a7d494
        <context style-ref="interpolated">
Packit a7d494
          <match extended="true">
Packit a7d494
            (\$)
Packit a7d494
            # one or more dollarless identifiers separated by dots
Packit a7d494
            \%{letter} (\%{letter} | \d)*
Packit a7d494
            (\. \%{letter} (\%{letter} | \d)*)*
Packit a7d494
          </match>
Packit a7d494
          <include>
Packit a7d494
            <context sub-pattern="1" style-ref="interpolation"/>
Packit a7d494
          </include>
Packit a7d494
        </context>
Packit a7d494
        <context style-ref="interpolated">
Packit a7d494
          <start>\$\{</start>
Packit a7d494
          <end>\}</end>
Packit a7d494
          <include>
Packit a7d494
            <context sub-pattern="0" where="start" style-ref="interpolation"/>
Packit a7d494
            <context sub-pattern="0" where="end" style-ref="interpolation"/>
Packit a7d494
            <context ref="groovy"/>
Packit a7d494
          </include>
Packit a7d494
        </context>
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    
Packit a7d494
    <context id="bad-placeholder" style-ref="def:error">
Packit a7d494
      <match>\$</match>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="triple-single-quoted-string" style-ref="string" class="string" class-disabled="no-spell-check">
Packit a7d494
      <start>'''</start>
Packit a7d494
      <end>'''</end>
Packit a7d494
      <include>
Packit a7d494
        <context ref="escaped-character"/>
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="single-quoted-string" end-at-line-end="true" style-ref="string" class="string" class-disabled="no-spell-check">
Packit a7d494
      <start>'</start>
Packit a7d494
      <end>'</end>
Packit a7d494
      <include>
Packit a7d494
        <context ref="escaped-character"/>
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="triple-double-quoted-string" style-ref="string" class="string" class-disabled="no-spell-check">
Packit a7d494
      <start>"""</start>
Packit a7d494
      <end>"""</end>
Packit a7d494
      <include>
Packit a7d494
        <context ref="escaped-character"/>
Packit a7d494
        <context ref="placeholder"/>
Packit a7d494
        <context ref="bad-placeholder"/>
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="double-quoted-string" end-at-line-end="true" style-ref="string" class="string" class-disabled="no-spell-check">
Packit a7d494
      <start>"</start>
Packit a7d494
      <end>"</end>
Packit a7d494
      <include>
Packit a7d494
        <context ref="escaped-character"/>
Packit a7d494
        <context ref="placeholder"/>
Packit a7d494
        <context ref="bad-placeholder"/>
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="slashy-string" style-ref="string" class="string">
Packit a7d494
      <start extended="true">
Packit a7d494
        # The initial slash must not be preceded by a token that can end an expression.
Packit a7d494
        # Otherwise, it's interpreted as a division operator, not the start of a slashy string.
Packit a7d494
        # It'd be complicated to verify whole tokens with a regex, but the last non-space
Packit a7d494
        # character is a good indicator by itself. We can use a negative lookbehind assertion
Packit a7d494
        # to verify that it's not a character that an expression-ending token can end with.
Packit a7d494
Packit a7d494
        # Trouble is, a lookbehind assertion has to consist of fixed-length alternatives, so
Packit a7d494
        # we can't have it match an arbitrary amount of whitespace. Thus, we do an approximate
Packit a7d494
        # check, only trying zero and one spaces.
Packit a7d494
Packit a7d494
        (?<! \+\+   | --   | [])}"\d]   | \%{letter} |
Packit a7d494
                \+\+\s | --\s | [])}"\d]\s | \%{letter}\s )
Packit a7d494
Packit a7d494
        /
Packit a7d494
      </start>
Packit a7d494
      <end>/</end>
Packit a7d494
      <include>
Packit a7d494
        <context style-ref="escaped-character">
Packit a7d494
          <match>\\/</match>
Packit a7d494
        </context>
Packit a7d494
        <context ref="def:line-continue"/>
Packit a7d494
        <context ref="placeholder"/>
Packit a7d494
        
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="dollar-slashy-string" style-ref="string" class="string">
Packit a7d494
      <start extended="true">
Packit a7d494
        \$/
Packit a7d494
Packit a7d494
        # Dollar slashy strings can't be empty (a would-be empty one is parsed
Packit a7d494
        # as a dollar followed by a single-line comment instead).
Packit a7d494
        (?! /\$)
Packit a7d494
      </start>
Packit a7d494
      <end>/\$</end>
Packit a7d494
      <include>
Packit a7d494
        <context style-ref="escaped-character">
Packit a7d494
          <match>\$[$/]</match>
Packit a7d494
        </context>
Packit a7d494
        <context ref="def:line-continue"/>
Packit a7d494
        <context ref="placeholder"/>
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="numeric" style-ref="number">
Packit a7d494
      <match extended="true">
Packit a7d494
        \b (
Packit a7d494
          # floating-point
Packit a7d494
          \d ([\d_]* \d)? (
Packit a7d494
            \. \d ([\d_]* \d)? ([eE] [+-]? [\d_]* \d)? [dDfFgG]? |
Packit a7d494
            [eE] [+-]? [\d_]* \d [dDfFgG]? |
Packit a7d494
            [dDfF]
Packit a7d494
          ) |
Packit a7d494
          # integer
Packit a7d494
          (
Packit a7d494
            0 | # decimal zero
Packit a7d494
            0[bB] [01] ([01_]* [01])? | # binary
Packit a7d494
            0 [0-7] ([0-7_]* [0-7])? | # octal
Packit a7d494
            [1-9] ([\d_]* \d)? | # decimal
Packit a7d494
            0[xX] [\da-fA-F] ([\da-fA-F_]* [\da-fA-F])? # hexadecimal
Packit a7d494
          ) [iIlLgG]?
Packit a7d494
        ) \b
Packit a7d494
      </match>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    
Packit a7d494
      Some of the Java keywords are reserved in Groovy. We don't mark them
Packit a7d494
      with a special style, though, because in some instances keywords can
Packit a7d494
      be used as identifiers (e.g. when used as a member name), and even
Packit a7d494
      reserved keywords are valid when used like that.
Packit a7d494
    -->
Packit a7d494
Packit a7d494
    <context id="externals" style-ref="external">
Packit a7d494
      <keyword>import</keyword>
Packit a7d494
      <keyword>package</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="declarations" style-ref="declaration">
Packit a7d494
      <keyword>class</keyword>
Packit a7d494
      <keyword>enum</keyword>
Packit a7d494
      <keyword>extends</keyword>
Packit a7d494
      <keyword>implements</keyword>
Packit a7d494
      <keyword>interface</keyword>
Packit a7d494
      <keyword>native</keyword>
Packit a7d494
      <keyword>throws</keyword>
Packit a7d494
      <keyword>trait</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="primitive-types" style-ref="type">
Packit a7d494
      <keyword>boolean</keyword>
Packit a7d494
      <keyword>byte</keyword>
Packit a7d494
      <keyword>char</keyword>
Packit a7d494
      <keyword>def</keyword>
Packit a7d494
      <keyword>double</keyword>
Packit a7d494
      <keyword>float</keyword>
Packit a7d494
      <keyword>int</keyword>
Packit a7d494
      <keyword>long</keyword>
Packit a7d494
      <keyword>short</keyword>
Packit a7d494
      <keyword>void</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="storage-class" style-ref="storage-class">
Packit a7d494
      <keyword>abstract</keyword>
Packit a7d494
      <keyword>const</keyword>
Packit a7d494
      <keyword>final</keyword>
Packit a7d494
      <keyword>static</keyword>
Packit a7d494
      <keyword>strictfp</keyword>
Packit a7d494
      <keyword>synchronized</keyword>
Packit a7d494
      <keyword>transient</keyword>
Packit a7d494
      <keyword>volatile</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="scope-declarations" style-ref="scope-declaration">
Packit a7d494
      <keyword>private</keyword>
Packit a7d494
      <keyword>protected</keyword>
Packit a7d494
      <keyword>public</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="flow" style-ref="keyword">
Packit a7d494
      <keyword>assert</keyword>
Packit a7d494
      <keyword>break</keyword>
Packit a7d494
      <keyword>case</keyword>
Packit a7d494
      <keyword>catch</keyword>
Packit a7d494
      <keyword>continue</keyword>
Packit a7d494
      <keyword>default</keyword>
Packit a7d494
      <keyword>do</keyword>
Packit a7d494
      <keyword>else</keyword>
Packit a7d494
      <keyword>finally</keyword>
Packit a7d494
      <keyword>for</keyword>
Packit a7d494
      <keyword>goto</keyword>
Packit a7d494
      <keyword>if</keyword>
Packit a7d494
      <keyword>return</keyword>
Packit a7d494
      <keyword>throw</keyword>
Packit a7d494
      <keyword>switch</keyword>
Packit a7d494
      <keyword>try</keyword>
Packit a7d494
      <keyword>while</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="operator" style-ref="operator">
Packit a7d494
      <keyword>as</keyword>
Packit a7d494
      <keyword>in</keyword>
Packit a7d494
      <keyword>instanceof</keyword>
Packit a7d494
      <keyword>new</keyword>
Packit a7d494
      <keyword>super</keyword>
Packit a7d494
      <keyword>this</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="null-value" style-ref="null-value">
Packit a7d494
      <keyword>null</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="boolean" style-ref="boolean">
Packit a7d494
      <keyword>false</keyword>
Packit a7d494
      <keyword>true</keyword>
Packit a7d494
    </context>
Packit a7d494
Packit a7d494
    <context id="groovy" class="no-spell-check">
Packit a7d494
      <include>
Packit a7d494
        <context ref="def:shebang" style-ref="comment"/>
Packit a7d494
        <context ref="def:c-like-comment" style-ref="comment"/>
Packit a7d494
        <context ref="def:c-like-comment-multiline" style-ref="comment"/>
Packit a7d494
        <context ref="def:line-continue"/>
Packit a7d494
Packit a7d494
        <context ref="triple-single-quoted-string"/>
Packit a7d494
        <context ref="single-quoted-string"/>
Packit a7d494
        <context ref="triple-double-quoted-string"/>
Packit a7d494
        <context ref="double-quoted-string"/>
Packit a7d494
        <context ref="slashy-string"/>
Packit a7d494
        <context ref="dollar-slashy-string"/>
Packit a7d494
        <context ref="numeric"/>
Packit a7d494
Packit a7d494
        <context ref="externals"/>
Packit a7d494
        <context ref="declarations"/>
Packit a7d494
        <context ref="primitive-types"/>
Packit a7d494
        <context ref="storage-class"/>
Packit a7d494
        <context ref="scope-declarations"/>
Packit a7d494
        <context ref="flow"/>
Packit a7d494
        <context ref="operator"/>
Packit a7d494
        <context ref="null-value"/>
Packit a7d494
        <context ref="boolean"/>
Packit a7d494
      </include>
Packit a7d494
    </context>
Packit a7d494
  </definitions>
Packit a7d494
</language>