Class: Steep::Drivers::Check
- Inherits:
-
Object
- Object
- Steep::Drivers::Check
- Includes:
- Utils::EachSignature
- Defined in:
- lib/steep/drivers/check.rb
Instance Attribute Summary collapse
-
#accept_implicit_any ⇒ Object
Returns the value of attribute accept_implicit_any.
-
#allow_missing_definitions ⇒ Object
Returns the value of attribute allow_missing_definitions.
-
#dump_all_types ⇒ Object
Returns the value of attribute dump_all_types.
-
#fallback_any_is_error ⇒ Object
Returns the value of attribute fallback_any_is_error.
-
#labeling ⇒ Object
readonly
Returns the value of attribute labeling.
-
#signature_dirs ⇒ Object
readonly
Returns the value of attribute signature_dirs.
-
#source_paths ⇒ Object
readonly
Returns the value of attribute source_paths.
-
#stderr ⇒ Object
readonly
Returns the value of attribute stderr.
-
#stdout ⇒ Object
readonly
Returns the value of attribute stdout.
-
#verbose ⇒ Object
Returns the value of attribute verbose.
Instance Method Summary collapse
-
#initialize(source_paths:, signature_dirs:, stdout:, stderr:) ⇒ Check
constructor
A new instance of Check.
- #run ⇒ Object
Methods included from Utils::EachSignature
#each_file_in_dir, #each_ruby_file, #each_ruby_source, #each_signature
Constructor Details
#initialize(source_paths:, signature_dirs:, stdout:, stderr:) ⇒ Check
Returns a new instance of Check.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/steep/drivers/check.rb', line 19 def initialize(source_paths:, signature_dirs:, stdout:, stderr:) @source_paths = source_paths @signature_dirs = signature_dirs @stdout = stdout @stderr = stderr self.verbose = false self.accept_implicit_any = false self.dump_all_types = false self.fallback_any_is_error = false self.allow_missing_definitions = true @labeling = ASTUtils::Labeling.new end |
Instance Attribute Details
#accept_implicit_any ⇒ Object
Returns the value of attribute accept_implicit_any.
10 11 12 |
# File 'lib/steep/drivers/check.rb', line 10 def accept_implicit_any @accept_implicit_any end |
#allow_missing_definitions ⇒ Object
Returns the value of attribute allow_missing_definitions.
13 14 15 |
# File 'lib/steep/drivers/check.rb', line 13 def allow_missing_definitions @allow_missing_definitions end |
#dump_all_types ⇒ Object
Returns the value of attribute dump_all_types.
11 12 13 |
# File 'lib/steep/drivers/check.rb', line 11 def dump_all_types @dump_all_types end |
#fallback_any_is_error ⇒ Object
Returns the value of attribute fallback_any_is_error.
12 13 14 |
# File 'lib/steep/drivers/check.rb', line 12 def fallback_any_is_error @fallback_any_is_error end |
#labeling ⇒ Object (readonly)
Returns the value of attribute labeling.
15 16 17 |
# File 'lib/steep/drivers/check.rb', line 15 def labeling @labeling end |
#signature_dirs ⇒ Object (readonly)
Returns the value of attribute signature_dirs.
5 6 7 |
# File 'lib/steep/drivers/check.rb', line 5 def signature_dirs @signature_dirs end |
#source_paths ⇒ Object (readonly)
Returns the value of attribute source_paths.
4 5 6 |
# File 'lib/steep/drivers/check.rb', line 4 def source_paths @source_paths end |
#stderr ⇒ Object (readonly)
Returns the value of attribute stderr.
7 8 9 |
# File 'lib/steep/drivers/check.rb', line 7 def stderr @stderr end |
#stdout ⇒ Object (readonly)
Returns the value of attribute stdout.
6 7 8 |
# File 'lib/steep/drivers/check.rb', line 6 def stdout @stdout end |
#verbose ⇒ Object
Returns the value of attribute verbose.
9 10 11 |
# File 'lib/steep/drivers/check.rb', line 9 def verbose @verbose end |
Instance Method Details
#run ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/steep/drivers/check.rb', line 34 def run Steep.logger.level = Logger::DEBUG if verbose env = AST::Signature::Env.new each_signature(signature_dirs, verbose) do |signature| env.add signature end builder = Interface::Builder.new(signatures: env) check = Subtyping::Check.new(builder: builder) validator = Utils::Validator.new(stdout: stdout, stderr: stderr, verbose: verbose) validated = validator.run(env: env, builder: builder, check: check) do |sig| stderr.puts "Validating #{sig.name} (#{sig.location.name}:#{sig.location.start_line})..." if verbose end unless validated return 1 end sources = [] each_ruby_source(source_paths, verbose) do |source| sources << source end typing = Typing.new sources.each do |source| Steep.logger.tagged source.path do Steep.logger.debug "Typechecking..." annotations = source.annotations(block: source.node, builder: check.builder, current_module: AST::Namespace.root) const_env = TypeInference::ConstantEnv.new(builder: check.builder, context: nil) type_env = TypeInference::TypeEnv.build(annotations: annotations, subtyping: check, const_env: const_env, signatures: check.builder.signatures) construction = TypeConstruction.new( checker: check, annotations: annotations, source: source, self_type: AST::Builtin::Object.instance_type, block_context: nil, module_context: TypeConstruction::ModuleContext.new( instance_type: nil, module_type: nil, implement_name: nil, current_namespace: AST::Namespace.root, const_env: const_env ), method_context: nil, typing: typing, break_context: nil, type_env: type_env ) construction.synthesize(source.node) end end if dump_all_types lines = [] typing.nodes.each_value do |node| begin type = typing.type_of(node: node) lines << [node.loc.expression.source_buffer.name, [node.loc.last_line,node.loc.last_column], [node.loc.first_line, node.loc.column], node, type] rescue lines << [node.loc.expression.source_buffer.name, [node.loc.last_line,node.loc.last_column], [node.loc.first_line, node.loc.column], node, nil] end end lines.sort {|x,y| y <=> x }.reverse_each do |line| source = line[3].loc.expression.source stdout.puts "#{line[0]}:(#{line[2].join(",")}):(#{line[1].join(",")}):\t#{line[3].type}:\t#{line[4]}\t(#{source.split(/\n/).first})" end end errors = typing.errors.select do |error| case when error.is_a?(Errors::FallbackAny) && !fallback_any_is_error false when error.is_a?(Errors::MethodDefinitionMissing) && allow_missing_definitions false else true end end errors.each do |error| error.print_to stdout end errors.empty? ? 0 : 1 end |