| # -*- coding: utf-8 -*- # |
| |
| module Rouge |
| module Lexers |
| class Java < RegexLexer |
| title "Java" |
| desc "The Java programming language (java.com)" |
| |
| tag 'java' |
| filenames '*.java' |
| mimetypes 'text/x-java' |
| |
| keywords = %w( |
| assert break case catch continue default do else finally for |
| if goto instanceof new return switch this throw try while |
| ) |
| |
| declarations = %w( |
| abstract const enum extends final implements native private protected |
| public static strictfp super synchronized throws transient volatile |
| ) |
| |
| types = %w(boolean byte char double float int long short void) |
| |
| id = /[a-zA-Z_][a-zA-Z0-9_]*/ |
| |
| state :root do |
| rule /[^\S\n]+/, Text |
| rule %r(//.*?$), Comment::Single |
| rule %r(/\*.*?\*/)m, Comment::Multiline |
| # keywords: go before method names to avoid lexing "throw new XYZ" |
| # as a method signature |
| rule /(?:#{keywords.join('|')})\b/, Keyword |
| |
| rule %r( |
| (\s*(?:[a-zA-Z_][a-zA-Z0-9_.\[\]<>]*\s+)+?) # return arguments |
| ([a-zA-Z_][a-zA-Z0-9_]*) # method name |
| (\s*)(\() # signature start |
| )mx do |m| |
| # TODO: do this better, this shouldn't need a delegation |
| delegate Java, m[1] |
| token Name::Function, m[2] |
| token Text, m[3] |
| token Operator, m[4] |
| end |
| |
| rule /@#{id}/, Name::Decorator |
| rule /(?:#{declarations.join('|')})\b/, Keyword::Declaration |
| rule /(?:#{types.join('|')})\b/, Keyword::Type |
| rule /package\b/, Keyword::Namespace |
| rule /(?:true|false|null)\b/, Keyword::Constant |
| rule /(?:class|interface)\b/, Keyword::Declaration, :class |
| rule /import\b/, Keyword::Namespace, :import |
| rule /"(\\\\|\\"|[^"])*"/, Str |
| rule /'(?:\\.|[^\\]|\\u[0-9a-f]{4})'/, Str::Char |
| rule /(\.)(#{id})/ do |
| groups Operator, Name::Attribute |
| end |
| rule /#{id}:/, Name::Label |
| rule /\$?#{id}/, Name |
| rule /[~^*!%&\[\](){}<>\|+=:;,.\/?-]/, Operator |
| rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float |
| rule /0x[0-9a-f]+/, Num::Hex |
| rule /[0-9]+L?/, Num::Integer |
| rule /\n/, Text |
| end |
| |
| state :class do |
| rule /\s+/m, Text |
| rule id, Name::Class, :pop! |
| end |
| |
| state :import do |
| rule /\s+/m, Text |
| rule /[a-z0-9_.]+\*?/i, Name::Namespace, :pop! |
| end |
| end |
| end |
| end |