Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java: Add test for a JavacTool-based compiler that doesn't use standard JavaFileObjects #18305

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import javax.lang.model.element.Modifier;
import javax.lang.model.element.NestingKind;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.ToolProvider;
import java.io.*;
import java.net.URI;
import java.util.List;
import java.util.Objects;

public class Compiler {
public static void main(String[] args) {

JavaCompiler.CompilationTask jc = ToolProvider.getSystemJavaCompiler().getTask(
null, null, null, null, null,
List.of(
new JavaFileObject() {
@Override
public Kind getKind() {
return Kind.SOURCE;
}

@Override
public boolean isNameCompatible(String simpleName, Kind kind) {
return Objects.equals(simpleName, "Main");
}

@Override
public NestingKind getNestingKind() {
return null;
}

@Override
public Modifier getAccessLevel() {
return null;
}

@Override
public URI toUri() {
return URI.create("https://nonesuch.imaginary/somedir/Main.java");
}

@Override
public String getName() {
return "Main.java";
}

@Override
public InputStream openInputStream() throws IOException {
return new ByteArrayInputStream(this.getCharContent(true).toString().getBytes());
}

@Override
public OutputStream openOutputStream() throws IOException {
throw new IOException("No output allowed");
}

@Override
public Reader openReader(boolean ignoreEncodingErrors) throws IOException {
return new StringReader(this.getCharContent(ignoreEncodingErrors).toString());
}

@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return "public class Main { }";
}

@Override
public Writer openWriter() throws IOException {
throw new IOException("No output allowed");
}

@Override
public long getLastModified() {
return 0;
}

@Override
public boolean delete() {
return false;
}

@Override
public String toString() {
return "In-memory file with URI " + this.toUri();
}
}
)
);

jc.call();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
| Main |
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import commands

def test(codeql, java):
commands.run("javac Compiler.java")
codeql.database.create(command = "java Compiler")
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import java

from Class c
where c.fromSource()
select c.getName()
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
category: minorAnalysis
---
* `JavacTool`-based compiler interception no longer requires an `--add-opens` directive when `FileObject.toUri` is accessible.
* `JavacTool`-based compiler interception no longer throws an exception visible to the program using `JavacTool` on failure to extract a file path from a passed `JavaFileObject`.
* `JavacTool`-based compiler interception now supports files that don't simply wrap a `file://` URL, such as a source file inside a JAR, or an in-memory file, but which do implement `getCharContent`.
Loading