Changeset 11022


Ignore:
Timestamp:
03/17/06 02:08:50 (15 years ago)
Author:
piso
Message:

Reformatted source.

File:
1 edited

Legend:

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

    r6849 r11022  
    22 * GlobalTag.java
    33 *
    4  * Copyright (C) 1998-2004 Peter Graves
    5  * $Id: GlobalTag.java,v 1.2 2004-05-21 16:50:24 piso Exp $
     4 * Copyright (C) 1998-2006 Peter Graves
     5 * $Id: GlobalTag.java,v 1.3 2006-03-17 02:08:50 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    3030public final class GlobalTag extends Tag
    3131{
    32     private final String filename;
    33 
    34     private GlobalTag(String name, String signature, String filename)
    35     {
    36         super(name, signature);
    37         this.filename = filename;
    38     }
    39 
    40     private GlobalTag(String name, String signature, String filename,
    41         String canonicalSignature)
    42     {
    43         super(name, signature);
    44         this.filename = filename;
    45         this.canonicalSignature = canonicalSignature;
    46     }
    47 
    48     public final String getFileName()
    49     {
    50         return filename;
    51     }
    52 
    53     // Return tag name from line in tag file.
    54     public static String getTagName(Line line)
    55     {
    56         int i = line.getText().indexOf(Tagger.separatorChar);
    57         if (i < 0) // Should never happen.
    58             return line.getText();
    59         else
    60             return line.substring(0, i);
    61     }
    62 
    63     // Construct global tag from one line of text in tag file.
    64     public static GlobalTag makeGlobalTag(String s)
    65     {
    66         int index = s.indexOf(Tagger.separatorChar);
    67         if (index < 0)
    68             return null;
    69         String name = s.substring(0, index);
    70         s = s.substring(index + 1);
    71         index = s.indexOf(Tagger.separatorChar);
    72         if (index < 0)
    73             return null;
    74         String filename = s.substring(0, index);
    75         s = s.substring(index + 1);
    76         index = s.indexOf(Tagger.separatorChar);
    77         if (index < 0) {
    78             // No canonical signature.
    79             String signature = s;
    80             return new GlobalTag(name, signature, filename);
    81         }
    82         String signature = s.substring(0, index);
    83         String canonicalSignature = s.substring(index + 1);
    84         return new GlobalTag(name, signature, filename, canonicalSignature);
    85     }
    86 
    87     public String getClassName()
    88     {
    89         // Java.
    90         int index = name.indexOf('.');
     32  private final String filename;
     33
     34  private GlobalTag(String name, String signature, String filename)
     35  {
     36    super(name, signature);
     37    this.filename = filename;
     38  }
     39
     40  private GlobalTag(String name, String signature, String filename,
     41                    String canonicalSignature)
     42  {
     43    super(name, signature);
     44    this.filename = filename;
     45    this.canonicalSignature = canonicalSignature;
     46  }
     47
     48  public final String getFileName()
     49  {
     50    return filename;
     51  }
     52
     53  // Return tag name from line in tag file.
     54  public static String getTagName(Line line)
     55  {
     56    int i = line.getText().indexOf(Tagger.separatorChar);
     57    if (i < 0) // Should never happen.
     58      return line.getText();
     59    else
     60      return line.substring(0, i);
     61  }
     62
     63  // Construct global tag from one line of text in tag file.
     64  public static GlobalTag makeGlobalTag(String s)
     65  {
     66    int index = s.indexOf(Tagger.separatorChar);
     67    if (index < 0)
     68      return null;
     69    String name = s.substring(0, index);
     70    s = s.substring(index + 1);
     71    index = s.indexOf(Tagger.separatorChar);
     72    if (index < 0)
     73      return null;
     74    String filename = s.substring(0, index);
     75    s = s.substring(index + 1);
     76    index = s.indexOf(Tagger.separatorChar);
     77    if (index < 0)
     78      {
     79        // No canonical signature.
     80        String signature = s;
     81        return new GlobalTag(name, signature, filename);
     82      }
     83    String signature = s.substring(0, index);
     84    String canonicalSignature = s.substring(index + 1);
     85    return new GlobalTag(name, signature, filename, canonicalSignature);
     86  }
     87
     88  public String getClassName()
     89  {
     90    // Java.
     91    int index = name.indexOf('.');
     92    if (index >= 0)
     93      return name.substring(0, index);
     94    // C++, Perl.
     95    index = name.indexOf("::");
     96    if (index >= 0)
     97      return name.substring(0, index);
     98    // C, Lisp.
     99    return null;
     100  }
     101
     102  public String getMethodName()
     103  {
     104    // Java
     105    int index = name.indexOf('.');
     106    if (index >= 0)
     107      return name.substring(index + 1);
     108    // C++
     109    index = name.indexOf("::");
     110    if (index >= 0)
     111      return name.substring(index + 2);
     112    return name;
     113  }
     114
     115  public String getLongName()
     116  {
     117    String s = signature.trim();
     118    if (s.startsWith("DEFUN"))
     119      {
     120        // Emacs source.
     121        return name;
     122      }
     123    if (s.startsWith("("))
     124      {
     125        // Lisp.
     126        s = s.substring(1).trim();
     127        // First word should be "defun" or "defvar" or some such...
     128        int end = 0;
     129        final int limit = s.length();
     130        for (int i = 0; i < limit; i++)
     131          {
     132            char c = s.charAt(i);
     133            if (c == ' ' || c == '\t')
     134              {
     135                end = i;
     136                break;
     137              }
     138          }
     139        String definer = s.substring(0, end);
     140        s = s.substring(end).trim();
     141        FastStringBuffer sb = new FastStringBuffer('(');
     142        sb.append(definer);
     143        sb.append(' ');
     144        if (definer.equals("defgeneric") || definer.equals("defmethod"))
     145          {
     146            sb.append(s);
     147            return sb.toString();
     148          }
     149        for (int i = 0; i < limit; i++)
     150          {
     151            char c = s.charAt(i);
     152            if (c == ' ' || c == '\t')
     153              {
     154                sb.append(s.substring(0, i));
     155                sb.append(" ...");
     156                return sb.toString();
     157              }
     158            if (c == ')')
     159              {
     160                sb.append(s.substring(0, i + 1));
     161                return sb.toString();
     162              }
     163          }
     164        sb.append(s);
     165        sb.append("  ...");
     166        return sb.toString();
     167      }
     168    if (name.startsWith("class "))
     169      return name;
     170    // Strip comment if any.
     171    // BUG! Only really relevant to Java-like languages.
     172    int index = s.indexOf("//");
     173    if (index >= 0)
     174      s = s.substring(0, index).trim();
     175    index = s.lastIndexOf(')');
     176    if (index >= 0)
     177      s = s.substring(0, index + 1);
     178    if (s.endsWith("("))
     179      s = s.substring(0, s.length() - 1);
     180    // Try to substitute the fully qualified method name.
     181    // Try Java first.
     182    String separator = ".";
     183    int sepLength = 1;
     184    index = name.indexOf(separator);
     185    if (index >= 0)
     186      {
     187        String methodName = name.substring(index + sepLength);
     188        index = s.indexOf(methodName);
    91189        if (index >= 0)
    92             return name.substring(0, index);
    93         // C++, Perl.
    94         index = name.indexOf("::");
     190          {
     191            String head = s.substring(0, index);
     192            String tail = s.substring(index + methodName.length());
     193            s = head + name + tail;
     194          }
     195      }
     196    else
     197      {
     198        // C++.
     199        separator = "::";
     200        sepLength = 2;
     201        index = name.indexOf(separator);
    95202        if (index >= 0)
    96             return name.substring(0, index);
    97         // C, Lisp.
    98         return null;
    99     }
    100 
    101     public String getMethodName()
    102     {
    103         // Java
    104         int index = name.indexOf('.');
    105         if (index >= 0)
    106             return name.substring(index + 1);
    107         // C++
    108         index = name.indexOf("::");
    109         if (index >= 0)
    110             return name.substring(index + 2);
    111         return name;
    112     }
    113 
    114     public String getLongName()
    115     {
    116         String s = signature.trim();
    117         if (s.startsWith("DEFUN")) {
    118             // Emacs source.
    119             return name;
    120         }
    121         if (s.startsWith("(")) {
    122             // Lisp.
    123             s = s.substring(1).trim();
    124             // First word should be "defun" or "defvar" or some such...
    125             int end = 0;
    126             final int limit = s.length();
    127             for (int i = 0; i < limit; i++) {
    128                 char c = s.charAt(i);
    129                 if (c == ' ' || c == '\t') {
    130                     end = i;
    131                     break;
    132                 }
    133             }
    134             String definer = s.substring(0, end);
    135             s = s.substring(end).trim();
    136             FastStringBuffer sb = new FastStringBuffer('(');
    137             sb.append(definer);
    138             sb.append(' ');
    139             if (definer.equals("defgeneric") || definer.equals("defmethod")) {
    140                 sb.append(s);
    141                 return sb.toString();
    142             }
    143             for (int i = 0; i < limit; i++) {
    144                 char c = s.charAt(i);
    145                 if (c == ' ' || c == '\t') {
    146                     sb.append(s.substring(0, i));
    147                     sb.append(" ...");
    148                     return sb.toString();
    149                 }
    150                 if (c == ')') {
    151                     sb.append(s.substring(0, i + 1));
    152                     return sb.toString();
    153                 }
    154             }
    155             sb.append(s);
    156             sb.append("  ...");
    157             return sb.toString();
    158         }
    159         if (name.startsWith("class "))
    160             return name;
    161         // Strip comment if any.
    162         // BUG! Only really relevant to Java-like languages.
    163         int index = s.indexOf("//");
    164         if (index >= 0)
    165             s = s.substring(0, index).trim();
    166         index = s.lastIndexOf(')');
    167         if (index >= 0)
    168             s = s.substring(0, index + 1);
    169         if (s.endsWith("("))
    170             s = s.substring(0, s.length() - 1);
    171         // Try to substitute the fully qualified method name.
    172         // Try Java first.
    173         String separator = ".";
    174         int sepLength = 1;
    175         index = name.indexOf(separator);
    176         if (index >= 0) {
     203          {
    177204            String methodName = name.substring(index + sepLength);
    178205            index = s.indexOf(methodName);
    179             if (index >= 0) {
     206            if (index >= 0)
     207              {
    180208                String head = s.substring(0, index);
    181209                String tail = s.substring(index + methodName.length());
    182210                s = head + name + tail;
    183             }
    184         } else {
    185             // C++.
    186             separator = "::";
    187             sepLength = 2;
    188             index = name.indexOf(separator);
    189             if (index >= 0) {
    190                 String methodName = name.substring(index + sepLength);
    191                 index = s.indexOf(methodName);
    192                 if (index >= 0) {
    193                     String head = s.substring(0, index);
    194                     String tail = s.substring(index + methodName.length());
    195                     s = head + name + tail;
    196                 }
    197             }
    198         }
    199         return s;
    200     }
    201 
    202     public String toString()
    203     {
    204         // JavaScript.
    205         if (signature.trim().startsWith("function "))
    206             return signature + " " + File.getInstance(filename).getName();
    207         else
    208             return super.toString();
    209     }
    210 
    211     public void gotoTag(Editor editor)
    212     {
    213         editor.setWaitCursor();
    214         Buffer buf = Editor.getBuffer(File.getInstance(filename));
    215         if (buf != null) {
    216             editor.makeNext(buf);
    217             editor.activate(buf);
    218             Position pos = findSignatureInCurrentBuffer(buf, signature);
    219             if (pos != null) {
    220                 CompoundEdit compoundEdit = editor.beginCompoundEdit();
    221                 editor.addUndo(SimpleEdit.FOLD);
    222                 editor.unfoldMethod(pos.getLine());
    223                 editor.moveDotTo(pos);
    224                 TagCommands.centerTag(editor);
    225                 editor.endCompoundEdit(compoundEdit);
    226                 editor.updateDisplay();
    227             }
    228         }
    229         editor.setDefaultCursor();
    230     }
    231 
    232     private static Position findSignatureInCurrentBuffer(Buffer buffer,
    233         String signature)
    234     {
    235         final List localTags = buffer.getTags(true);
    236         if (localTags == null)
    237             return null;
    238         final int limit = localTags.size();
    239         for (int i = 0; i < limit; i++) {
     211              }
     212          }
     213      }
     214    return s;
     215  }
     216
     217  public String toString()
     218  {
     219    // JavaScript.
     220    if (signature.trim().startsWith("function "))
     221      return signature + " " + File.getInstance(filename).getName();
     222    else
     223      return super.toString();
     224  }
     225
     226  public void gotoTag(Editor editor)
     227  {
     228    editor.setWaitCursor();
     229    Buffer buf = Editor.getBuffer(File.getInstance(filename));
     230    if (buf != null)
     231      {
     232        editor.makeNext(buf);
     233        editor.activate(buf);
     234        Position pos = findSignatureInCurrentBuffer(buf, signature);
     235        if (pos != null)
     236          {
     237            CompoundEdit compoundEdit = editor.beginCompoundEdit();
     238            editor.addUndo(SimpleEdit.FOLD);
     239            editor.unfoldMethod(pos.getLine());
     240            editor.moveDotTo(pos);
     241            TagCommands.centerTag(editor);
     242            editor.endCompoundEdit(compoundEdit);
     243            editor.updateDisplay();
     244          }
     245      }
     246    editor.setDefaultCursor();
     247  }
     248
     249  private static Position findSignatureInCurrentBuffer(Buffer buffer,
     250                                                       String signature)
     251  {
     252    final List localTags = buffer.getTags(true);
     253    if (localTags == null)
     254      return null;
     255    final int limit = localTags.size();
     256    for (int i = 0; i < limit; i++)
     257      {
     258        LocalTag localTag = (LocalTag) localTags.get(i);
     259        if (localTag.getSignature().equals(signature))
     260          return localTag.getPosition();
     261      }
     262    // We did not find an exact match. The signature may have changed.
     263    // Look for a substring containing the function name and argument list
     264    // only.
     265    RE re = new UncheckedRE("\\w+\\s*\\(.*\\)");
     266    REMatch match = re.getMatch(signature);
     267    if (match != null)
     268      {
     269        String sub = match.toString();
     270        for (int i = 0; i < limit; i++)
     271          {
    240272            LocalTag localTag = (LocalTag) localTags.get(i);
    241             if (localTag.getSignature().equals(signature))
    242                 return localTag.getPosition();
    243         }
    244         // We did not find an exact match. The signature may have changed.
    245         // Look for a substring containing the function name and argument list
    246         // only.
    247         RE re = new UncheckedRE("\\w+\\s*\\(.*\\)");
    248         REMatch match = re.getMatch(signature);
    249         if (match != null) {
    250             String sub = match.toString();
    251             for (int i = 0; i < limit; i++) {
    252                 LocalTag localTag = (LocalTag) localTags.get(i);
    253                 if (localTag.getSignature().indexOf(sub) >= 0)
    254                     return localTag.getPosition();
    255             }
    256         }
    257         return null;
    258     }
     273            if (localTag.getSignature().indexOf(sub) >= 0)
     274              return localTag.getPosition();
     275          }
     276      }
     277    return null;
     278  }
    259279}
Note: See TracChangeset for help on using the changeset viewer.