
* Add polymorphism to syntax tree and parser * Add polymorphism to infer types * Fix pretty printing * Add new tests and fix old tests * Fix the comparison between unit and empty tuple * Report undefined interface errors before checking implemented interfaces * Add test for implementing multiple interfaces * Add test for implementing two interfaces with entrypoints of same names and different types * Add tests for interfaces implementing interfaces * Draft: Add variance switching * Revert "Draft: Add variance switching" This reverts commit 92dc6ac169cfbff447ed59de04994f564876b3fb. * Add variance switching * Fix broken tests * Fix broken abi tests * Add tests for variance switching * Fix tests after rebase * Variance switching for custom datatypes * Fix dialyzer warning * Add testing for custom types variance switching * Make opposite_variance a separate function * Make is_subtype/4 a separate function * Fix warning * Mark tvars as invariant * Add type_vars_uvar ets table to ets_tables() * Don't destroy and recreate type errors table when not needed * Fixes from the reviews * Use is_list to check if a var is a list * Compare named args in fun_t * Test only for covariance and contravariance * Remove arrows_in_type and use infer_type_vars_variance instead * Add tests for option and type aliases * Fix previous commit * Rename check_implemented_interfaces_recursive to check_implemented_interfaces1 * Make interfaces declare functions from extended interfaces * Restore test.aes * Add test for variance switching in records * Enable variance switching for record types * Handle builtin types type variables separately * Add tests for oracles and oracle queries * Replace compare_types with non-throwing version of unify * Add the context to unification error * Test variance switching for bivariant records * Give clear names to the records in records variance switching test * Handle comments about polymorphism_variance_switching.aes * Rename datatypes in custom types variance switching test for readability * Change the variance of the oracle_query type vars * Add test for accessing maps with the wrong type * Default to invariant when the variance of the type vars is unknown * Rename test files to have common prefix * Rename functions in variance switching tests for readability * Fix variance inference * Eliminate redundant tests * Test all cases for bivariant
47 lines
3.2 KiB
Plaintext
47 lines
3.2 KiB
Plaintext
contract interface Animal =
|
|
entrypoint sound : () => string
|
|
|
|
contract Cat : Animal =
|
|
entrypoint sound() = "meow"
|
|
|
|
main contract Main =
|
|
entrypoint oracle() = ok_2YNyxd6TRJPNrTcEDCe9ra59SVUdp9FR9qWC5msKZWYD9bP9z5
|
|
|
|
entrypoint query() = oq_2oRvyowJuJnEkxy58Ckkw77XfWJrmRgmGaLzhdqb67SKEL1gPY
|
|
|
|
entrypoint init() =
|
|
let o01 : oracle(Animal, Animal) = oracle() : oracle(Animal, Animal) // success
|
|
let o02 : oracle(Animal, Animal) = oracle() : oracle(Animal, Cat) // success
|
|
let o03 : oracle(Animal, Animal) = oracle() : oracle(Cat, Animal) // fail
|
|
let o04 : oracle(Animal, Animal) = oracle() : oracle(Cat, Cat) // fail
|
|
let o05 : oracle(Animal, Cat) = oracle() : oracle(Animal, Animal) // fail
|
|
let o06 : oracle(Animal, Cat) = oracle() : oracle(Animal, Cat) // success
|
|
let o07 : oracle(Animal, Cat) = oracle() : oracle(Cat, Animal) // fail
|
|
let o08 : oracle(Animal, Cat) = oracle() : oracle(Cat, Cat) // fail
|
|
let o09 : oracle(Cat, Animal) = oracle() : oracle(Animal, Animal) // success
|
|
let o10 : oracle(Cat, Animal) = oracle() : oracle(Animal, Cat) // success
|
|
let o11 : oracle(Cat, Animal) = oracle() : oracle(Cat, Animal) // success
|
|
let o12 : oracle(Cat, Animal) = oracle() : oracle(Cat, Cat) // success
|
|
let o13 : oracle(Cat, Cat) = oracle() : oracle(Animal, Animal) // fail
|
|
let o14 : oracle(Cat, Cat) = oracle() : oracle(Animal, Cat) // success
|
|
let o15 : oracle(Cat, Cat) = oracle() : oracle(Cat, Animal) // fail
|
|
let o16 : oracle(Cat, Cat) = oracle() : oracle(Cat, Cat) // success
|
|
|
|
let q01 : oracle_query(Animal, Animal) = query() : oracle_query(Animal, Animal) // success
|
|
let q02 : oracle_query(Animal, Animal) = query() : oracle_query(Animal, Cat) // success
|
|
let q03 : oracle_query(Animal, Animal) = query() : oracle_query(Cat, Animal) // success
|
|
let q04 : oracle_query(Animal, Animal) = query() : oracle_query(Cat, Cat) // success
|
|
let q05 : oracle_query(Animal, Cat) = query() : oracle_query(Animal, Animal) // fail
|
|
let q06 : oracle_query(Animal, Cat) = query() : oracle_query(Animal, Cat) // success
|
|
let q07 : oracle_query(Animal, Cat) = query() : oracle_query(Cat, Animal) // fail
|
|
let q08 : oracle_query(Animal, Cat) = query() : oracle_query(Cat, Cat) // success
|
|
let q09 : oracle_query(Cat, Animal) = query() : oracle_query(Animal, Animal) // fail
|
|
let q10 : oracle_query(Cat, Animal) = query() : oracle_query(Animal, Cat) // fail
|
|
let q11 : oracle_query(Cat, Animal) = query() : oracle_query(Cat, Animal) // success
|
|
let q12 : oracle_query(Cat, Animal) = query() : oracle_query(Cat, Cat) // success
|
|
let q13 : oracle_query(Cat, Cat) = query() : oracle_query(Animal, Animal) // fail
|
|
let q14 : oracle_query(Cat, Cat) = query() : oracle_query(Animal, Cat) // fail
|
|
let q15 : oracle_query(Cat, Cat) = query() : oracle_query(Cat, Animal) // fail
|
|
let q16 : oracle_query(Cat, Cat) = query() : oracle_query(Cat, Cat) // success
|
|
|
|
() |