Merge: doc: fixed some typos and other misc. corrections
[nit.git] / src / ffi / extra_java_files.nit
index 67a5f9d..c355441 100644 (file)
@@ -28,8 +28,8 @@ redef class ToolContext
 end
 
 redef class MModule
-       # Extra Java files to compile with the project
-       private var extra_java_files: nullable Array[JavaFile] = null
+       # Extra Java files to compile with the module
+       private var extra_java_files: nullable Array[ExtraJavaFile] = null
 end
 
 private class JavaExtraFilesPhase
@@ -45,13 +45,13 @@ private class JavaExtraFilesPhase
                var modelbuilder = toolcontext.modelbuilder
 
                if not nmoduledecl isa AModuledecl then
-                       modelbuilder.error(nat, "Syntax error: only the declaration of modules may use \"{annot_name}\".")
+                       modelbuilder.error(nat, "Syntax Error: only the declaration of modules may use `{annot_name}`.")
                        return
                end
 
                var args = nat.n_args
                if args.is_empty then
-                       modelbuilder.error(nat, "Syntax error: \"{annot_name}\" expects at least one argument.")
+                       modelbuilder.error(nat, "Syntax Error: `{annot_name}` expects at least one argument.")
                        return
                end
 
@@ -60,28 +60,30 @@ 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."
+               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}"
 
                        if not path.file_exists then
-                               modelbuilder.error(nat, "FFI with Java error: file \"{path}\" not found.")
+                               modelbuilder.error(nat, "FFI with Java Error: file `{path}` not found.")
                                continue
                        end
 
-                       var file = new JavaFile(path)
+                       var file = new ExtraJavaFile(name, path)
                        mmodule.ffi_files.add file
                        java_files.add file
                end
@@ -93,11 +95,28 @@ redef class JavaLanguage
        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