Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/typeprof/core/ast.rb
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@ def self.create_node(raw_node, lenv, use_result = true, allow_meta = false)
return IncludeMetaNode.new(raw_node, lenv)
when :attr_reader
return AttrReaderMetaNode.new(raw_node, lenv)
when :attr_writer
return AttrWriterMetaNode.new(raw_node, lenv)
when :attr_accessor
return AttrAccessorMetaNode.new(raw_node, lenv)
end
Expand Down
56 changes: 56 additions & 0 deletions lib/typeprof/core/ast/meta.rb
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,62 @@ def install0(genv)
end
end

class AttrWriterMetaNode < Node
def initialize(raw_node, lenv)
super(raw_node, lenv)
@args = []
raw_node.arguments.arguments.each do |raw_arg|
@args << raw_arg.value.to_sym if raw_arg.type == :symbol_node
end
end

attr_reader :args

def attrs = { args: }

def mname_code_range(name)
idx = @args.index(name.to_sym)
node = @raw_node.arguments.arguments[idx].location
@lenv.code_range_from_node(node)
end

def define0(genv)
@args.map do |arg|
mod = genv.resolve_ivar(lenv.cref.cpath, false, :"@#{ arg }")
mod.add_def(self)
mod
end
end

def define_copy(genv)
@args.map do |arg|
mod = genv.resolve_ivar(lenv.cref.cpath, false, :"@#{ arg }")
mod.add_def(self)
mod.remove_def(@prev_node)
mod
end
super(genv)
end

def undefine0(genv)
@args.each do |arg|
mod = genv.resolve_ivar(lenv.cref.cpath, false, :"@#{ arg }")
mod.remove_def(self)
end
end

def install0(genv)
@args.zip(@static_ret) do |arg, ive|
vtx = Vertex.new(self)
@changes.add_edge(genv, vtx, ive.vtx)
ret_box = @changes.add_escape_box(genv, vtx)
f_args = FormalArguments.new([vtx], [], nil, [], [], [], nil, nil)
@changes.add_method_def_box(genv, @lenv.cref.cpath, false, :"#{ arg }=", f_args, [ret_box])
end
Source.new
end
end

class AttrAccessorMetaNode < Node
def initialize(raw_node, lenv)
super(raw_node, lenv)
Expand Down
17 changes: 17 additions & 0 deletions scenario/misc/attr_writer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## update
class Foo
attr_writer :x

def get_x
@x
end
end

Foo.new.x = 1
Foo.new.get_x

## assert
class Foo
def x=: (Integer) -> Integer
def get_x: -> Integer
end
Loading