lib/yard/code_objects/proxy.rb in yard-0.6.8 vs lib/yard/code_objects/proxy.rb in yard-0.7.0

- old
+ new

@@ -6,11 +6,11 @@ # The Proxy class is a way to lazily resolve code objects in # cases where the object may not yet exist. A proxy simply stores # an unresolved path until a method is called on the object, at which # point it does a lookup using {Registry.resolve}. If the object is # not found, a warning is raised and {ProxyMethodError} might be raised. - # + # # @example Creates a Proxy to the String class from a module # # When the String class is parsed this method will # # begin to act like the String ClassObject. # Proxy.new(mymoduleobj, "String") # @see Registry.resolve @@ -20,54 +20,54 @@ attr_reader :namespace alias_method :parent, :namespace # Creates a new Proxy - # + # # @raise [ArgumentError] if namespace is not a NamespaceObject # @return [Proxy] self def initialize(namespace, name) namespace = Registry.root if !namespace || namespace == :root - + if name =~ /^#{NSEPQ}/ namespace = Registry.root name = name[2..-1] end - + if name =~ /(?:#{NSEPQ}|#{ISEPQ}|#{CSEPQ})([^#{NSEPQ}#{ISEPQ}#{CSEPQ}]+)$/ @orignamespace, @origname = namespace, name @imethod = true if name.include? ISEP namespace = Proxy.new(namespace, $`) unless $`.empty? name = $1 else @orignamespace, @origname, @imethod = nil, nil, nil - end - + end + @name = name.to_sym @namespace = namespace @obj = nil @imethod ||= nil - + if @namespace.is_a?(ConstantObject) @origname = nil # forget these for a constant @orignamespace = nil @namespace = Proxy.new(@namespace.namespace, @namespace.value) end - + unless @namespace.is_a?(NamespaceObject) or @namespace.is_a?(Proxy) raise ArgumentError, "Invalid namespace object: #{namespace}" end - + # If the name begins with "::" (like "::String") # this is definitely a root level object, so # remove the namespace and attach it to the root if @name =~ /^#{NSEPQ}/ @name.gsub!(/^#{NSEPQ}/, '') @namespace = Registry.root end end - + # (see Base#name) def name(prefix = false) prefix ? (@imethod ? ISEP : '') + @name.to_s : @name end @@ -78,14 +78,14 @@ obj.inspect else "P(#{path})" end end - + # If the proxy resolves to an object, returns its path, otherwise # guesses at the correct path using the original namespace and name. - # + # # @return [String] the assumed path of the proxy (or the real path # of the resolved object) def path if obj = to_obj obj.path @@ -105,62 +105,62 @@ end end end alias to_s path alias to_str path - - # @return [Boolean] + + # @return [Boolean] def is_a?(klass) if obj = to_obj obj.is_a?(klass) else self.class <= klass end end - - # @return [Boolean] + + # @return [Boolean] def ===(other) if obj = to_obj obj === other else self.class <= other.class end end - - # @return [Boolean] + + # @return [Boolean] def <=>(other) if other.respond_to? :path path <=> other.path else false end end - - # @return [Boolean] + + # @return [Boolean] def equal?(other) if other.respond_to? :path path == other.path else false end end alias == equal? - + # @return [Integer] the object's hash value (for equality checking) def hash; path.hash end # Returns the class name of the object the proxy is mimicking, if - # resolved. Otherwise returns +Proxy+. + # resolved. Otherwise returns +Proxy+. # @return [Class] the resolved object's class or +Proxy+ def class if obj = to_obj obj.class else Proxy end end - + # Returns the type of the proxy. If it cannot be resolved at the # time of the call, it will either return the inferred proxy type # (see {#type=}) or +:proxy+ # @return [Symbol] the Proxy's type # @see #type= @@ -169,37 +169,37 @@ obj.type else Registry.proxy_types[path] || :proxy end end - + # Allows a parser to infer the type of the proxy by its path. # @param [#to_sym] type the proxy's inferred type - # @return [void] + # @return [void] def type=(type) Registry.proxy_types[path] = type.to_sym end - - # @return [Boolean] + + # @return [Boolean] def instance_of?(klass) self.class == klass end - - # @return [Boolean] + + # @return [Boolean] def kind_of?(klass) self.class <= klass end - - # @return [Boolean] + + # @return [Boolean] def respond_to?(meth, include_private = false) if obj = to_obj obj.respond_to?(meth, include_private) else super end end - + # Dispatches the method to the resolved object. - # + # # @raise [ProxyMethodError] if the proxy cannot find the real object def method_missing(meth, *args, &block) if obj = to_obj obj.__send__(meth, *args, &block) else @@ -210,29 +210,29 @@ log.warn "so that #{path} is parsed before methods or other objects attempt to access it." log.warn "-" log.warn "YARD will recover from this error and continue to parse but you *may* have problems" log.warn "with your generated documentation. You should probably fix this." log.warn "-" - begin + begin super rescue NoMethodError raise ProxyMethodError, "Proxy cannot call method ##{meth} on object '#{path}'" end end end - + # This class is never a root object def root?; false end - + private # @note this method fixes a bug in 1.9.2: http://gist.github.com/437136 def to_ary; nil end - + # Attempts to find the object that this unresolved object # references by checking if any objects by this name are # registered all the way up the namespace tree. - # + # # @return [Base, nil] the registered code object or nil def to_obj return @obj if @obj if @obj = Registry.resolve(@namespace, (@imethod ? ISEP : '') + @name.to_s) if @origname && @origname.include?("::") && !@obj.path.include?(@origname)