Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit 8b8c82d

Browse files
committed
Updated scripts and fixed incremental compilation of shared libraries
1 parent e183210 commit 8b8c82d

File tree

17 files changed

+148
-59
lines changed

17 files changed

+148
-59
lines changed

android-tree-sitter/build.gradle

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ publishing {
4444
}
4545

4646
final def archs = ["aarch64", "arm", "x86", "x86_64"]
47+
def inputs = rootProject.file("lib")
4748
def ndkDir = System.getenv("ANDROID_NDK_HOME")
4849
def javaHome = System.getenv("JAVA_HOME")
4950

@@ -66,45 +67,46 @@ if (ndkDir == null || javaHome == null) {
6667
}
6768

6869
for (def arch : archs) {
69-
task("buildSharedObjectFor${arch.capitalize()}") { task ->
70+
task("buildSharedObjectFor${arch.capitalize()}") { Task task ->
7071
def classifier = classifierFor(arch)
71-
buildFor(task, arch, classifier, ndkDir, javaHome)
72+
task.inputs.dir inputs
73+
task.outputs.file sharedOutput(classifier)
74+
75+
task.doLast {
76+
buildFor(arch, classifier, ndkDir, javaHome)
77+
}
7278
}
7379
}
7480

75-
def buildFor(Task task, String arch, String classifier, String ndkDir, String javaHome) {
76-
def outputFile = new File("${rootProject.projectDir.path}/output/${classifier}/libts.so")
77-
def inputs = rootProject.fileTree("lib").files
78-
task.inputs.files(inputs)
79-
task.outputs.file outputFile
80-
81-
task.doLast {
82-
exec {
83-
environment("JAVA_HOME", javaHome)
84-
if (classifier == "host") {
85-
commandLine "${rootProject.projectDir.path}/build.sh", "-s", "python", "java"
86-
} else {
87-
commandLine "${rootProject.projectDir.path}/build.sh",
88-
"-a", arch,
89-
"-m", android.defaultConfig.minSdk,
90-
"-n", ndkDir,
91-
"python", "java"
92-
}
81+
def buildFor(String arch, String classifier, String ndkDir, String javaHome) {
82+
exec {
83+
environment("JAVA_HOME", javaHome)
84+
if (classifier == "host") {
85+
commandLine "${rootProject.projectDir.path}/build.sh", "-s", "python", "java"
86+
} else {
87+
commandLine "${rootProject.projectDir.path}/build.sh",
88+
"-a", arch,
89+
"-m", android.defaultConfig.minSdk,
90+
"-n", ndkDir,
91+
"python", "java"
9392
}
9493
}
9594
}
9695

97-
task buildSharedObjectForHost { task ->
98-
buildFor(task, "", "host", ndkDir, javaHome)
96+
task buildSharedObjectForHost { Task task ->
97+
task.inputs.dir inputs
98+
task.outputs.file sharedOutput("host")
99+
task.doLast {
100+
buildFor("", "host", ndkDir, javaHome)
101+
}
99102
}
100103

101104
task buildSharedObjectForAll() {
102-
archs.forEach {
103-
dependsOn("buildSharedObjectFor${it.capitalize()}")
104-
}
105105
dependsOn("buildSharedObjectForHost")
106+
dependsOn(archs.collect { "buildSharedObjectFor${it.capitalize()}"})
106107
}
107108

109+
@SuppressWarnings('GrMethodMayBeStatic')
108110
String classifierFor(String arch) {
109111
def clangPrefix = arch
110112
def clangSuffix = ""
@@ -120,6 +122,10 @@ String classifierFor(String arch) {
120122
return "${clangPrefix}-linux-android${clangSuffix}${android.defaultConfig.minSdk}"
121123
}
122124

125+
File sharedOutput(String classifier) {
126+
return rootProject.file("output/${classifier}/libts.so")
127+
}
128+
123129
tasks.withType(JavaCompile) {
124130
dependsOn("buildSharedObjectForAll")
125131
}

android-tree-sitter/src/main/java/com/itsaky/androidide/treesitter/TSNode.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,21 @@ public class TSNode {
1313
private long id;
1414
private long tree;
1515

16-
public TSNode() {}
16+
private TSTree mTree;
17+
18+
private TSNode() {}
19+
20+
/**
21+
* Get the syntax tree that this node is associated with.
22+
*
23+
* @return The syntax tree.
24+
*/
25+
public TSTree getTree() {
26+
if (mTree == null) {
27+
mTree = new TSTree(this.tree);
28+
}
29+
return mTree;
30+
}
1731

1832
/**
1933
* Get the child of the given node at the child index.

android-tree-sitter/src/main/java/com/itsaky/androidide/treesitter/TSParser.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ public TSParser() {
1313
this(Native.newParser());
1414
}
1515

16+
private TSTree createTree(long pointer) {
17+
if (pointer == 0) {
18+
return null;
19+
}
20+
return new TSTree(pointer);
21+
}
22+
1623
/**
1724
* Set the language of the given parser.
1825
*
@@ -56,7 +63,8 @@ public TSTree parseString(String source) throws UnsupportedEncodingException {
5663
public TSTree parseString(String source, TSInputEncoding encoding)
5764
throws UnsupportedEncodingException {
5865
byte[] bytes = source.getBytes(encoding.getCharset());
59-
return new TSTree(Native.parseBytes(pointer, bytes, bytes.length, encoding.getFlag()));
66+
final var tree = TSParser.Native.parseBytes(pointer, bytes, bytes.length, encoding.getFlag());
67+
return createTree(tree);
6068
}
6169

6270
/**
@@ -68,7 +76,7 @@ public TSTree parseString(String source, TSInputEncoding encoding)
6876
* @return The parsed tree.
6977
*/
7078
public TSTree parseBytes(byte[] bytes, int bytesLength, int encodingFlag) {
71-
return new TSTree(Native.parseBytes(pointer, bytes, bytesLength, encodingFlag));
79+
return createTree(Native.parseBytes(pointer, bytes, bytesLength, encodingFlag));
7280
}
7381

7482
/**
@@ -92,7 +100,7 @@ public TSTree parseString(TSTree oldTree, String source) throws UnsupportedEncod
92100
public TSTree parseString(TSTree oldTree, String source, TSInputEncoding encoding)
93101
throws UnsupportedEncodingException {
94102
byte[] bytes = source.getBytes(encoding.getCharset());
95-
return new TSTree(
103+
return createTree(
96104
Native.incrementalParseBytes(
97105
pointer, oldTree.getPointer(), bytes, bytes.length, encoding.getFlag()));
98106
}
42.8 KB
Binary file not shown.
42.7 KB
Binary file not shown.
42.6 KB
Binary file not shown.
40.3 KB
Binary file not shown.

android-tree-sitter/src/test/java/com/itsaky/androidide/treesitter/NodeTest.java

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,30 @@
55
import org.junit.Test;
66

77
import java.io.UnsupportedEncodingException;
8+
import java.nio.charset.StandardCharsets;
89

9-
public class NodeTest extends TestBase {
10+
public class NodeTest extends TreeSitterTest {
1011

1112
@Test
12-
public void testGetChildren() throws UnsupportedEncodingException {
13+
public void multiTest() throws UnsupportedEncodingException {
1314
try (TSParser parser = new TSParser()) {
1415
parser.setLanguage(TSLanguages.python());
1516
final var sourceToParse = "def foo(bar, baz):\n print(bar)\n print(baz)";
16-
try (TSTree tree =
17-
parser.parseString(
18-
"def foo(bar, baz):\n print(bar)\n print(baz)",
19-
TSInputEncoding.TSInputEncodingUTF16)) {
17+
try (TSTree tree = parser.parseString(sourceToParse, TSInputEncoding.TSInputEncodingUTF8)) {
2018
var root = tree.getRootNode();
19+
assertThat(root.getTree().getPointer()).isEqualTo(tree.getPointer());
20+
2121
var symbol = root.getSymbol();
2222
assertThat(tree.getLanguage().getSymbolName(symbol)).isEqualTo("module");
2323
assertThat(root.getFieldNameForChild(0)).isNull();
2424

2525
var start = root.getStartPoint();
26-
assertThat(0).isEqualTo(start.row);
27-
assertThat(0).isEqualTo(start.column);
26+
assertThat(start.row).isEqualTo(0);
27+
assertThat(start.column).isEqualTo(0);
2828

2929
var end = root.getEndPoint();
30-
assertThat(2).isEqualTo(end.row);
31-
assertThat(12).isEqualTo(end.column);
30+
assertThat(end.row).isEqualTo(2);
31+
assertThat(end.column).isEqualTo(12);
3232

3333
var type = root.getType();
3434
assertThat("module").isEqualTo(type);
@@ -37,14 +37,14 @@ public void testGetChildren() throws UnsupportedEncodingException {
3737
assertThat(0).isEqualTo(startByte);
3838

3939
var endByte = root.getEndByte();
40-
assertThat(sourceToParse.getBytes(java.nio.charset.StandardCharsets.UTF_8))
40+
assertThat(sourceToParse.getBytes(StandardCharsets.UTF_8))
4141
.hasLength(endByte);
4242

4343
var children = root.getChildCount();
44-
assertThat(1).isEqualTo(children);
44+
assertThat(children).isEqualTo(1);
4545

4646
var namedChildren = root.getNamedChildCount();
47-
assertThat(1).isEqualTo(namedChildren);
47+
assertThat(namedChildren).isEqualTo(1);
4848

4949
var isNamed = root.isNamed();
5050
assertThat(isNamed).isTrue();
@@ -66,24 +66,39 @@ public void testGetChildren() throws UnsupportedEncodingException {
6666

6767
var function = root.getChild(0);
6868
start = function.getStartPoint();
69-
assertThat(0).isEqualTo(start.row);
70-
assertThat(0).isEqualTo(start.column);
69+
assertThat(start.row).isEqualTo(0);
70+
assertThat(start.column).isEqualTo(0);
7171
assertThat(function.isEqualTo(function)).isTrue();
7272
assertThat(function.getFieldNameForChild(1)).isEqualTo("name");
7373

7474
end = function.getEndPoint();
75-
assertThat(2).isEqualTo(end.row);
76-
assertThat(12).isEqualTo(end.column);
75+
assertThat(end.row).isEqualTo(2);
76+
assertThat(end.column).isEqualTo(12);
7777

7878
type = function.getType();
7979
assertThat("function_definition").isEqualTo(type);
8080

8181
children = function.getChildCount();
82-
assertThat(5).isEqualTo(children);
82+
assertThat(children).isEqualTo(5);
8383

8484
isNull = function.isNull();
8585
assertThat(isNull).isFalse();
8686

87+
var def = function.getChild(0);
88+
assertThat(def.isNull()).isFalse();
89+
assertThat(def.getType()).isEqualTo("def");
90+
assertThat(def.getNextSibling().getType()).isEqualTo("identifier");
91+
assertThat(def.getNextNamedSibling().isEqualTo(def.getNextSibling())).isTrue();
92+
assertThat(def.getNextSibling().getNextSibling().getType()).isEqualTo("parameters");
93+
assertThat(def.getNextSibling().getNextSibling().getNextSibling().getType()).isEqualTo(":");
94+
assertThat(
95+
def.getNextSibling()
96+
.getNextSibling()
97+
.getNextSibling()
98+
.getPreviousSibling()
99+
.getType())
100+
.isEqualTo("parameters");
101+
87102
var body = function.getChildByFieldName("body");
88103

89104
var parent = function.getParent();

android-tree-sitter/src/test/java/com/itsaky/androidide/treesitter/ParserTest.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.nio.file.Paths;
1212

1313
@RunWith(JUnit4.class)
14-
public class ParserTest extends TestBase {
14+
public class ParserTest extends TreeSitterTest {
1515

1616
@Test
1717
public void testParse() throws UnsupportedEncodingException {
@@ -57,4 +57,40 @@ public void testView() throws Throwable {
5757
}
5858
}
5959
}
60+
61+
@Test
62+
public void testTimeout() throws UnsupportedEncodingException {
63+
final var timeout = 1000L; // 1 millisecond
64+
final var start = System.currentTimeMillis();
65+
try (final var parser = new TSParser()) {
66+
parser.setLanguage(TSLanguages.java());
67+
parser.setTimeout(timeout);
68+
assertThat(parser.getTimeout()).isEqualTo(timeout);
69+
try (final var tree =
70+
parser.parseString(readString(Paths.get("./src/test/resources/View.java.txt")))) {
71+
final var timeConsumed = System.currentTimeMillis() - start;
72+
assertThat(tree).isNull();
73+
System.out.println("Parsed in " + timeConsumed + "ms");
74+
}
75+
}
76+
}
77+
78+
@Test
79+
public void testIncrementalParsing() throws UnsupportedEncodingException {
80+
try (final var parser = new TSParser()) {
81+
parser.setLanguage(TSLanguages.java());
82+
parser.setIncludedRanges(
83+
new TSRange[] {new TSRange(21, 65, new TSPoint(0, 21), new TSPoint(0, 65))});
84+
final var source = "public class Main { class Inner { public static void main() {} } }";
85+
try (final var tree = parser.parseString(source)) {
86+
assertThat(tree).isNotNull();
87+
88+
final var root = tree.getRootNode();
89+
assertThat(root).isNotNull();
90+
91+
// errorneous type
92+
assertThat(root.getChild(0).getType()).isEqualTo("local_variable_declaration");
93+
}
94+
}
95+
}
6096
}

android-tree-sitter/src/test/java/com/itsaky/androidide/treesitter/QueryTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
/**
88
* @author Akash Yadav
99
*/
10-
public class QueryTest extends TestBase {
10+
public class QueryTest extends TreeSitterTest {
1111

1212
@Test
1313
public void queryTest() throws Exception {
@@ -19,6 +19,13 @@ public void queryTest() throws Exception {
1919
new TSQuery(tree.getLanguage(), "(class_declaration name: (identifier) @MyClass)");
2020
var cursor = new TSQueryCursor();
2121
cursor.exec(query, tree.getRootNode());
22+
23+
// < 0 = no errors
24+
assertThat(query.getErrorOffset()).isLessThan(0);
25+
assertThat(query.getCaptureCount()).isEqualTo(1);
26+
assertThat(query.getPatternCount()).isEqualTo(1);
27+
assertThat(query.getStringCount()).isEqualTo(0);
28+
2229
var match = cursor.nextMatch();
2330
assertThat(match).isNotNull();
2431
assertThat(match.getCaptures()).isNotNull();
@@ -58,7 +65,8 @@ public void testQueryNoResult() {
5865
parser.setLanguage(TSLanguages.java());
5966
try (final var tree = parser.parseString("public class MyClass {}")) {
6067
var query =
61-
new TSQuery(tree.getLanguage(), "(method_declaration name: (identifier) @NoDeclWithThisName)");
68+
new TSQuery(
69+
tree.getLanguage(), "(method_declaration name: (identifier) @NoDeclWithThisName)");
6270
var cursor = new TSQueryCursor();
6371
cursor.exec(query, tree.getRootNode());
6472
var match = cursor.nextMatch();

0 commit comments

Comments
 (0)