Skip to content

Commit ca5d26b

Browse files
committed
Generating code in APs and compiling Java files is mostly working
1 parent 88477fd commit ca5d26b

File tree

6 files changed

+371
-127
lines changed

6 files changed

+371
-127
lines changed

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ dependencies {
4848
testImplementation "org.mockito:mockito-core:2.23.4"
4949
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.0.0"
5050

51-
compile "me.eugeniomarletti.kotlin.metadata:kotlin-metadata:1.4.0"
51+
testCompile "me.eugeniomarletti.kotlin.metadata:kotlin-metadata:1.4.0"
52+
testCompile 'com.squareup:kotlinpoet:1.0.0-RC1'
5253

5354
testImplementation "com.squareup.okio:okio:2.1.0"
5455
testImplementation 'io.github.classgraph:classgraph:4.6.10'

src/test/kotlin/JavacUtils.kt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.tschuchort.compiletest
2+
3+
import org.jetbrains.kotlin.incremental.isJavaFile
4+
import java.io.*
5+
import java.net.URI
6+
import java.net.URL
7+
import java.nio.charset.Charset
8+
import javax.tools.JavaCompiler
9+
import javax.tools.JavaFileObject
10+
import javax.tools.SimpleJavaFileObject
11+
12+
/**
13+
* A [JavaFileObject] created from a source [File].
14+
*
15+
* Used for interfacing with javac ([JavaCompiler]).
16+
*/
17+
internal class FileJavaFileObject(val sourceFile: File, val charset: Charset = Charset.defaultCharset())
18+
: SimpleJavaFileObject(sourceFile.toURI(), deduceKind(sourceFile.toURI())) {
19+
20+
init {
21+
require(sourceFile.isFile)
22+
require(sourceFile.canRead())
23+
}
24+
25+
companion object {
26+
private fun deduceKind(uri: URI): JavaFileObject.Kind
27+
= JavaFileObject.Kind.values().firstOrNull {
28+
uri.path.endsWith(it.extension, ignoreCase = true)
29+
} ?: JavaFileObject.Kind.OTHER
30+
}
31+
32+
override fun openInputStream(): InputStream = sourceFile.inputStream()
33+
34+
override fun getCharContent(ignoreEncodingErrors: Boolean): CharSequence
35+
= sourceFile.readText(charset)
36+
}
37+
38+
/**
39+
* A [JavaFileObject] created from a [String].
40+
*
41+
* Used for interfacing with javac ([JavaCompiler]).
42+
*/
43+
internal class StringJavaFileObject(className: String, private val contents: String)
44+
: SimpleJavaFileObject(
45+
URI.create("string:///" + className.replace('.', '/') + JavaFileObject.Kind.SOURCE.extension),
46+
JavaFileObject.Kind.SOURCE
47+
){
48+
private var _lastModified = System.currentTimeMillis()
49+
50+
override fun getCharContent(ignoreEncodingErrors: Boolean): CharSequence = contents
51+
52+
override fun openInputStream(): InputStream
53+
= ByteArrayInputStream(contents.toByteArray(Charset.defaultCharset()))
54+
55+
override fun openReader(ignoreEncodingErrors: Boolean): Reader = StringReader(contents)
56+
57+
override fun getLastModified(): Long = _lastModified
58+
}

0 commit comments

Comments
 (0)