From: <sh...@us...> - 2008-09-21 20:14:45
|
Revision: 13743 http://jedit.svn.sourceforge.net/jedit/?rev=13743&view=rev Author: shlomy Date: 2008-09-21 20:14:38 +0000 (Sun, 21 Sep 2008) Log Message: ----------- Slightly improved context finder. Modified Paths: -------------- plugins/CtagsInterface/trunk/src/context/MemberContext.java plugins/CtagsInterface/trunk/src/ctags/CtagsInterfacePlugin.java Added Paths: ----------- plugins/CtagsInterface/trunk/src/context/NamespaceMemberContext.java Modified: plugins/CtagsInterface/trunk/src/context/MemberContext.java =================================================================== --- plugins/CtagsInterface/trunk/src/context/MemberContext.java 2008-09-21 13:21:27 UTC (rev 13742) +++ plugins/CtagsInterface/trunk/src/context/MemberContext.java 2008-09-21 20:14:38 UTC (rev 13743) @@ -13,39 +13,14 @@ public class MemberContext extends FunctionContextProvider implements IContextFinder { - static String [] scopes = - "class struct union enum interface namespace".split(" "); - @Override public String getContext(String identifier, Buffer buffer, int line, int pos) { String namespace = getMemberNamespace(buffer, line); if (namespace == null) return null; - StringBuffer sb = new StringBuffer(); - HashSet<String> columns = CtagsInterfacePlugin.getTagColumns(); - boolean first = true; - for (String scope: scopes) { - String cname = TagDB.extension2column(scope); - if (! columns.contains(cname)) - continue; - if (! first) - sb.append(" OR "); - else - first = false; - sb.append(TagDB.extension2column(scope) + "=" + TagDB.quote(namespace)); - } - Query q = CtagsInterfacePlugin.getBasicTagQuery(); - q.addCondition("(" + sb.toString() + ")"); - q.addCondition(TagDB.TAGS_NAME + "=" + TagDB.quote(identifier)); - ResultSet rs; - boolean isMember = false; - try { - rs = CtagsInterfacePlugin.getDB().query(q); - isMember = rs.next(); - rs.close(); - } catch (SQLException e) { - } + NamespaceMemberContext c = new NamespaceMemberContext(namespace); + boolean isMember = c.isMember(identifier); return isMember ? namespace : null; } Added: plugins/CtagsInterface/trunk/src/context/NamespaceMemberContext.java =================================================================== --- plugins/CtagsInterface/trunk/src/context/NamespaceMemberContext.java (rev 0) +++ plugins/CtagsInterface/trunk/src/context/NamespaceMemberContext.java 2008-09-21 20:14:38 UTC (rev 13743) @@ -0,0 +1,91 @@ +package context; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Vector; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import ctags.CtagsInterfacePlugin; +import ctags.Tag; +import db.Query; +import db.TagDB; + +public class NamespaceMemberContext { + static String [] scopes = + "class struct union enum interface namespace".split(" "); + private String namespace; + + public NamespaceMemberContext(String namespace) { + this.namespace = namespace; + } + private Vector<Tag> getMember(String member) { + StringBuffer sb = new StringBuffer(); + HashSet<String> columns = CtagsInterfacePlugin.getTagColumns(); + boolean first = true; + for (String scope: scopes) { + String cname = TagDB.extension2column(scope); + if (! columns.contains(cname)) + continue; + if (! first) + sb.append(" OR "); + else + first = false; + sb.append(TagDB.extension2column(scope) + "=" + TagDB.quote(namespace)); + } + Query q = CtagsInterfacePlugin.getBasicTagQuery(); + q.addCondition("(" + sb.toString() + ")"); + q.addCondition(TagDB.TAGS_NAME + "=" + TagDB.quote(member)); + ResultSet rs; + Vector<Tag> tags = null; + TagDB db = CtagsInterfacePlugin.getDB(); + try { + rs = db.query(q); + tags = db.getResultSetTags(rs); + rs.close(); + } catch (SQLException e) { + } + return tags; + } + public boolean isMember(String identifier) { + Vector<Tag> tags = getMember(identifier); + return (tags != null && (! tags.isEmpty())); + } + public String read(String file, int line) { + String text = null; + BufferedReader input; + // Ignore exceptions, tag database may be outdated + try { + input = new BufferedReader(new FileReader(file)); + while (line > 0) + text = input.readLine(); + input.close(); + } catch (FileNotFoundException e) { + } catch (IOException e) { + } + return text; + } + public String getContext(String member) { + if (namespace == null) + return null; + Vector<Tag> tags = getMember(member); + if (tags.isEmpty()) + return null; + Tag t = tags.firstElement(); + // Parse the declaration of the member to find its type. + Pattern pat = CaretContext.getVarDeclPattern(member); + String line = read(t.getFile(), t.getLine()); + if (line == null) + return null; + Matcher m = pat.matcher(line); + if (m.matches()) + return m.group(1); + return null; + } + +} Modified: plugins/CtagsInterface/trunk/src/ctags/CtagsInterfacePlugin.java =================================================================== --- plugins/CtagsInterface/trunk/src/ctags/CtagsInterfacePlugin.java 2008-09-21 13:21:27 UTC (rev 13742) +++ plugins/CtagsInterface/trunk/src/ctags/CtagsInterfacePlugin.java 2008-09-21 20:14:38 UTC (rev 13743) @@ -292,10 +292,16 @@ return; Vector<String> completions = new Vector<String>(); String prefix = getDestinationTag(view); + if (prefix == null) + return; for (Tag member: members) { if (member.getName().startsWith(prefix)) completions.add(member.getName()); } + if (completions.isEmpty()) { + JOptionPane.showMessageDialog(view, "No completions"); + return; + } String [] options = new String[completions.size()]; int i = 0; for (String completion: completions) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |