Skip to content

Commit f71a9ee

Browse files
committed
Fix issue #17, inner class resolving incorrecly from another file
1 parent 6fcf88e commit f71a9ee

File tree

3 files changed

+70
-29
lines changed

3 files changed

+70
-29
lines changed

SublimeJava.class

912 Bytes
Binary file not shown.

SublimeJava.java

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.net.URL;
2828
import java.io.BufferedReader;
2929
import java.io.InputStreamReader;
30+
import java.util.*;
3031

3132

3233
public class SublimeJava
@@ -66,6 +67,19 @@ public static String[] getCompletion(Field f, String filter)
6667
}
6768
private static final String sep = ";;--;;";
6869

70+
private static String getClassname(String pack, String clazz)
71+
{
72+
if (pack.endsWith(".*"))
73+
{
74+
return pack.substring(0, pack.length()-2) + "." + clazz;
75+
}
76+
else if (pack.length() != 0)
77+
{
78+
return pack + "$" + clazz;
79+
}
80+
return clazz;
81+
}
82+
6983
public static void main(String... args)
7084
{
7185
try
@@ -78,14 +92,41 @@ public static void main(String... args)
7892
else if (args[0].equals("-findclass"))
7993
{
8094
String line = null;
95+
ArrayList<String> packages = new ArrayList<String>();
8196
try
8297
{
8398
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
8499
while ((line = in.readLine()) != null)
85100
{
101+
packages.add(line);
102+
}
103+
}
104+
catch (Exception e)
105+
{
106+
}
107+
for (String pack : packages)
108+
{
109+
try
110+
{
111+
Class c = Class.forName(getClassname(pack, args[1]));
112+
System.out.println("" + c.getName());
113+
return;
114+
}
115+
catch (Exception e)
116+
{
117+
}
118+
}
119+
// Still haven't found anything, so try to see if it's an internal class
120+
for (String pack : packages)
121+
{
122+
String classname = getClassname(pack, args[1]);
123+
while (classname.indexOf('.') != -1)
124+
{
125+
int idx = classname.lastIndexOf('.');
126+
classname = classname.substring(0, idx) + "$" + classname.substring(idx+1);
86127
try
87128
{
88-
Class c = Class.forName(line + "." + args[1]);
129+
Class c = Class.forName(classname);
89130
System.out.println("" + c.getName());
90131
return;
91132
}
@@ -94,9 +135,6 @@ else if (args[0].equals("-findclass"))
94135
}
95136
}
96137
}
97-
catch (Exception e)
98-
{
99-
}
100138
return;
101139
}
102140
Class<?> c = Class.forName(args[1]);

sublimejava.py

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646

4747

4848
scriptdir = os.path.dirname(os.path.abspath(__file__))
49-
enableCache = True
5049

5150

5251
def get_settings():
@@ -324,48 +323,52 @@ def find_absolute_of_type(self, data, full_data, type):
324323
return type
325324
return "%s.%s" % (thispackage, type)
326325
outer = type.split("$")[0]
326+
outer = outer.split(".")[0]
327327
regex = "[ \t]*import[ \t]+(.*)\.%s" % outer
328328
match = re.search(regex, data)
329329
if not match is None:
330-
return "%s.%s" % (match.group(1), type)
330+
classname = "%s.%s" % (match.group(1), type)
331+
if cache.get_cached_class_exists(classname):
332+
return classname
333+
# Try and see if it's an inner class then
334+
count = 0
335+
while "." in classname and count < 10:
336+
count += 1
337+
classname = "%s$%s" % (classname[:classname.rfind(".")], classname[classname.rfind(".")+1:])
338+
print classname
339+
if cache.get_cached_class_exists(classname):
340+
return classname
331341

332342
# Couldn't find the absolute name of this class so try to
333343
# see if it's in one of the packages imported as
334344
# "import package.*;", or in java.lang
335345
#
336-
packages = re.findall("[ \t]*import[ \t]+(.*)\.\*;", data)
337-
packages.append("java.lang")
338-
packages.append(thispackage)
339-
if enableCache:
340-
packages.append("") # for int, boolean, etc
341-
for package in packages:
342-
classname = package + "." + type
343-
if cache.get_cached_class_exists(classname):
344-
return classname
346+
packages = re.findall("[ \t]*import[ \t]+(.*);", data)
347+
packages.append("java.lang.*")
348+
packages.append(thispackage + ".*")
349+
packages.append("") # for int, boolean, etc
350+
for package in packages:
351+
classname = type
352+
if package.endswith(".*"):
353+
classname = package[:-2] + "." + type
354+
elif len(package):
355+
classname = package + "$" + type
356+
if cache.get_cached_class_exists(classname):
357+
return classname
345358

346359
# Couldn't find a cached version, invoke java
347-
output = run_java("%s -findclass %s" % (get_cmd(), type), "\n".join(packages)).strip()
348-
if len(output) and enableCache:
360+
output = run_java("%s -findclass '%s'" % (get_cmd(), type), "\n".join(packages)).strip()
361+
if len(output):
349362
cache.cache_class(output)
350363
if len(output) == 0 and "." in type:
351364
return self.find_absolute_of_type(data, full_data, type.replace(".", "$"))
352365
return output
353366

354367
def complete_class(self, absolute_classname, prefix):
355-
if enableCache:
356-
return cache.complete(absolute_classname, prefix)
357-
else:
358-
stdout = run_java("%s -complete %s %s" % (get_cmd(), absolute_classname, prefix))
359-
ret = [tuple(line.split(";;--;;")) for line in stdout.split("\n")[:-1]]
360-
return sorted(ret, key=lambda a: a[0])
368+
return cache.complete(absolute_classname, prefix)
361369

362370
def get_return_type(self, absolute_classname, prefix):
363-
ret = ""
364-
if enableCache:
365-
ret = cache.get_return_type(absolute_classname, prefix)
366-
else:
367-
stdout = run_java("%s -returntype %s %s" % (get_cmd(), absolute_classname, prefix))
368-
ret = stdout.strip()
371+
ret = cache.get_return_type(absolute_classname, prefix)
369372
match = re.search("(\[L)?([^;]+)", ret)
370373
if match:
371374
return match.group(2)

0 commit comments

Comments
 (0)