finitio 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +66 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +34 -30
- data/finitio.gemspec +1 -1
- data/lib/finitio.rb +7 -39
- data/lib/finitio/errors.rb +14 -0
- data/lib/finitio/support.rb +4 -1
- data/lib/finitio/support/attribute.rb +13 -7
- data/lib/finitio/support/compilation.rb +55 -0
- data/lib/finitio/support/constraint.rb +46 -0
- data/lib/finitio/support/contract.rb +33 -0
- data/lib/finitio/support/dress_helper.rb +3 -2
- data/lib/finitio/support/heading.rb +57 -17
- data/lib/finitio/support/metadata.rb +20 -0
- data/lib/finitio/support/type_factory.rb +154 -41
- data/lib/finitio/syntax.rb +16 -31
- data/lib/finitio/syntax/expr.rb +56 -0
- data/lib/finitio/syntax/expr/arith_op.rb +22 -0
- data/lib/finitio/syntax/expr/comparison.rb +22 -0
- data/lib/finitio/syntax/expr/fn_call.rb +24 -0
- data/lib/finitio/syntax/expr/identifier.rb +18 -0
- data/lib/finitio/syntax/expr/literal.rb +19 -0
- data/lib/finitio/syntax/expr/logic_dyadic.rb +22 -0
- data/lib/finitio/syntax/expr/logic_not.rb +21 -0
- data/lib/finitio/syntax/expr/oo_call.rb +24 -0
- data/lib/finitio/syntax/expr/parenthesized.rb +20 -0
- data/lib/finitio/syntax/expr/unary_minus_op.rb +21 -0
- data/lib/finitio/syntax/expressions.citrus +129 -0
- data/lib/finitio/syntax/finitio.citrus +10 -208
- data/lib/finitio/syntax/finitio.sexp +5 -1
- data/lib/finitio/syntax/lexer.citrus +91 -0
- data/lib/finitio/syntax/literal.rb +16 -0
- data/lib/finitio/syntax/literal/boolean.rb +22 -0
- data/lib/finitio/syntax/literal/integer.rb +14 -0
- data/lib/finitio/syntax/literal/real.rb +14 -0
- data/lib/finitio/syntax/literal/string.rb +14 -0
- data/lib/finitio/syntax/literals.citrus +44 -0
- data/lib/finitio/syntax/node.rb +53 -0
- data/lib/finitio/syntax/type.rb +28 -0
- data/lib/finitio/syntax/type/ad_type.rb +29 -0
- data/lib/finitio/syntax/{any_type.rb → type/any_type.rb} +1 -1
- data/lib/finitio/syntax/type/attribute.rb +33 -0
- data/lib/finitio/syntax/{builtin_type.rb → type/builtin_type.rb} +3 -1
- data/lib/finitio/syntax/{constraint_def.rb → type/constraint_def.rb} +4 -3
- data/lib/finitio/syntax/type/constraints.rb +17 -0
- data/lib/finitio/syntax/{contract.rb → type/contract.rb} +9 -3
- data/lib/finitio/syntax/{definitions.rb → type/definitions.rb} +1 -0
- data/lib/finitio/syntax/{expression.rb → type/expression.rb} +2 -1
- data/lib/finitio/syntax/{external_pair.rb → type/external_pair.rb} +3 -1
- data/lib/finitio/syntax/type/heading.rb +30 -0
- data/lib/finitio/syntax/{inline_pair.rb → type/inline_pair.rb} +3 -1
- data/lib/finitio/syntax/{lambda_expr.rb → type/lambda_expr.rb} +3 -0
- data/lib/finitio/syntax/type/main_type.rb +18 -0
- data/lib/finitio/syntax/type/metadata.rb +18 -0
- data/lib/finitio/syntax/type/metadata_attr.rb +15 -0
- data/lib/finitio/syntax/{named_constraint.rb → type/named_constraint.rb} +10 -3
- data/lib/finitio/syntax/type/relation_type.rb +24 -0
- data/lib/finitio/syntax/{seq_type.rb → type/seq_type.rb} +3 -0
- data/lib/finitio/syntax/{set_type.rb → type/set_type.rb} +3 -0
- data/lib/finitio/syntax/type/struct_type.rb +17 -0
- data/lib/finitio/syntax/{sub_type.rb → type/sub_type.rb} +3 -0
- data/lib/finitio/syntax/{system.rb → type/system.rb} +5 -4
- data/lib/finitio/syntax/type/tuple_type.rb +24 -0
- data/lib/finitio/syntax/{type_def.rb → type/type_def.rb} +8 -3
- data/lib/finitio/syntax/{type_ref.rb → type/type_ref.rb} +4 -1
- data/lib/finitio/syntax/{union_type.rb → type/union_type.rb} +1 -0
- data/lib/finitio/syntax/{unnamed_constraint.rb → type/unnamed_constraint.rb} +7 -1
- data/lib/finitio/syntax/types.citrus +196 -0
- data/lib/finitio/system.rb +15 -15
- data/lib/finitio/type.rb +38 -6
- data/lib/finitio/type/ad_type.rb +41 -18
- data/lib/finitio/type/alias_type.rb +37 -0
- data/lib/finitio/type/any_type.rb +7 -3
- data/lib/finitio/type/builtin_type.rb +5 -4
- data/lib/finitio/{support → type}/collection_type.rb +3 -4
- data/lib/finitio/type/hash_based_type.rb +91 -0
- data/lib/finitio/type/heading_based_type.rb +28 -0
- data/lib/finitio/type/multi_relation_type.rb +34 -0
- data/lib/finitio/type/multi_tuple_type.rb +29 -0
- data/lib/finitio/type/proxy_type.rb +40 -0
- data/lib/finitio/type/rel_based_type.rb +42 -0
- data/lib/finitio/type/relation_type.rb +6 -47
- data/lib/finitio/type/seq_type.rb +4 -0
- data/lib/finitio/type/set_type.rb +4 -0
- data/lib/finitio/type/struct_type.rb +84 -0
- data/lib/finitio/type/sub_type.rb +25 -22
- data/lib/finitio/type/tuple_type.rb +6 -57
- data/lib/finitio/type/union_type.rb +12 -5
- data/lib/finitio/version.rb +2 -2
- data/spec/{unit/attribute → attribute}/test_equality.rb +8 -5
- data/spec/{unit/attribute → attribute}/test_fetch_on.rb +5 -5
- data/spec/attribute/test_initialize.rb +26 -0
- data/spec/attribute/test_optional.rb +18 -0
- data/spec/attribute/test_required.rb +18 -0
- data/spec/attribute/test_to_name.rb +20 -0
- data/spec/constraint/test_anonymous.rb +20 -0
- data/spec/constraint/test_equality.rb +39 -0
- data/spec/constraint/test_name.rb +20 -0
- data/spec/constraint/test_named.rb +20 -0
- data/spec/constraint/test_triple_equal.rb +13 -0
- data/spec/{unit/qrb/system.q → finitio/system.fio} +0 -0
- data/spec/{unit/qrb → finitio}/test_ast.rb +0 -0
- data/spec/finitio/test_parse.rb +23 -0
- data/spec/{unit/qrb/test_parse.rb → finitio/test_system.rb} +6 -6
- data/spec/heading/test_allow_extra.rb +24 -0
- data/spec/{unit/heading → heading}/test_each.rb +2 -2
- data/spec/heading/test_equality.rb +38 -0
- data/spec/heading/test_hash.rb +38 -0
- data/spec/heading/test_hash_get.rb +17 -0
- data/spec/{unit/heading → heading}/test_initialize.rb +2 -2
- data/spec/heading/test_multi.rb +57 -0
- data/spec/{unit/heading → heading}/test_size.rb +0 -0
- data/spec/heading/test_to_name.rb +58 -0
- data/spec/spec_helper.rb +17 -1
- data/spec/syntax/expr/test_free_variables.rb +46 -0
- data/spec/syntax/expr/test_to_proc_source.rb +43 -0
- data/spec/{unit/syntax → syntax}/nodes/test_ad_type.rb +26 -26
- data/spec/{unit/syntax → syntax}/nodes/test_any_type.rb +2 -2
- data/spec/syntax/nodes/test_attribute.rb +65 -0
- data/spec/{unit/syntax → syntax}/nodes/test_builtin_type.rb +5 -5
- data/spec/{unit/syntax → syntax}/nodes/test_comment.rb +1 -1
- data/spec/{unit/syntax → syntax}/nodes/test_constraint_def.rb +3 -8
- data/spec/{unit/syntax → syntax}/nodes/test_constraints.rb +21 -16
- data/spec/{unit/syntax → syntax}/nodes/test_contract.rb +28 -35
- data/spec/{unit/syntax → syntax}/nodes/test_expression.rb +13 -5
- data/spec/{unit/syntax → syntax}/nodes/test_heading.rb +25 -7
- data/spec/syntax/nodes/test_metadata.rb +28 -0
- data/spec/{unit/syntax → syntax}/nodes/test_named_constraint.rb +8 -8
- data/spec/syntax/nodes/test_relation_type.rb +84 -0
- data/spec/{unit/syntax → syntax}/nodes/test_seq_type.rb +4 -4
- data/spec/{unit/syntax → syntax}/nodes/test_set_type.rb +4 -4
- data/spec/{unit/syntax → syntax}/nodes/test_spacing.rb +1 -1
- data/spec/syntax/nodes/test_struct_type.rb +38 -0
- data/spec/{unit/syntax → syntax}/nodes/test_sub_type.rb +14 -14
- data/spec/{unit/syntax → syntax}/nodes/test_system.rb +3 -3
- data/spec/syntax/nodes/test_tuple_type.rb +94 -0
- data/spec/syntax/nodes/test_type_def.rb +57 -0
- data/spec/{unit/syntax → syntax}/nodes/test_type_ref.rb +3 -3
- data/spec/{unit/syntax → syntax}/nodes/test_union_type.rb +3 -3
- data/spec/{unit/syntax → syntax}/nodes/test_unnamed_constraint.rb +7 -7
- data/spec/syntax/test_compile.rb +41 -0
- data/spec/{unit/syntax → syntax}/test_compile_type.rb +1 -1
- data/spec/{unit/system → system}/test_add_type.rb +6 -6
- data/spec/{unit/system → system}/test_dsl.rb +2 -2
- data/spec/{unit/system → system}/test_dup.rb +4 -4
- data/spec/{unit/system → system}/test_fetch.rb +4 -4
- data/spec/{unit/system → system}/test_get_type.rb +2 -2
- data/spec/{unit/system → system}/test_initialize.rb +0 -0
- data/spec/test_finitio.rb +8 -0
- data/spec/{unit/type → type}/ad_type/test_default_name.rb +1 -2
- data/spec/{unit/type → type}/ad_type/test_dress.rb +19 -9
- data/spec/{unit/type → type}/ad_type/test_include.rb +3 -3
- data/spec/{unit/type → type}/ad_type/test_initialize.rb +15 -8
- data/spec/{unit/type → type}/ad_type/test_name.rb +2 -2
- data/spec/type/alias_type/test_default_name.rb +10 -0
- data/spec/type/alias_type/test_delegation.rb +29 -0
- data/spec/type/alias_type/test_name.rb +10 -0
- data/spec/{unit/type → type}/any_type/test_default_name.rb +1 -1
- data/spec/{unit/type → type}/any_type/test_dress.rb +0 -0
- data/spec/{unit/type → type}/any_type/test_equality.rb +4 -4
- data/spec/{unit/type → type}/any_type/test_include.rb +2 -2
- data/spec/{unit/type → type}/any_type/test_initialize.rb +0 -0
- data/spec/{unit/type → type}/any_type/test_name.rb +2 -2
- data/spec/{unit/type → type}/builtin_type/test_default_name.rb +1 -1
- data/spec/{unit/type → type}/builtin_type/test_dress.rb +3 -3
- data/spec/{unit/type → type}/builtin_type/test_equality.rb +4 -4
- data/spec/{unit/type → type}/builtin_type/test_include.rb +2 -2
- data/spec/{unit/type → type}/builtin_type/test_initialize.rb +1 -1
- data/spec/{unit/type → type}/builtin_type/test_name.rb +2 -2
- data/spec/type/multi_relation_type/test_default_name.rb +19 -0
- data/spec/type/multi_relation_type/test_dress.rb +206 -0
- data/spec/type/multi_relation_type/test_equality.rb +36 -0
- data/spec/type/multi_relation_type/test_include.rb +89 -0
- data/spec/type/multi_relation_type/test_initialize.rb +29 -0
- data/spec/type/multi_relation_type/test_name.rb +27 -0
- data/spec/type/multi_tuple_type/test_default_name.rb +17 -0
- data/spec/type/multi_tuple_type/test_dress.rb +146 -0
- data/spec/type/multi_tuple_type/test_equality.rb +32 -0
- data/spec/type/multi_tuple_type/test_include.rb +73 -0
- data/spec/type/multi_tuple_type/test_initialize.rb +30 -0
- data/spec/type/multi_tuple_type/test_name.rb +24 -0
- data/spec/type/proxy_type/test_delegation.rb +37 -0
- data/spec/type/proxy_type/test_resolve.rb +29 -0
- data/spec/{unit/type → type}/relation_type/test_default_name.rb +0 -0
- data/spec/{unit/type → type}/relation_type/test_dress.rb +24 -24
- data/spec/{unit/type → type}/relation_type/test_equality.rb +6 -6
- data/spec/{unit/type → type}/relation_type/test_include.rb +4 -4
- data/spec/{unit/type → type}/relation_type/test_initialize.rb +2 -2
- data/spec/{unit/type → type}/relation_type/test_name.rb +0 -0
- data/spec/{unit/type → type}/seq_type/test_default_name.rb +0 -0
- data/spec/{unit/type → type}/seq_type/test_dress.rb +5 -5
- data/spec/{unit/type → type}/seq_type/test_equality.rb +4 -4
- data/spec/{unit/type → type}/seq_type/test_include.rb +4 -4
- data/spec/{unit/type → type}/seq_type/test_initialize.rb +3 -3
- data/spec/{unit/type → type}/seq_type/test_name.rb +0 -0
- data/spec/{unit/type → type}/set_type/test_default_name.rb +0 -0
- data/spec/{unit/type → type}/set_type/test_dress.rb +8 -8
- data/spec/{unit/type → type}/set_type/test_equality.rb +4 -4
- data/spec/{unit/type → type}/set_type/test_include.rb +4 -4
- data/spec/{unit/type → type}/set_type/test_initialize.rb +3 -3
- data/spec/{unit/type → type}/set_type/test_name.rb +0 -0
- data/spec/type/struct_type/test_default_name.rb +10 -0
- data/spec/type/struct_type/test_dress.rb +105 -0
- data/spec/type/struct_type/test_equality.rb +28 -0
- data/spec/type/struct_type/test_include.rb +40 -0
- data/spec/type/struct_type/test_initialize.rb +22 -0
- data/spec/type/struct_type/test_name.rb +20 -0
- data/spec/{unit/type → type}/sub_type/test_default_name.rb +2 -2
- data/spec/{unit/type → type}/sub_type/test_dress.rb +14 -14
- data/spec/type/sub_type/test_equality.rb +46 -0
- data/spec/{unit/type → type}/sub_type/test_include.rb +6 -6
- data/spec/type/sub_type/test_initialize.rb +13 -0
- data/spec/{unit/type → type}/sub_type/test_name.rb +4 -4
- data/spec/{unit/type → type}/tuple_type/test_default_name.rb +0 -0
- data/spec/{unit/type → type}/tuple_type/test_dress.rb +18 -18
- data/spec/{unit/type → type}/tuple_type/test_equality.rb +6 -6
- data/spec/{unit/type → type}/tuple_type/test_include.rb +4 -4
- data/spec/{unit/type → type}/tuple_type/test_initialize.rb +4 -4
- data/spec/{unit/type → type}/tuple_type/test_name.rb +0 -0
- data/spec/{unit/type → type}/union_type/test_default_name.rb +0 -0
- data/spec/{unit/type → type}/union_type/test_dress.rb +7 -6
- data/spec/{unit/type → type}/union_type/test_equality.rb +7 -7
- data/spec/{unit/type → type}/union_type/test_include.rb +3 -3
- data/spec/{unit/type → type}/union_type/test_initialize.rb +3 -3
- data/spec/{unit/type → type}/union_type/test_name.rb +0 -0
- data/spec/{unit/type_factory → type_factory}/dsl/test_adt.rb +4 -4
- data/spec/{unit/type_factory → type_factory}/dsl/test_any.rb +1 -1
- data/spec/{unit/type_factory → type_factory}/dsl/test_attribute.rb +16 -2
- data/spec/{unit/type_factory → type_factory}/dsl/test_attributes.rb +1 -1
- data/spec/{unit/type_factory → type_factory}/dsl/test_builtin.rb +3 -3
- data/spec/type_factory/dsl/test_multi_relation.rb +39 -0
- data/spec/type_factory/dsl/test_multi_tuple.rb +37 -0
- data/spec/{unit/type_factory → type_factory}/dsl/test_relation.rb +6 -6
- data/spec/{unit/type_factory → type_factory}/dsl/test_seq.rb +4 -4
- data/spec/{unit/type_factory → type_factory}/dsl/test_set.rb +4 -4
- data/spec/type_factory/dsl/test_struct.rb +45 -0
- data/spec/{unit/type_factory → type_factory}/dsl/test_subtype.rb +10 -8
- data/spec/{unit/type_factory → type_factory}/dsl/test_tuple.rb +5 -5
- data/spec/{unit/type_factory → type_factory}/dsl/test_union.rb +6 -6
- data/spec/{unit/type_factory → type_factory}/factory/test_builtin.rb +1 -1
- data/spec/{unit/type_factory → type_factory}/factory/test_seq_type.rb +2 -2
- data/spec/{unit/type_factory → type_factory}/factory/test_set_type.rb +2 -2
- data/spec/type_factory/factory/test_struct_type.rb +18 -0
- data/spec/{unit/type_factory → type_factory}/factory/test_sub_type.rb +7 -7
- data/spec/{unit/type_factory → type_factory}/factory/test_tuple_type.rb +4 -4
- metadata +398 -286
- data/lib/finitio/data_type.rb +0 -29
- data/lib/finitio/syntax/ad_type.rb +0 -32
- data/lib/finitio/syntax/attribute.rb +0 -15
- data/lib/finitio/syntax/constraints.rb +0 -22
- data/lib/finitio/syntax/heading.rb +0 -19
- data/lib/finitio/syntax/relation_type.rb +0 -15
- data/lib/finitio/syntax/support.rb +0 -13
- data/lib/finitio/syntax/tuple_type.rb +0 -15
- data/spec/acceptance/Finitio/test_default.rb +0 -96
- data/spec/acceptance/Finitio/test_parsing.rb +0 -15
- data/spec/acceptance/ad_type/test_in_finitio.rb +0 -82
- data/spec/acceptance/ad_type/test_in_ruby.rb +0 -60
- data/spec/unit/attribute/test_initialize.rb +0 -13
- data/spec/unit/attribute/test_to_name.rb +0 -10
- data/spec/unit/heading/test_equality.rb +0 -28
- data/spec/unit/heading/test_to_name.rb +0 -32
- data/spec/unit/syntax/nodes/test_attribute.rb +0 -38
- data/spec/unit/syntax/nodes/test_relation_type.rb +0 -59
- data/spec/unit/syntax/nodes/test_tuple_type.rb +0 -59
- data/spec/unit/syntax/nodes/test_type_def.rb +0 -33
- data/spec/unit/test_finitio.rb +0 -15
- data/spec/unit/type/sub_type/test_equality.rb +0 -34
- data/spec/unit/type/sub_type/test_initialize.rb +0 -16
@@ -0,0 +1,53 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module Node
|
4
|
+
|
5
|
+
def resolve_ruby_const(name)
|
6
|
+
name.split('::').inject(::Kernel){|mod,const|
|
7
|
+
mod.const_get(const)
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def metadata
|
12
|
+
m = captures[:metadata].first
|
13
|
+
m && m.value
|
14
|
+
end
|
15
|
+
|
16
|
+
def unique_names!(cs, kind = "constraint")
|
17
|
+
names = {}
|
18
|
+
cs.map(&:name).compact.each do |n|
|
19
|
+
names.merge!(n => true) do |k,_,_|
|
20
|
+
raise Error, "Duplicate #{kind} name `#{k}`"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
cs
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.included(by)
|
27
|
+
by.extend(ClassHelpers)
|
28
|
+
end
|
29
|
+
|
30
|
+
module ClassHelpers
|
31
|
+
|
32
|
+
def capture(*names)
|
33
|
+
names.each do |name|
|
34
|
+
define_method(name) do
|
35
|
+
captures[name].first
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def capture_str(*names)
|
41
|
+
names.each do |name|
|
42
|
+
define_method(name) do
|
43
|
+
x = captures[name].first
|
44
|
+
x && x.to_s
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end # module ClassHelpers
|
50
|
+
|
51
|
+
end # module Node
|
52
|
+
end # module Syntax
|
53
|
+
end # module AstNode
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'type/system'
|
2
|
+
require_relative 'type/definitions'
|
3
|
+
require_relative 'type/type_def'
|
4
|
+
require_relative 'type/main_type'
|
5
|
+
require_relative 'type/expression'
|
6
|
+
require_relative 'type/attribute'
|
7
|
+
require_relative 'type/heading'
|
8
|
+
require_relative 'type/any_type'
|
9
|
+
require_relative 'type/builtin_type'
|
10
|
+
require_relative 'type/sub_type'
|
11
|
+
require_relative 'type/constraint_def'
|
12
|
+
require_relative 'type/constraints'
|
13
|
+
require_relative 'type/named_constraint'
|
14
|
+
require_relative 'type/unnamed_constraint'
|
15
|
+
require_relative 'type/seq_type'
|
16
|
+
require_relative 'type/set_type'
|
17
|
+
require_relative 'type/struct_type'
|
18
|
+
require_relative 'type/tuple_type'
|
19
|
+
require_relative 'type/relation_type'
|
20
|
+
require_relative 'type/union_type'
|
21
|
+
require_relative 'type/type_ref'
|
22
|
+
require_relative 'type/ad_type'
|
23
|
+
require_relative 'type/contract'
|
24
|
+
require_relative 'type/inline_pair'
|
25
|
+
require_relative 'type/external_pair'
|
26
|
+
require_relative 'type/lambda_expr'
|
27
|
+
require_relative 'type/metadata'
|
28
|
+
require_relative 'type/metadata_attr'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module AdType
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :builtin_type_name
|
7
|
+
|
8
|
+
def compile(factory)
|
9
|
+
name = builtin_type_name
|
10
|
+
clazz = name ? resolve_ruby_const(name.to_s) : nil
|
11
|
+
contracts = compile_contracts(factory, clazz)
|
12
|
+
contracts = unique_names!(contracts, "contract")
|
13
|
+
factory.adt(clazz, contracts)
|
14
|
+
end
|
15
|
+
|
16
|
+
def compile_contracts(factory, clazz)
|
17
|
+
captures[:contract].map{|c| c.compile(factory, clazz) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_ast
|
21
|
+
[
|
22
|
+
:ad_type,
|
23
|
+
builtin_type_name ? builtin_type_name.to_s : nil
|
24
|
+
] + captures[:contract].map(&:to_ast)
|
25
|
+
end
|
26
|
+
|
27
|
+
end # module AdType
|
28
|
+
end # module Syntax
|
29
|
+
end # module Finitio
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module Attribute
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :type, :multiplicity
|
7
|
+
capture_str :attribute_name
|
8
|
+
|
9
|
+
def optional?
|
10
|
+
multiplicity == ':?'
|
11
|
+
end
|
12
|
+
|
13
|
+
def required?
|
14
|
+
multiplicity == ':'
|
15
|
+
end
|
16
|
+
|
17
|
+
def compile(factory)
|
18
|
+
n = attribute_name.to_sym
|
19
|
+
t = type.compile(factory)
|
20
|
+
r = required?
|
21
|
+
m = metadata
|
22
|
+
factory.attribute(n, t, r, m)
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_ast
|
26
|
+
ast = [:attribute, attribute_name, type.to_ast]
|
27
|
+
ast << false unless required?
|
28
|
+
ast
|
29
|
+
end
|
30
|
+
|
31
|
+
end # module BuiltinType
|
32
|
+
end # module Syntax
|
33
|
+
end # module Finitio
|
@@ -1,15 +1,16 @@
|
|
1
1
|
module Finitio
|
2
2
|
module Syntax
|
3
3
|
module ConstraintDef
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :var_name, :constraints
|
4
7
|
|
5
8
|
def compile(factory)
|
6
9
|
constraints.compile(var_name.to_s)
|
7
10
|
end
|
8
11
|
|
9
12
|
def to_ast
|
10
|
-
|
11
|
-
ast = [ast] if ast.first.is_a?(Symbol)
|
12
|
-
ast
|
13
|
+
constraints.to_ast(var_name.to_s)
|
13
14
|
end
|
14
15
|
|
15
16
|
end # module ConstraintDef
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module Constraints
|
4
|
+
include Node
|
5
|
+
|
6
|
+
def compile(var_name)
|
7
|
+
cs = captures[:constraint].map{|c| c.compile(var_name) }
|
8
|
+
unique_names!(cs, 'constraint')
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_ast(var_name)
|
12
|
+
captures[:constraint].map{|c| c.to_ast(var_name) }
|
13
|
+
end
|
14
|
+
|
15
|
+
end # module Constraints
|
16
|
+
end # module Syntax
|
17
|
+
end # module Finitio
|
@@ -1,10 +1,16 @@
|
|
1
1
|
module Finitio
|
2
2
|
module Syntax
|
3
3
|
module Contract
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :type, :pair
|
7
|
+
capture_str :contract_name
|
4
8
|
|
5
9
|
def compile(factory, clazz)
|
6
|
-
|
7
|
-
|
10
|
+
name = contract_name.to_sym
|
11
|
+
infotype = type.compile(factory)
|
12
|
+
dresser, undresser = compile_pair(factory, clazz)
|
13
|
+
factory.contract(infotype, dresser, undresser, name, metadata)
|
8
14
|
end
|
9
15
|
|
10
16
|
def compile_pair(factory, clazz)
|
@@ -25,7 +31,7 @@ module Finitio
|
|
25
31
|
def to_ast
|
26
32
|
ast = [
|
27
33
|
:contract,
|
28
|
-
contract_name
|
34
|
+
contract_name,
|
29
35
|
(type && type.to_ast)
|
30
36
|
]
|
31
37
|
ast << pair.to_ast if pair
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module Heading
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :allow_extra
|
7
|
+
|
8
|
+
def allow_extra?
|
9
|
+
!allow_extra.nil?
|
10
|
+
end
|
11
|
+
|
12
|
+
def multi?
|
13
|
+
captures[:attribute].any?{|a| a.optional? } or allow_extra?
|
14
|
+
end
|
15
|
+
|
16
|
+
def attributes(factory)
|
17
|
+
captures[:attribute].map{|a| a.compile(factory) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def compile(factory)
|
21
|
+
Finitio::Heading.new(attributes(factory), allow_extra: allow_extra?)
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_ast
|
25
|
+
captures[:attribute].map(&:to_ast).unshift(:heading)
|
26
|
+
end
|
27
|
+
|
28
|
+
end # module Heading
|
29
|
+
end # module Syntax
|
30
|
+
end # module Finitio
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module MainType
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :type
|
7
|
+
|
8
|
+
def compile(system)
|
9
|
+
system.add_type(type.compile(system), 'Main', metadata)
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_ast
|
13
|
+
type.to_ast
|
14
|
+
end
|
15
|
+
|
16
|
+
end # module MainType
|
17
|
+
end # module Syntax
|
18
|
+
end # module Finitio
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module Metadata
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :description
|
7
|
+
|
8
|
+
def value
|
9
|
+
if description
|
10
|
+
{ description: description.to_str.strip }
|
11
|
+
else
|
12
|
+
Hash[captures[:metadata_attr].map(&:value)]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end # module Metadata
|
17
|
+
end # module Syntax
|
18
|
+
end # module Metadata
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module MetadataAttr
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture_str :attribute_name
|
7
|
+
capture :literal
|
8
|
+
|
9
|
+
def value
|
10
|
+
[ attribute_name.to_sym, literal.value ]
|
11
|
+
end
|
12
|
+
|
13
|
+
end # module MetadataAttr
|
14
|
+
end # module Syntax
|
15
|
+
end # module Metadata
|
@@ -1,15 +1,22 @@
|
|
1
1
|
module Finitio
|
2
2
|
module Syntax
|
3
3
|
module NamedConstraint
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :expression
|
7
|
+
capture_str :constraint_name
|
4
8
|
|
5
9
|
def compile(var_name)
|
6
|
-
|
10
|
+
p = expression.compile(var_name)
|
11
|
+
n = constraint_name.to_sym
|
12
|
+
m = metadata
|
13
|
+
Constraint.new(p, n, metadata)
|
7
14
|
end
|
8
15
|
|
9
16
|
def to_ast(var_name)
|
10
17
|
[ :constraint,
|
11
|
-
constraint_name
|
12
|
-
[:fn, [:parameters, var_name], [:source, expression.
|
18
|
+
constraint_name,
|
19
|
+
[:fn, [:parameters, var_name], [:source, expression.to_str.strip]] ]
|
13
20
|
end
|
14
21
|
|
15
22
|
end # module NamedConstraint
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Finitio
|
2
|
+
module Syntax
|
3
|
+
module RelationType
|
4
|
+
include Node
|
5
|
+
|
6
|
+
capture :heading
|
7
|
+
|
8
|
+
def compile(factory)
|
9
|
+
factory.send(kind, heading.compile(factory))
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_ast
|
13
|
+
[ :"#{kind}_type", heading.to_ast ]
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def kind
|
19
|
+
heading.multi? ? :multi_relation : :relation
|
20
|
+
end
|
21
|
+
|
22
|
+
end # module RelationType
|
23
|
+
end # module Syntax
|
24
|
+
end # module Finitio
|