mirror of
				https://gitea.invidious.io/iv-org/shard-ameba.git
				synced 2024-08-15 00:53:29 +00:00 
			
		
		
		
	Add ability to skip some of the nodes in AST::ScopeVisitor
				
					
				
			This commit is contained in:
		
							parent
							
								
									ad5d56b313
								
							
						
					
					
						commit
						3f7ade573a
					
				
					 1 changed files with 8 additions and 1 deletions
				
			
		| 
						 | 
					@ -8,14 +8,17 @@ module Ameba::AST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @scope_queue = [] of Scope
 | 
					    @scope_queue = [] of Scope
 | 
				
			||||||
    @current_scope : Scope
 | 
					    @current_scope : Scope
 | 
				
			||||||
 | 
					    @skip : Array(Crystal::ASTNode.class)?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def initialize(@rule, @source)
 | 
					    def initialize(@rule, @source, skip = nil)
 | 
				
			||||||
 | 
					      @skip = skip.try &.map(&.as(Crystal::ASTNode.class))
 | 
				
			||||||
      @current_scope = Scope.new(@source.ast) # top level scope
 | 
					      @current_scope = Scope.new(@source.ast) # top level scope
 | 
				
			||||||
      @source.ast.accept self
 | 
					      @source.ast.accept self
 | 
				
			||||||
      @scope_queue.each { |scope| @rule.test @source, scope.node, scope }
 | 
					      @scope_queue.each { |scope| @rule.test @source, scope.node, scope }
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private def on_scope_enter(node)
 | 
					    private def on_scope_enter(node)
 | 
				
			||||||
 | 
					      return if skip?(node)
 | 
				
			||||||
      @current_scope = Scope.new(node, @current_scope)
 | 
					      @current_scope = Scope.new(node, @current_scope)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -182,5 +185,9 @@ module Ameba::AST
 | 
				
			||||||
    private def record_macro?(node)
 | 
					    private def record_macro?(node)
 | 
				
			||||||
      node.name == RECORD_NODE_NAME && node.args.first?.is_a?(Crystal::Path)
 | 
					      node.name == RECORD_NODE_NAME && node.args.first?.is_a?(Crystal::Path)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private def skip?(node)
 | 
				
			||||||
 | 
					      !!@skip.try(&.includes?(node.class))
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue