Skip to content

Commit 0cf090d

Browse files
feat(plugin): infer source files
1 parent d031bf5 commit 0cf090d

File tree

7 files changed

+21
-35
lines changed

7 files changed

+21
-35
lines changed

ktreesitter-plugin/README.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,5 @@ grammar {
3535
className = "TreeSitterJava"
3636
// The name of the package
3737
packageName = "io.github.treesitter.ktreesitter.java"
38-
// The source files of the grammar
39-
files = arrayOf(
40-
baseDir.get().resolve("src/parser.c"),
41-
// baseDir.get().resolve("src/scanner.c")
42-
)
4338
}
4439
```

ktreesitter-plugin/src/main/java/io/github/treesitter/ktreesitter/plugin/GrammarFilesTask.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.nio.charset.StandardCharsets;
77
import java.nio.file.Path;
88
import java.util.Arrays;
9+
import java.util.List;
910
import java.util.Map;
1011
import java.util.Objects;
1112
import java.util.regex.Pattern;
@@ -25,8 +26,6 @@ public abstract class GrammarFilesTask extends DefaultTask {
2526

2627
private String grammarName;
2728

28-
private File[] grammarFiles;
29-
3029
private String interopName;
3130

3231
private String libraryName;
@@ -63,18 +62,6 @@ public final void setGrammarName(String grammarName) {
6362
this.grammarName = grammarName;
6463
}
6564

66-
/** Get the source files of the grammar. */
67-
@InputFiles
68-
@PathSensitive(PathSensitivity.RELATIVE)
69-
public final File[] getGrammarFiles() {
70-
return grammarFiles;
71-
}
72-
73-
/** Set the source files of the grammar. */
74-
public final void setGrammarFiles(File[] grammarFiles) {
75-
this.grammarFiles = grammarFiles;
76-
}
77-
7865
/** Get the name of the C interop def file. */
7966
@Input
8067
public final String getInteropName() {
@@ -281,9 +268,8 @@ jniPrefix, jniTransform(name), name
281268

282269
private void generateCmakeLists(Path srcDir) throws GradleException {
283270
var jniBinding = srcDir.resolve("jni").resolve("binding.c");
284-
var files = Arrays.stream(grammarFiles).map(file -> relative(file.toPath()).toString());
285271
var includeDir = relative(grammarDir.toPath().resolve("bindings/c"));
286-
var sources = relative(jniBinding) + " " + String.join(" ", files.toList());
272+
var sources = String.format("%s %s", relative(jniBinding), srcFiles());
287273
var template = readResource("CMakeLists.txt.in")
288274
.replace("@LIBRARY@", libraryName)
289275
.replace("@INCLUDE@", includeDir.toString())
@@ -305,6 +291,15 @@ private Path relative(Path file) {
305291
return getGeneratedSrc().get().getAsFile().toPath().getParent().relativize(file);
306292
}
307293

294+
private String srcFiles() {
295+
var grammarSrcDir = grammarDir.toPath().resolve("src");
296+
var scannerFile = grammarSrcDir.resolve("scanner.c");
297+
if (!scannerFile.toFile().exists()) {
298+
return grammarSrcDir.resolve("parser.c").toString();
299+
}
300+
return String.format("%s %s", grammarSrcDir.resolve("parser.c"), scannerFile);
301+
}
302+
308303
private String readResource(String file) throws GradleException {
309304
try (var stream = getClass().getResourceAsStream("/" + file)) {
310305
var bytes = Objects.requireNonNull(stream).readAllBytes();

ktreesitter-plugin/src/main/java/io/github/treesitter/ktreesitter/plugin/GrammarPlugin.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ public void apply(Project project) {
3030
project.getTasks().register("generateGrammarFiles", GrammarFilesTask.class, it -> {
3131
it.setGrammarDir(extension.getBaseDir().get());
3232
it.setGrammarName(extension.getGrammarName().get());
33-
it.setGrammarFiles(extension.getFiles().get());
3433
it.setInteropName(extension.getInteropName().get());
3534
it.setLibraryName(extension.getLibraryName().get());
3635
it.setPackageName(extension.getPackageName().get());

ktreesitter-plugin/src/main/resources/CMakeLists.txt.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22

33
cmake_minimum_required(VERSION 3.12.0)
44

5-
project(ktreesitter-java LANGUAGES C)
5+
project(@LIBRARY@ LANGUAGES C)
66

77
find_package(JNI REQUIRED)
88

99
set(CMAKE_C_STANDARD 11)
1010

1111
if(MSVC)
1212
add_compile_options(/W3 /wd4244)
13-
else(MSVC)
13+
else()
1414
set(CMAKE_C_VISIBILITY_PRESET hidden)
1515
add_compile_options(-Wall -Wextra
1616
-Wno-unused-parameter
1717
-Werror=implicit-function-declaration)
18-
endif(MSVC)
18+
endif()
1919

2020
include_directories(${JNI_INCLUDE_DIRS} @INCLUDE@)
2121

ktreesitter-plugin/src/main/resources/android.kt.in

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,4 @@ actual object @CLASS@ {
1212
System.loadLibrary("@LIBRARY@")
1313
}
1414

15-
@METHODS@
16-
}
15+
@METHODS@}

ktreesitter-plugin/src/main/resources/jvm.kt.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ actual object @CLASS@ {
2020
}
2121

2222
@METHODS@
23-
2423
@JvmStatic
2524
@Suppress("ConvertToStringTemplate")
2625
@Throws(UnsupportedOperationException::class)

languages/java/build.gradle.kts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ grammar {
2828
grammarName = project.name
2929
className = "TreeSitterJava"
3030
packageName = "io.github.treesitter.ktreesitter.java"
31-
files = arrayOf(
32-
// grammarDir.resolve("src/scanner.c"),
33-
grammarDir.resolve("src/parser.c")
34-
)
3531
}
3632

3733
val generateTask = tasks.generateGrammarFiles.get()
@@ -125,13 +121,16 @@ android {
125121
tasks.withType<CInteropProcess>().configureEach {
126122
if (name.startsWith("cinteropTest")) return@configureEach
127123

128-
val grammarFiles = grammar.files.get()
124+
val srcDir = grammarDir.resolve("src")
125+
val grammarFiles =
126+
if (!srcDir.resolve("scanner.c").isFile) arrayOf(srcDir.resolve("parser.c"))
127+
else arrayOf(srcDir.resolve("parser.c"), srcDir.resolve("scanner.c"))
129128
val grammarName = grammar.grammarName.get()
130129
val runKonan = File(konanHome.get()).resolve("bin")
131130
.resolve(if (os.isWindows) "run_konan.bat" else "run_konan").path
132131
val libFile = libsDir.dir(konanTarget.name).file("libtree-sitter-$grammarName.a").asFile
133132
val objectFiles = grammarFiles.map {
134-
grammarDir.resolve(it.nameWithoutExtension + ".o").path
133+
srcDir.resolve(it.nameWithoutExtension + ".o").path
135134
}.toTypedArray()
136135
val loader = PlatformManager(konanHome.get(), false, konanDataDir.orNull).loader(konanTarget)
137136

@@ -141,7 +140,7 @@ tasks.withType<CInteropProcess>().configureEach {
141140
val argsFile = File.createTempFile("args", null)
142141
argsFile.deleteOnExit()
143142
argsFile.writer().useToRun {
144-
write("-I" + grammarDir.resolve("src").unixPath + "\n")
143+
write("-I" + srcDir.unixPath + "\n")
145144
write("-DTREE_SITTER_HIDE_SYMBOLS\n")
146145
write("-fvisibility=hidden\n")
147146
write("-std=c11\n")

0 commit comments

Comments
 (0)