The abigen exclusion pattern, previously on the form "path:type", now supports wildcards. Examples "*:type" to exclude a named type in all files, or "/path/to/foo.sol:*" all types in foo.sol.
		
			
				
	
	
		
			59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
type nameFilter struct {
 | 
						|
	fulls map[string]bool // path/to/contract.sol:Type
 | 
						|
	files map[string]bool // path/to/contract.sol:*
 | 
						|
	types map[string]bool // *:Type
 | 
						|
}
 | 
						|
 | 
						|
func newNameFilter(patterns ...string) (*nameFilter, error) {
 | 
						|
	f := &nameFilter{
 | 
						|
		fulls: make(map[string]bool),
 | 
						|
		files: make(map[string]bool),
 | 
						|
		types: make(map[string]bool),
 | 
						|
	}
 | 
						|
	for _, pattern := range patterns {
 | 
						|
		if err := f.add(pattern); err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return f, nil
 | 
						|
}
 | 
						|
 | 
						|
func (f *nameFilter) add(pattern string) error {
 | 
						|
	ft := strings.Split(pattern, ":")
 | 
						|
	if len(ft) != 2 {
 | 
						|
		// filenames and types must not include ':' symbol
 | 
						|
		return fmt.Errorf("invalid pattern: %s", pattern)
 | 
						|
	}
 | 
						|
 | 
						|
	file, typ := ft[0], ft[1]
 | 
						|
	if file == "*" {
 | 
						|
		f.types[typ] = true
 | 
						|
		return nil
 | 
						|
	} else if typ == "*" {
 | 
						|
		f.files[file] = true
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	f.fulls[pattern] = true
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (f *nameFilter) Matches(name string) bool {
 | 
						|
	ft := strings.Split(name, ":")
 | 
						|
	if len(ft) != 2 {
 | 
						|
		// If contract names are always of the fully-qualified form
 | 
						|
		// <filePath>:<type>, then this case will never happen.
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	file, typ := ft[0], ft[1]
 | 
						|
	// full paths > file paths > types
 | 
						|
	return f.fulls[name] || f.files[file] || f.types[typ]
 | 
						|
}
 |