Skip to content

Commit 9a5aead

Browse files
committed
Add AutoCompletionResult class
1 parent fb8f4fa commit 9a5aead

File tree

10 files changed

+94
-46
lines changed

10 files changed

+94
-46
lines changed

src/main/java/org/scijava/script/AbstractScriptLanguage.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
package org.scijava.script;
3333

34+
import javax.script.ScriptEngine;
3435
import javax.script.ScriptEngineFactory;
3536

3637
import org.scijava.plugin.AbstractRichPlugin;
@@ -72,11 +73,6 @@ public String getLanguageName() {
7273
if (info != null) name = info.getName();
7374
return name != null && !name.isEmpty() ? name : inferNameFromClassName();
7475
}
75-
76-
@Override
77-
public AutoCompleter getAutoCompleter() {
78-
return new DefaultAutoCompleter(getScriptEngine());
79-
}
8076

8177
// -- Helper methods --
8278

src/main/java/org/scijava/script/ScriptLanguage.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.scijava.plugin.Plugin;
4343
import org.scijava.plugin.RichPlugin;
4444
import org.scijava.plugin.SingletonPlugin;
45+
import org.scijava.script.autocompletion.DefaultAutoCompleter;
4546
import org.scijava.util.VersionUtils;
4647

4748
/**
@@ -152,6 +153,8 @@ default String getEngineVersion() {
152153
return "0.0";
153154
}
154155

155-
public AutoCompleter getAutoCompleter();
156+
default AutoCompleter getAutoCompleter() {
157+
return new DefaultAutoCompleter(this);
158+
}
156159

157160
}

src/main/java/org/scijava/script/autocompletion/AbstractAutoCompleter.java

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,37 +31,68 @@
3131
package org.scijava.script.autocompletion;
3232

3333
import java.util.ArrayList;
34-
import java.util.HashMap;
35-
import java.util.Map;
34+
import java.util.Collections;
35+
import java.util.Comparator;
36+
import java.util.List;
37+
import javax.script.Bindings;
38+
import javax.script.ScriptContext;
3639
import javax.script.ScriptEngine;
40+
import org.scijava.script.ScriptLanguage;
3741

3842
/**
3943
*
4044
* @author Hadrien Mary
4145
*/
4246
public abstract class AbstractAutoCompleter implements AutoCompleter {
4347

44-
protected ScriptEngine engine = null;
48+
protected ScriptLanguage scriptLanguage = null;
4549

46-
public AbstractAutoCompleter(ScriptEngine engine) {
47-
this.engine = engine;
50+
public AbstractAutoCompleter(ScriptLanguage scriptLanguage) {
51+
this.scriptLanguage = scriptLanguage;
4852
}
4953

5054
@Override
51-
public Map<String, Object> autocomplete(String code) {
52-
return autocomplete(code, 0);
55+
public AutoCompletionResult autocomplete(String code, ScriptEngine engine) {
56+
return autocomplete(code, 0, engine);
5357
}
54-
58+
5559
@Override
56-
public Map<String, Object> autocomplete(String code, int i) {
57-
Map<String, Object> result = new HashMap<>();
58-
result.put("matches", new ArrayList<>());
59-
result.put("startIndex", 0);
60-
return result;
60+
public AutoCompletionResult autocomplete(String code, int index, ScriptEngine engine) {
61+
62+
List<String> matches = new ArrayList<>();
63+
int startIndex = 0;
64+
65+
// Naive autocompletion with variables in the engine scope
66+
matches.addAll(engineVariablesCompleter(code, index, engine));
67+
68+
// Sort matches alphabetcially
69+
Collections.sort(matches, new SortIgnoreCase());
70+
71+
// Return results. For now we ignore index and startIndex.
72+
return new AutoCompletionResult(matches, startIndex);
6173
}
6274

63-
@Override
64-
public ScriptEngine getScriptEngine() {
65-
return this.engine;
75+
private List<String> engineVariablesCompleter(String code, int index, ScriptEngine engine) {
76+
List<String> matches = new ArrayList<>();
77+
78+
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
79+
80+
for (String key : bindings.keySet()) {
81+
if (key.toLowerCase().startsWith(code.toLowerCase())) {
82+
matches.add(key);
83+
}
84+
}
85+
86+
return matches;
87+
}
88+
89+
public class SortIgnoreCase implements Comparator<Object> {
90+
91+
@Override
92+
public int compare(Object o1, Object o2) {
93+
String s1 = (String) o1;
94+
String s2 = (String) o2;
95+
return s1.toLowerCase().compareTo(s2.toLowerCase());
96+
}
6697
}
6798
}

src/main/java/org/scijava/script/autocompletion/AutoCompleter.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
*/
3131
package org.scijava.script.autocompletion;
3232

33-
import java.util.Map;
3433
import javax.script.ScriptEngine;
3534

3635
/**
@@ -39,9 +38,7 @@
3938
*/
4039
public interface AutoCompleter {
4140

42-
public Map<String, Object> autocomplete(String code);
41+
public AutoCompletionResult autocomplete(String code, ScriptEngine engine);
4342

44-
public Map<String, Object> autocomplete(String code, int i);
45-
46-
public ScriptEngine getScriptEngine();
43+
public AutoCompletionResult autocomplete(String code, int startIndex, ScriptEngine engine);
4744
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package org.scijava.script.autocompletion;
7+
8+
import java.util.List;
9+
10+
/**
11+
*
12+
* @author hadim
13+
*/
14+
public class AutoCompletionResult {
15+
16+
protected List<String> matches;
17+
protected int startIndex;
18+
19+
public AutoCompletionResult(List<String> matches) {
20+
this(matches, 0);
21+
}
22+
23+
public AutoCompletionResult(List<String> matches, int startIndex) {
24+
this.matches = matches;
25+
this.startIndex = startIndex;
26+
}
27+
28+
public int getStartIndex() {
29+
return this.startIndex;
30+
}
31+
32+
public List<String> getMatches() {
33+
return this.matches;
34+
}
35+
36+
}

src/main/java/org/scijava/script/autocompletion/DefaultAutoCompleter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@
3030
*/
3131
package org.scijava.script.autocompletion;
3232

33-
import javax.script.ScriptEngine;
33+
import org.scijava.script.ScriptLanguage;
3434

3535
/**
3636
*
3737
* @author Hadrien Mary
3838
*/
3939
public class DefaultAutoCompleter extends AbstractAutoCompleter {
4040

41-
public DefaultAutoCompleter(ScriptEngine engine) {
42-
super(engine);
41+
public DefaultAutoCompleter(ScriptLanguage scriptLanguage) {
42+
super(scriptLanguage);
4343
}
4444

4545
}

src/test/java/org/scijava/menu/MenuServiceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ public void tearDown() {
6868
*/
6969
@Test
7070
public void testMenuCreation() {
71-
//menuService.getMenu();
71+
menuService.getMenu();
7272
}
7373
}

src/test/java/org/scijava/script/ScriptEngineTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,6 @@ public List<String> getNames() {
101101
public List<String> getExtensions() {
102102
return Arrays.asList("rot13");
103103
}
104-
105-
@Override
106-
public AutoCompleter getAutoCompleter() {
107-
return new DefaultAutoCompleter(getScriptEngine());
108-
}
109104
}
110105

111106
private static class Rot13Engine extends AbstractScriptEngine {

src/test/java/org/scijava/script/ScriptFinderTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,11 +243,6 @@ public ScriptEngine getScriptEngine() {
243243
throw new IllegalStateException();
244244
}
245245

246-
@Override
247-
public AutoCompleter getAutoCompleter() {
248-
return new DefaultAutoCompleter(getScriptEngine());
249-
}
250-
251246
}
252247

253248
}

src/test/java/org/scijava/script/ScriptInfoTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,6 @@ public List<String> getNames() {
287287
public List<String> getExtensions() {
288288
return Arrays.asList("bsizes");
289289
}
290-
291-
@Override
292-
public AutoCompleter getAutoCompleter() {
293-
return new DefaultAutoCompleter(getScriptEngine());
294-
}
295290
}
296291

297292
// -- Test script langauge --

0 commit comments

Comments
 (0)