This repository was archived by the owner on Mar 26, 2020. It is now read-only.
Improve error messages and generate operator<< for records#417
Open
danyowdee wants to merge 5 commits intodropbox:masterfrom
Open
Improve error messages and generate operator<< for records#417danyowdee wants to merge 5 commits intodropbox:masterfrom
danyowdee wants to merge 5 commits intodropbox:masterfrom
Conversation
Generating a description of a record is mostly trivial. In fact, this already happens for Objective-C and Java — only C++ is missing. Instead of generating this code unconditionally, this commit introduces something equivalent to Haskell’s `Show` typeclass for Djinni records. It can be written using the regular `deriving (…)` syntax, using the keyword `show`. Due to how resolver.scala is implemented, this diff is enough to get an error message telling if a nested record isn’t deriving `show` (the message is bad, though).
|
Hi, @danyowdee: |
Author
|
Done. |
xianwen
suggested changes
Dec 30, 2018
xianwen
left a comment
There was a problem hiding this comment.
Please update the generated files, specifically, test-suite/generated-src/cpp/color.hpp and
test-suite/generated-src/cpp/constant_enum.hpp will be affected by this diff.
artwyman
suggested changes
Jan 2, 2019
Contributor
artwyman
left a comment
There was a problem hiding this comment.
You should add some new cases to the test-suite to exercise this new functionality, as well as documentation about how to use it. E.g. the new "deriving" directive should be documented and demonstrated.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR improves the error messages when a record cannot conform to a typeclass, because it has fields of types that don’t. In addition, it generates the C++
operator<<for enums, and introduces theshowtypeclass to do the same for recordsderiving (show).Assuming the following Djinni file:
This PR allows you to write the following C++ code:
Product p{"Little Red Corvette", "v0KpfrJE4zw", Amount{1999, CurrencyCode::USD}}; Product q{"Breakfast Can Wait", "CzWX1gv6u2s", Amount{2013, CurrencyCode::EUR}}; ShoppingCart c{{p, q}}; std::cout << c << std::endl; /* prints """ShoppingCart{ items:[ Product{ name:Little Red Corvette, identifier:v0KpfrJE4zw, price:Amount{ units:1999, currency:CurrencyCode::USD } }, Product{ name:Breakfast Can Wait, identifier:CzWX1gv6u2s, price:Amount{ units:2013, currency:CurrencyCode::EUR } }, ] }""" */If
Amountwould be missing the declaration of conformance toshow, the error message from running Djinni would clearly say so:Supported Field Types
deriving (show)enumlist<T>whereTis any of the above (or a map, or a list)map<K,V>whereKandVare any of the above (or a map)Limitations/Known Issues
datafields are printed as arrays of integers by defaultflagandoptionalfields require handwritten overloads ofoperator<<to be available in the translation unit of the record; failure to do so will not report an error until trying to compile the record’s.cppfileshow, the error may not surface until trying to compile the record’s.cppfile