Changeset 8593


Ignore:
Timestamp:
02/16/05 21:40:16 (16 years ago)
Author:
piso
Message:

getIdentifier()
isDelimited()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/j/LispMode.java

    r8586 r8593  
    33 *
    44 * Copyright (C) 1998-2005 Peter Graves
    5  * $Id: LispMode.java,v 1.87 2005-02-16 13:49:43 piso Exp $
     5 * $Id: LispMode.java,v 1.88 2005-02-16 21:40:16 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    147147    {
    148148        return validChars.indexOf(c) >= 0;
     149    }
     150
     151    // This needs to pick out a keyword (":FOO"), but should ignore embedded
     152    // colons ("FOO:BAR").
     153    public String getIdentifier(Line line, int offset)
     154    {
     155        final int limit = line.length();
     156        if (offset < limit) {
     157            char c = line.charAt(offset);
     158
     159            if (c == ':') {
     160                if (offset == 0 || !isIdentifierPart(line.charAt(offset - 1)))
     161                    ; // OK, we're looking at the first character of a keyword.
     162                else
     163                    return null; // We're looking at an embedded ':'.
     164            } else if (isIdentifierPart(c)) {
     165                // Backtrack to find the start of the identifier.
     166                while (offset > 0) {
     167                    --offset;
     168                    c = line.charAt(offset);
     169                    if (!isIdentifierPart(c)) {
     170                        if (c == ':') {
     171                            if (offset == 0)
     172                                break; // It's a keyword.
     173                            c = line.charAt(offset - 1);
     174                            if (c == ':') {
     175                                // Two colons in a row. The character after the
     176                                // second colon is the start of the identifier.
     177                                ++offset;
     178                                break;
     179                            }
     180                            if (!isIdentifierPart(line.charAt(offset - 1)))
     181                                break; // It's a keyword.
     182                        }
     183                        // Reaching here, if c is a ':', it's an embedded ':'.
     184                        // The next character is the start of the identifier we
     185                        // want.
     186                        ++offset;
     187                        break;
     188                    }
     189                }
     190            } else
     191                return null;
     192
     193            // Now we're looking at the first character of the identifier.
     194            c = line.charAt(offset);
     195            FastStringBuffer sb = new FastStringBuffer(c);
     196            while (++offset < limit) {
     197                c = line.charAt(offset);
     198                if (isIdentifierPart(c))
     199                    sb.append(c);
     200                else
     201                    break;
     202            }
     203            return sb.toString();
     204        }
     205        return null;
     206    }
     207
     208    public boolean isDelimited(Position pos, int length)
     209    {
     210        final Line line = pos.getLine();
     211        final int offset = pos.getOffset();
     212        if (offset > 0) {
     213            // Not at start of line.
     214            final int before = offset - 1;
     215            char c = line.charAt(before);
     216            if (isIdentifierPart(c))
     217                return false;
     218            if (c == ':') {
     219                if (before == 0) {
     220                    // It's a keyword, so no match.
     221                    return false;
     222                }
     223                // before > 0
     224                c = line.charAt(before - 1);
     225                if (isIdentifierPart(c)) {
     226                    // The ':' is embedded, and we've matched the part of the
     227                    // string after the ':'.
     228                    ;
     229                } else if (c == ':') {
     230                    // Two colons in a row, and we've matched the part of the
     231                    // string after the second one.
     232                    ;
     233                } else {
     234                    // Not an identifier part or a colon. The colon is preceded
     235                    // by whitespace or maybe a '(', so it's a keyword. No match.
     236                    return false;
     237                }
     238            }
     239        }
     240        final int after = pos.getOffset() + length;
     241        if (after < pos.getLineLength() && isIdentifierPart(pos.getLine().charAt(after)))
     242            return false;
     243        return true;
    149244    }
    150245
Note: See TracChangeset for help on using the changeset viewer.