Skip to content

Commit c8619d6

Browse files
committed
Fixed autocompletion on instance members (fixes #108)
1 parent a389c3c commit c8619d6

File tree

3 files changed

+49
-10
lines changed

3 files changed

+49
-10
lines changed

src/javarepl/completion/InstanceMemberCompleter.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.googlecode.totallylazy.Option;
44
import com.googlecode.totallylazy.Sequence;
55
import com.googlecode.totallylazy.Sequences;
6+
import com.googlecode.totallylazy.reflection.Types;
67
import javarepl.Evaluator;
78
import javarepl.reflection.ClassReflection;
89
import javarepl.reflection.MemberReflection;
@@ -33,16 +34,17 @@ public CompletionResult call(String expression) throws Exception {
3334
final Boolean canComplete = packagePart.matches("[a-zA-Z0-9\\$_\\\\.\\(\\[\\]]*") && packagePart.contains(".");
3435

3536
final int beginIndex = packagePart.lastIndexOf('.') + 1;
36-
Option<Type> aClass = canComplete
37-
? evaluator.typeOfExpression(packagePart.substring(0, beginIndex - 1))
38-
: none(Type.class);
37+
Option<Class<?>> aClass = canComplete
38+
? evaluator.typeOfExpression(packagePart.substring(0, beginIndex - 1)).map(Types::classOf)
39+
: none();
3940

4041
if (aClass.isDefined()) {
4142
ClassReflection classReflection = reflectionOf(aClass.get());
4243

4344
Sequence<MemberReflection> join = Sequences.empty(MemberReflection.class)
4445
.join(classReflection.declaredFields())
45-
.join(classReflection.declaredMethods());
46+
.join(classReflection.declaredMethods())
47+
.unique();
4648

4749
Sequence<CompletionCandidate> candidates = join
4850
.filter(isPublic().and(not(isStatic())))

test/javarepl/completion/InstanceMemberCompleterTest.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
package javarepl.completion;
22

3+
import javarepl.completion.helpers.SimpleCompletionInstance;
34
import org.junit.Test;
45

6+
import static com.googlecode.totallylazy.Sequences.sequence;
57
import static javarepl.completion.CompleterTestHelper.*;
68
import static org.junit.Assert.assertThat;
79

810
public class InstanceMemberCompleterTest {
911

1012
@Test
11-
public void shouldCompleteStaticMembers() {
12-
InstanceMemberCompleter completer = new InstanceMemberCompleter(evaluator());
13-
String expression = TestOuterClass.class.getCanonicalName() + ".staticField.";
13+
public void shouldCompleteInstance() {
14+
String expression = "ci.over";
15+
String instanceClassName = SimpleCompletionInstance.class.getCanonicalName();
16+
InstanceMemberCompleter completer = new InstanceMemberCompleter(evaluator("ci = new "+instanceClassName+"()"));
1417

15-
// CompletionResult result = completer.apply(expression);
16-
// assertThat(result,
17-
// completesTo(candidates("staticField", "staticMethod("), position(expression.length())));
18+
CompletionResult result = completer.apply(expression);
19+
20+
assertThat(result,
21+
completesTo(candidates(new CompletionCandidate("overloadedMethod(", sequence("int overloadedMethod()", "int overloadedMethod(int)", "int overloadedMethod(int, int)"))),
22+
position(3)));
1823

1924
assertThat(completer.apply("invalid"), completesTo(candidatesValues(), position(0)));
2025
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package javarepl.completion.helpers;
2+
3+
4+
import java.util.Date;
5+
6+
7+
public class SimpleCompletionInstance {
8+
public void voidMethod() {
9+
}
10+
11+
12+
public int primitiveTypeReturningMethod() {
13+
return 0;
14+
}
15+
16+
public Date complexTypeReturningMethod() {
17+
return new Date();
18+
}
19+
20+
public int overloadedMethod() {
21+
return 0;
22+
}
23+
24+
public int overloadedMethod(int param) {
25+
return param;
26+
}
27+
28+
public int overloadedMethod(int param1, int param2) {
29+
return param1 + param2;
30+
}
31+
32+
}

0 commit comments

Comments
 (0)