Fix issue where constructor was becoming a value. Fixes to_json. (#3955)

If a constructor is fully specified the Meta constructor was becoming the atom in a few places.

This broke to_json and hence viz.
This commit is contained in:
James Dunkerley 2022-12-07 17:20:56 +00:00 committed by GitHub
parent 0855b74875
commit 8f30fcf376
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 75 additions and 61 deletions

View File

@ -83,8 +83,8 @@ type Any
that_meta = Meta.meta that
case Pair.new self_meta that_meta of
Pair.Value (Meta.Atom.Value _) (Meta.Atom.Value _) ->
c_1 = self_meta.constructor ...
c_2 = that_meta.constructor ...
c_1 = self_meta.constructor.value ...
c_2 = that_meta.constructor.value ...
if Meta.is_same_object c_1 c_2 . not then False else
f_1 = self_meta.fields
f_2 = that_meta.fields

View File

@ -29,7 +29,7 @@ Any.to_json self =
m = Meta.meta self
case m of
_ : Meta.Atom ->
cons = Meta.Constructor.Value m.constructor
cons = m.constructor
fs = m.fields
fnames = cons.fields
json_fs = 0.up_to fnames.length . fold Map.empty m-> i->

View File

@ -314,7 +314,7 @@ into_helper fmt json = case fmt of
case m of
_ : Meta.Atom -> case json of
Json.Object json_fields ->
cons = Meta.Constructor.Value m.constructor
cons = m.constructor
field_names = cons.fields
field_formats = m.fields
field_values = field_names.zip field_formats n-> inner_format->

View File

@ -17,14 +17,14 @@ import project.Polyglot.Polyglot as Base_Polyglot
from project.Data.Boolean import Boolean, True, False
## UNSTABLE
ADVANCED
An Atom meta-representation.
Arguments:
- value: The value of the atom in the meta representation.
type Atom
## UNSTABLE
ADVANCED
An Atom meta-representation.
Arguments:
- value: The value of the atom in the meta representation.
Value value
## UNSTABLE
@ -39,16 +39,18 @@ type Atom
Returns a constructor value of the given atom.
constructor : Constructor
constructor self = get_atom_constructor self.value ...
constructor self =
java_constructor = get_atom_constructor self.value ...
Meta.Constructor.Value java_constructor
## UNSTABLE
ADVANCED
A constructor meta-representation.
Arguments:
- value: The value of the constructor in the meta representation.
type Constructor
## UNSTABLE
ADVANCED
A constructor meta-representation.
Arguments:
- value: The value of the constructor in the meta representation.
Value value
## UNSTABLE
@ -56,14 +58,18 @@ type Constructor
Returns a vector of field names defined by a constructor.
fields : Vector
fields self = Vector.from_polyglot_array (get_constructor_fields self.value)
fields self =
c = self.value ...
Vector.from_polyglot_array (get_constructor_fields c)
## UNSTABLE
ADVANCED
Returns the name of a constructor.
name : Text
name self = get_constructor_name self.value
name self =
c = self.value ...
get_constructor_name c
## UNSTABLE
ADVANCED
@ -74,26 +80,28 @@ type Constructor
- fields: A vector of arguments to pass to the constructor when creating the
new atom.
new : Vector -> Any
new self fields = new_atom self.value fields.to_array
new self fields =
ctor = self.value ...
new_atom ctor fields.to_array
## UNSTABLE
ADVANCED
A primitive value meta-representation.
Arguments:
- value: The value of the primitive object in the meta representation.
type Primitive
## UNSTABLE
ADVANCED
A primitive value meta-representation.
Arguments:
- value: The value of the primitive object in the meta representation.
Value value
## UNSTABLE
ADVANCED
An unresolved symbol meta-representation.
Arguments:
- value: The value of the unresolved symbol in the meta representation.
type Unresolved_Symbol
## UNSTABLE
ADVANCED
An unresolved symbol meta-representation.
Arguments:
- value: The value of the unresolved symbol in the meta representation.
Value value
## UNSTABLE
@ -122,24 +130,24 @@ type Unresolved_Symbol
scope : Any
scope self = get_unresolved_symbol_scope self.value
## UNSTABLE
ADVANCED
An error meta-representation, containing the payload of a dataflow error.
Arguments:
- value: The payload of the error.
type Error
## UNSTABLE
ADVANCED
An error meta-representation, containing the payload of a dataflow error.
Arguments:
- value: The payload of the error.
Value value
## UNSTABLE
ADVANCED
A polyglot value meta-representation.
Arguments:
- value: The polyglot value contained in the meta representation.
type Polyglot
## UNSTABLE
ADVANCED
A polyglot value meta-representation.
Arguments:
- value: The polyglot value contained in the meta representation.
Value value
## UNSTABLE
@ -188,7 +196,7 @@ Base_Error.is_a self typ = typ==Any || typ==Base_Error
Arguments:
- atom: The atom to obtain the constructor for.
get_atom_constructor : Atom -> Constructor
get_atom_constructor : Atom -> Any
get_atom_constructor atom = @Builtin_Method "Meta.get_atom_constructor"
## PRIVATE
@ -243,7 +251,7 @@ get_unresolved_symbol_scope symbol = @Builtin_Method "Meta.get_unresolved_symbol
Arguments:
- atom_constructor: The constructor from which to get the fields.
get_constructor_fields : Constructor -> Array
get_constructor_fields : Any -> Array
get_constructor_fields atom_constructor = @Builtin_Method "Meta.get_constructor_fields"
## PRIVATE
@ -252,7 +260,7 @@ get_constructor_fields atom_constructor = @Builtin_Method "Meta.get_constructor_
Arguments:
- atom_constructor: The atom constructor from which to obtain the name.
get_constructor_name : Constructor -> Text
get_constructor_name : Any -> Text
get_constructor_name atom_constructor = @Builtin_Method "Meta.get_constructor_name"
## PRIVATE
@ -262,7 +270,7 @@ get_constructor_name atom_constructor = @Builtin_Method "Meta.get_constructor_na
Arguments:
- constructor: The constructor for the atom to create.
- fields: The arguments to pass to constructor.
new_atom : Constructor -> Array -> Atom
new_atom : Any -> Array -> Atom
new_atom constructor fields = @Builtin_Method "Meta.new_atom"
## UNSTABLE
@ -321,7 +329,7 @@ is_a value typ = if is_same_object value typ then True else
meta_val = meta value
case meta_val of
_ : Atom -> if is_atom typ then typ == value else
meta_val.constructor == typ
meta_val.constructor.value == typ
_ : Constructor ->
meta_typ = meta typ
case meta_typ of

View File

@ -1419,7 +1419,7 @@ type Table
self.write file format=base_format on_existing_file match_columns on_problems
_ ->
Panic.catch No_Such_Method.Error (format.write_table file self on_existing_file match_columns on_problems) _->
name = Meta.get_constructor_name (Meta.meta format).constructor
name = (Meta.meta format).constructor.name
Error.throw (Illegal_Argument.Error ("Saving a Table as " + name + " is not supported."))
## Creates a text representation of the table using the CSV format.

View File

@ -20,7 +20,7 @@ test_problem_handling : (Problem_Behavior -> Any) -> Vector Any -> (Any -> Nothi
test_problem_handling action expected_problems result_checker =
error_checker error_result =
first_problem = expected_problems.first
first_problem_type = Meta.meta first_problem . constructor
first_problem_type = Meta.meta first_problem . constructor . value
error_result . should_fail_with first_problem_type frames_to_skip=3
error_result.catch . should_equal first_problem frames_to_skip=3
warnings_checker warnings =

View File

@ -31,14 +31,20 @@ spec = Test.group "Meta-Value Manipulation" <|
Test.specify "should allow manipulating atoms" <|
atom = My_Type.Value 1 "foo" Nothing
meta_atom = Meta.meta atom
meta_atom.constructor.should_equal My_Type.Value
meta_atom.constructor.value.should_equal My_Type.Value
meta_atom.fields.should_equal [1, "foo", Nothing]
Meta.meta (meta_atom.constructor) . new [1, "foo", Nothing] . should_equal atom
Meta.meta (meta_atom.constructor.value) . new [1, "foo", Nothing] . should_equal atom
Test.specify "should allow getting a value's constructor's name" <|
Meta.meta List.Nil . constructor . name . should_equal "Nil"
Meta.meta (List.Cons 1 List.Nil) . constructor . name . should_equal "Cons"
Test.specify "should allow getting a value's constructor's fields" <|
Meta.meta List.Nil . constructor . fields . should_equal []
Meta.meta (List.Cons 1 List.Nil) . constructor . fields . should_equal ["x", "xs"]
Test.specify "should allow creating atoms from atom constructors" <|
atom_1 = Meta.new_atom My_Type.Value [1,"foo", Nothing]
(Meta.meta atom_1).constructor . should_equal My_Type.Value
(Meta.meta atom_1).constructor.value . should_equal My_Type.Value
atom_2 = Meta.new_atom My_Type.Value [1,"foo", Nothing].to_array
(Meta.meta atom_2).constructor . should_equal My_Type.Value
(Meta.meta atom_2).constructor.value . should_equal My_Type.Value
Test.specify "should correctly return representations of different classes of objects" <|
Meta.meta 1 . should_equal (Meta.Primitive.Value 1)
Meta.meta "foo" . should_equal (Meta.Primitive.Value "foo")