/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package ca.weblite.netbeans.mirah.lexer; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Logger; import mirah.impl.MirahParser; import mirah.impl.Tokens; import mirah.impl.Tokens.*; import org.netbeans.spi.lexer.LanguageHierarchy; import org.netbeans.spi.lexer.Lexer; import org.netbeans.spi.lexer.LexerRestartInfo; /** * * @author shannah */ public class MirahLanguageHierarchy extends LanguageHierarchy<MirahTokenId>{ public static final int CLASS_DECLARATION = 1000; public static final int METHOD_DECLARATION = 1001; public static final int TYPE_HINT = 1002; private static Tokens[] literals = { Tokens.tFloat, Tokens.tTrue, Tokens.tFalse, Tokens.tInteger }; private static Tokens[] keywords = { Tokens.tDef, Tokens.tDo, Tokens.tImplements, Tokens.tBEGIN, Tokens.tBegin, Tokens.tEND, Tokens.tClass, Tokens.tDo, Tokens.tIf, Tokens.tImport, Tokens.tDefmacro, Tokens.tCase, Tokens.tElse, Tokens.tElsif, Tokens.tEnd, Tokens.tIn, Tokens.tRescue, Tokens.tRetry, Tokens.tReturn, Tokens.tBreak, Tokens.tClass, Tokens.tFalse, Tokens.tTrue, Tokens.tOr, Tokens.tAnd, Tokens.tUnless, Tokens.tUntil, Tokens.tFor, Tokens.tEnsure, //Tokens.tDef, //Tokens.tDefmacro, Tokens.tDefined, Tokens.tNil, Tokens.tNot, Tokens.tPackage, Tokens.tRaise, Tokens.tMacro, Tokens.tRedo, Tokens.tSelf, Tokens.tSuper, Tokens.tInterface }; private static final Logger LOG = Logger.getLogger(MirahLanguageHierarchy.class.getCanonicalName()); private static List<MirahTokenId> tokens; private static Map<Integer,MirahTokenId> idToToken; private static Set<Tokens> keywordSet = new HashSet<Tokens>(); private static Set<Tokens> literalSet = new HashSet<Tokens>(); private static void init () { keywordSet.addAll(Arrays.asList(keywords)); literalSet.addAll(Arrays.asList(literals)); Tokens[] toks = new Tokens[]{ Tokens.tBEGIN, Tokens.tEND, Tokens.t__ENCODING__, Tokens.t__FILE__, Tokens.t__LINE__, Tokens.tAlias, Tokens.tAnd, Tokens.tBegin, Tokens.tBreak, Tokens.tCase, Tokens.tClass, Tokens.tDef, Tokens.tDefined, Tokens.tDefmacro, Tokens.tDo, Tokens.tElse, Tokens.tElsif, Tokens.tEnd, Tokens.tEnsure, Tokens.tFalse, Tokens.tFor, Tokens.tIf, Tokens.tImplements, Tokens.tImport, Tokens.tIn, Tokens.tInterface, Tokens.tMacro, Tokens.tModule, Tokens.tNext, Tokens.tNil, Tokens.tNot, Tokens.tOr, Tokens.tPackage, Tokens.tRaise, Tokens.tRedo, Tokens.tRescue, Tokens.tRetry, Tokens.tReturn, Tokens.tSelf, Tokens.tSuper, Tokens.tThen, Tokens.tTrue, Tokens.tUndef, Tokens.tUnless, Tokens.tUntil, Tokens.tWhen, Tokens.tWhile, Tokens.tYield, Tokens.tClassVar, Tokens.tInstVar, Tokens.tCONSTANT, Tokens.tIDENTIFIER, Tokens.tFID, Tokens.tNL, Tokens.tSemi, Tokens.tSlash, Tokens.tDQuote, Tokens.tSQuote, Tokens.tColons, Tokens.tColon, Tokens.tDot, Tokens.tDots, Tokens.tLParen, Tokens.tRParen, Tokens.tLBrack, Tokens.tRBrack, Tokens.tLBrace, Tokens.tRBrace, Tokens.tAt, Tokens.tBang, Tokens.tPlus, Tokens.tMinus, Tokens.tCaret, Tokens.tTilde, Tokens.tPercent, Tokens.tNMatch, Tokens.tMatch, Tokens.tNE, Tokens.tLT, Tokens.tLE, Tokens.tLEG, Tokens.tGT, Tokens.tGE, Tokens.tEEQ, Tokens.tEEEQ, Tokens.tLShift, Tokens.tLLShift, Tokens.tRShift, Tokens.tEQ, Tokens.tAndEq, Tokens.tOrEq, Tokens.tOpAssign, Tokens.tQuestion, Tokens.tDigit, Tokens.tInteger, Tokens.tFloat, Tokens.tBacktick, Tokens.tDollar, Tokens.tInstVarBacktick, Tokens.tClassVarBacktick, Tokens.tComma, Tokens.tStar, Tokens.tStars, Tokens.tAmper, Tokens.tAmpers, Tokens.tPipe, Tokens.tPipes, Tokens.tRocket, Tokens.tCharacter, Tokens.tEscape, Tokens.tStringContent, Tokens.tStrEvBegin, Tokens.tRegexBegin, Tokens.tRegexEnd, Tokens.tHereDocId, Tokens.tHereDocBegin, Tokens.tHereDocEnd, Tokens.tUNKNOWN, Tokens.tEOF, Tokens.tComment, Tokens.tJavaDoc, Tokens.tWhitespace, Tokens.tPartialComment}; tokens = new ArrayList<MirahTokenId>(); for ( Tokens t : toks ){ MirahTokenId tok = new MirahTokenId(t.name(), getTokCategory(t), t.ordinal()); tokens.add(tok); } tokens.add(new MirahTokenId("Class Declaration", "class-declaration", CLASS_DECLARATION)); tokens.add(new MirahTokenId("Method Declaration", "method-declaration", METHOD_DECLARATION )); tokens.add(new MirahTokenId("Type Hint", "type-hint", TYPE_HINT)); //tokens.add(new MirahTokenId("WHITESPACE","whitespace", 999 )); idToToken = new HashMap<Integer, MirahTokenId> (); for (MirahTokenId token : tokens) idToToken.put (token.ordinal (), token); } private static String getTokCategory(Tokens t){ if ( CLASS_DECLARATION == t.ordinal()){ return "class-declaration"; } else if ( METHOD_DECLARATION == t.ordinal()){ return "method-declaration"; } else if ( TYPE_HINT == t.ordinal()){ return "type-hint"; } else if ( keywordSet.contains(t)){ return "keyword"; } else if ( Tokens.tIDENTIFIER.equals(t)){ return "identifier"; } else if ( literalSet.contains(t)){ return "literal"; } else if ( Tokens.tCharacter.equals(t) || Tokens.tSQuote.equals(t)) { return "character"; } else if ( Tokens.tInstVar.equals(t)){ return "instance-var"; } else if ( Tokens.tClassVar.equals(t)){ return "class-var"; } else if ( Tokens.tStringContent.equals(t) || Tokens.tDQuote.equals(t)){ return "string"; } else if ( Tokens.tComment.equals(t) || Tokens.tJavaDoc.equals(t)){ return "comment"; } else { return "unknown"; } } static synchronized MirahTokenId getToken (int id) { if (idToToken == null) init (); return idToToken.get (id); } protected synchronized Collection<MirahTokenId> createTokenIds () { if (tokens == null) init (); return tokens; } protected synchronized Lexer<MirahTokenId> createLexer (LexerRestartInfo<MirahTokenId> info) { return new MirahLexer (info, new MirahParser()); } protected String mimeType () { return "text/x-mirah"; } }