redef class MModule
# Extra Java files to compile with the module
- private var extra_java_files: nullable Array[JavaFile] = null
+ private var extra_java_files: nullable Array[ExtraJavaFile] = null
end
private class JavaExtraFilesPhase
var mmodule = nmodule.mmodule.as(not null)
var java_files = mmodule.extra_java_files
if java_files == null then
- java_files = new Array[JavaFile]
+ java_files = new Array[ExtraJavaFile]
mmodule.extra_java_files = java_files
end
var format_error = "Syntax Error: `{annot_name}` expects its arguments to be paths to java files."
for arg in args do
- var path = arg.as_string
- if path == null then
+ var name = arg.as_string
+ if name == null or name.is_empty then
modelbuilder.error(arg, format_error)
return
end
+ var path = name.split(".").last + ".java"
+
# Append specified path to directory of the Nit source file
var source_file = nat.location.file
if source_file != null then path = "{source_file.filename.dirname}/{path}"
continue
end
- var file = new JavaFile(path)
+ var file = new ExtraJavaFile(name, path)
mmodule.ffi_files.add file
java_files.add file
end
do
super
- # also copy over the java files
+ # Also copy over the extra Java files
var extra_java_files = mmodule.extra_java_files
if extra_java_files != null then for file in extra_java_files do
- var path = file.filename
- path.file_copy_to("{compdir}/{path.basename}")
+
+ var dir = compdir / file.filename.dirname
+ dir.mkdir
+
+ file.src_path.file_copy_to(compdir/file.filename)
end
end
end
+
+# User supplied Java file to include with the app for use from the FFI
+class ExtraJavaFile
+ super JavaFile
+
+ autoinit full_name, src_path
+
+ redef var full_name
+
+ # Path to the original user file
+ var src_path: String
+
+ redef fun filename do return full_name.replace(".", "/") + ".java"
+end
class JavaFile
super ExternFile
- redef fun makefile_rule_name do return "{filename.basename(".java")}.class"
- redef fun makefile_rule_content do return "javac {filename.basename} -d ."
+ # Full Java class name: package and class
+ fun full_name: String do return filename.basename(".java")
+
+ redef fun makefile_rule_name do return full_name.replace(".", "/") + ".class"
+ redef fun makefile_rule_content do return "javac {filename} -d ."
redef fun add_to_jar do return true
end
for mmodule in compiler.mainmodule.in_importation.greaters do
var extra_java_files = mmodule.extra_java_files
if extra_java_files != null then for file in extra_java_files do
- var path = file.filename
- path.file_copy_to(java_dir/path.basename)
+ var path = file.src_path
+ var dir = file.filename.dirname
+ (java_dir/dir).mkdir
+ path.file_copy_to(java_dir/file.filename)
end
end