From 3530dc17c5dc836c826b4a29cff2f3408dc8590d Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Tue, 14 Jun 2022 14:34:30 -0400 Subject: Better syntax for JVM class field imports. --- stdlib/source/library/lux/ffi.jvm.lux | 113 ++++++++++++--------- stdlib/source/library/lux/ffi.old.lux | 8 +- stdlib/source/library/lux/target/jvm/loader.lux | 2 +- .../lux/tool/compiler/meta/packager/jvm.lux | 4 +- stdlib/source/library/lux/world/console.lux | 4 +- stdlib/source/library/lux/world/file.lux | 2 +- stdlib/source/library/lux/world/file/watch.lux | 6 +- 7 files changed, 79 insertions(+), 60 deletions(-) (limited to 'stdlib/source/library') diff --git a/stdlib/source/library/lux/ffi.jvm.lux b/stdlib/source/library/lux/ffi.jvm.lux index 32b5410ee..f5ae643ad 100644 --- a/stdlib/source/library/lux/ffi.jvm.lux +++ b/stdlib/source/library/lux/ffi.jvm.lux @@ -988,17 +988,17 @@ [#import_method_name name #import_method_return return]]}))) (.form (do <>.monad - [static? (<>.parses? (.this (' "static"))) + [read_only? (<>.parses? (.this (' "read_only"))) + static? (<>.parses? (.this (' "static"))) name .local ?prim_mode (<>.maybe primitive_mode^) - gtype (..type^ owner_vars) maybe? (<>.parses? (.this (' "?"))) - setter? (<>.parses? (.this (' #!)))] + gtype (..type^ owner_vars)] (in {#FieldAccessDecl [#import_field_mode (maybe.else {#AutoPrM} ?prim_mode) #import_field_name name #import_field_static? static? #import_field_maybe? maybe? - #import_field_setter? setter? + #import_field_setter? (not read_only?) #import_field_type gtype]}))) )) @@ -1500,6 +1500,12 @@ (list name (` (~! .any))))) list#conjoint)) +(exception: .public (cannot_write_to_field [class Text + field Text]) + (exception.report + "Class" (%.text class) + "Field" (%.text field))) + (def: (member_def_interop vars kind class [arg_function_inputs input_jvm_types arg_types] member method_prefix import_format) (-> (List (Type Var)) Class_Kind (Type Declaration) [(List [Bit Code]) (List (Type Value)) (List Code)] Import_Member_Declaration Text Text (Meta (List Code))) (let [[full_name class_tvars] (parser.declaration class)] @@ -1603,49 +1609,62 @@ {#FieldAccessDecl fad} (do meta.monad [.let [(open "_[0]") fad - getter_name (code.symbol ["" (..import_name import_format method_prefix _#import_field_name)]) - setter_name (code.symbol ["" (..import_name import_format method_prefix (format _#import_field_name "!"))])] - getter_interop (with_symbols [g!obj] - (let [getter_call (if _#import_field_static? - (` ((~ getter_name) [])) - (` ((~ getter_name) [(~ g!obj) (~! .any)]))) - getter_body (<| (with_automatic_output_conversion _#import_field_mode) - [_#import_field_type - (if _#import_field_static? - (get_static_field full_name _#import_field_name) - (get_virtual_field full_name _#import_field_name (..un_quoted g!obj)))]) - getter_body (if _#import_field_maybe? - (` ((~! ???) (~ getter_body))) - getter_body) - getter_body (if _#import_field_setter? - (` ((~! io.io) (~ getter_body))) - getter_body)] - (in (` (def: (~ getter_name) - ((~! syntax) (~ getter_call) - ((~' in) (.list (.` (~ getter_body)))))))))) - setter_interop (.is (Meta (List Code)) - (if _#import_field_setter? - (with_symbols [g!obj g!value] - (let [setter_call (if _#import_field_static? - (` ((~ setter_name) [(~ g!value) (~! .any)])) - (` ((~ setter_name) [(~ g!value) (~! .any) - (~ g!obj) (~! .any)]))) - setter_value (|> [_#import_field_type (..un_quoted g!value)] - (with_automatic_input_conversion _#import_field_mode)) - setter_value (if _#import_field_maybe? - (` ((~! !!!) (~ setter_value))) - setter_value) - setter_command (format (if _#import_field_static? "jvm putstatic" "jvm putfield") - ":" full_name ":" _#import_field_name) - g!obj+ (.is (List Code) - (if _#import_field_static? - (list) - (list (..un_quoted g!obj))))] - (in (list (` (def: (~ setter_name) - ((~! syntax) (~ setter_call) - ((~' in) (.list (.` ((~! io.io) ((~ (code.text setter_command)) (~+ g!obj+) (~ setter_value))))))))))))) - (in (list))))] - (in (list.partial getter_interop setter_interop))) + g!name (code.symbol ["" (..import_name import_format method_prefix _#import_field_name)])]] + (with_symbols [g!obj g!value write|read] + (in (let [getter_body (<| (with_automatic_output_conversion _#import_field_mode) + [_#import_field_type + (if _#import_field_static? + (get_static_field full_name _#import_field_name) + (get_virtual_field full_name _#import_field_name (..un_quoted g!obj)))]) + getter_body (if _#import_field_maybe? + (` ((~! ???) (~ getter_body))) + getter_body) + getter_body (if _#import_field_setter? + (` ((~! io.io) (~ getter_body))) + getter_body) + + setter_value (|> [_#import_field_type (..un_quoted g!value)] + (with_automatic_input_conversion _#import_field_mode)) + setter_value (if _#import_field_maybe? + (` ((~! !!!) (~ setter_value))) + setter_value) + setter_command (if _#import_field_static? "jvm member put static" "jvm member put virtual") + g!obj+ (.is (List Code) + (if _#import_field_static? + (list) + (list (..un_quoted g!obj)))) + + parser (let [write (if _#import_field_static? + (` (~! .any)) + (` ((~! <>.and) + (~! .any) + (~! .any)))) + read (if _#import_field_static? + (` (~! .end)) + (` (~! .any)))] + (` ((~! <>.or) (~ write) (~ read)))) + write (list (if _#import_field_static? + (` {.#Left [(~ g!value)]}) + (` {.#Left [(~ g!value) (~ g!obj)]})) + (if _#import_field_setter? + (` ((~' in) (.list (.` ((~! io.io) ((~ (code.text setter_command)) + (~ (code.text full_name)) + (~ (code.text _#import_field_name)) + (~ setter_value) + (~+ g!obj+))))))) + (` ((~! meta.failure) (~ (code.text (exception.error ..cannot_write_to_field [full_name _#import_field_name]))))))) + read (list (if _#import_field_static? + (` {.#Right []}) + (` {.#Right [(~ g!obj)]})) + (` ((~' in) (.list (.` (~ getter_body)))))) + + it (` (def: (~ g!name) + ((~! syntax) ((~ g!name) [(~ write|read) (~ parser)]) + (case (~ write|read) + (~+ write) + (~+ read))))) + _ ("lux io log" (%.format "[!] " (%.code it)))] + (list it))))) ))) (def: (member_import$ vars kind class [import_format member]) diff --git a/stdlib/source/library/lux/ffi.old.lux b/stdlib/source/library/lux/ffi.old.lux index 1933ba032..92d7322fd 100644 --- a/stdlib/source/library/lux/ffi.old.lux +++ b/stdlib/source/library/lux/ffi.old.lux @@ -959,17 +959,17 @@ [#import_method_name name #import_method_return return]]}))) (.form (do <>.monad - [static? (<>.parses? (.this (' "static"))) + [read_only? (<>.parses? (.this (' "read_only"))) + static? (<>.parses? (.this (' "static"))) name .local ?prim_mode (<>.maybe primitive_mode^) gtype (..generic_type^ owner_vars) - maybe? (<>.parses? (.this (' "?"))) - setter? (<>.parses? (.this (' "!")))] + maybe? (<>.parses? (.this (' "?")))] (in {#FieldAccessDecl [#import_field_mode (maybe.else {#AutoPrM} ?prim_mode) #import_field_name name #import_field_static? static? #import_field_maybe? maybe? - #import_field_setter? setter? + #import_field_setter? (not read_only?) #import_field_type gtype]}))) )) diff --git a/stdlib/source/library/lux/target/jvm/loader.lux b/stdlib/source/library/lux/target/jvm/loader.lux index f582d2140..ee54b8aef 100644 --- a/stdlib/source/library/lux/target/jvm/loader.lux +++ b/stdlib/source/library/lux/target/jvm/loader.lux @@ -53,7 +53,7 @@ (import java/lang/Integer "[1]::[0]" - ("static" TYPE (java/lang/Class java/lang/Integer))) + ("read_only" "static" TYPE (java/lang/Class java/lang/Integer))) (import java/lang/reflect/AccessibleObject "[1]::[0]" diff --git a/stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux b/stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux index c19c7ed00..47fb81088 100644 --- a/stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux +++ b/stdlib/source/library/lux/tool/compiler/meta/packager/jvm.lux @@ -60,8 +60,8 @@ (import java/util/jar/Attributes$Name "[1]::[0]" - ("static" MAIN_CLASS java/util/jar/Attributes$Name) - ("static" MANIFEST_VERSION java/util/jar/Attributes$Name)) + ("read_only" "static" MAIN_CLASS java/util/jar/Attributes$Name) + ("read_only" "static" MANIFEST_VERSION java/util/jar/Attributes$Name)) (import java/util/jar/Manifest "[1]::[0]" diff --git a/stdlib/source/library/lux/world/console.lux b/stdlib/source/library/lux/world/console.lux index f7fee43da..4112af8f4 100644 --- a/stdlib/source/library/lux/world/console.lux +++ b/stdlib/source/library/lux/world/console.lux @@ -60,8 +60,8 @@ (import java/lang/System "[1]::[0]" ("static" console [] "io" "?" java/io/Console) - ("static" in java/io/InputStream) - ("static" out java/io/PrintStream)) + ("read_only" "static" in java/io/InputStream) + ("read_only" "static" out java/io/PrintStream)) (exception: .public cannot_open) diff --git a/stdlib/source/library/lux/world/file.lux b/stdlib/source/library/lux/world/file.lux index 51abe0483..420fd0bde 100644 --- a/stdlib/source/library/lux/world/file.lux +++ b/stdlib/source/library/lux/world/file.lux @@ -177,7 +177,7 @@ (renameTo [java/io/File] "io" "try" boolean) (lastModified [] "io" "try" long) (setLastModified [long] "io" "try" boolean) - ("static" separator java/lang/String))) + ("read_only" "static" separator java/lang/String))) (ffi.import java/lang/AutoCloseable "[1]::[0]" diff --git a/stdlib/source/library/lux/world/file/watch.lux b/stdlib/source/library/lux/world/file/watch.lux index d9b982faf..84f9cae1d 100644 --- a/stdlib/source/library/lux/world/file/watch.lux +++ b/stdlib/source/library/lux/world/file/watch.lux @@ -301,9 +301,9 @@ (import java/nio/file/StandardWatchEventKinds "[1]::[0]" - ("static" ENTRY_CREATE (java/nio/file/WatchEvent$Kind java/nio/file/Path)) - ("static" ENTRY_MODIFY (java/nio/file/WatchEvent$Kind java/nio/file/Path)) - ("static" ENTRY_DELETE (java/nio/file/WatchEvent$Kind java/nio/file/Path))) + ("read_only" "static" ENTRY_CREATE (java/nio/file/WatchEvent$Kind java/nio/file/Path)) + ("read_only" "static" ENTRY_MODIFY (java/nio/file/WatchEvent$Kind java/nio/file/Path)) + ("read_only" "static" ENTRY_DELETE (java/nio/file/WatchEvent$Kind java/nio/file/Path))) (def: (default_event_concern event) (All (_ a) -- cgit v1.2.3