From f30d72f66d6b59414004063a164e4ca5f9ac3b2a Mon Sep 17 00:00:00 2001 From: Julian Friedman Date: Mon, 28 Aug 2023 15:58:09 +0100 Subject: [PATCH] Use Compile method in preference to mutex This also means we no longer expose the rules field publicly, which seems better. --- analyzer.go | 7 ++++--- config.go | 47 ++++++++++++++++++++++------------------------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/analyzer.go b/analyzer.go index a1272b9..893e42b 100644 --- a/analyzer.go +++ b/analyzer.go @@ -31,19 +31,20 @@ func run(pass *analysis.Pass) (interface{}, error) { } func runWithConfig(config *Config, pass *analysis.Pass) (interface{}, error) { - if err := config.CompileRegexp(); err != nil { + c, err := config.Compile() + if err != nil { return nil, err } inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) inspect.Preorder([]ast.Node{(*ast.ImportSpec)(nil)}, func(n ast.Node) { - visitImportSpecNode(config, n.(*ast.ImportSpec), pass) + visitImportSpecNode(c, n.(*ast.ImportSpec), pass) }) return nil, nil } -func visitImportSpecNode(config *Config, node *ast.ImportSpec, pass *analysis.Pass) { +func visitImportSpecNode(config *CompiledConfig, node *ast.ImportSpec, pass *analysis.Pass) { if !config.DisallowUnaliased && node.Name == nil { return } diff --git a/config.go b/config.go index 6c16a99..d1cb653 100644 --- a/config.go +++ b/config.go @@ -4,28 +4,25 @@ import ( "errors" "fmt" "regexp" - "sync" ) type Config struct { RequiredAlias map[string]string - Rules []*Rule DisallowUnaliased bool DisallowExtraAliases bool - muRules sync.Mutex } -func (c *Config) CompileRegexp() error { - c.muRules.Lock() - defer c.muRules.Unlock() - if c.Rules != nil { - return nil - } +type CompiledConfig struct { + Config + rules []*Rule +} + +func (c Config) Compile() (*CompiledConfig, error) { rules := make([]*Rule, 0, len(c.RequiredAlias)) for path, alias := range c.RequiredAlias { reg, err := regexp.Compile(fmt.Sprintf("^%s$", path)) if err != nil { - return err + return nil, err } rules = append(rules, &Rule{ @@ -33,24 +30,14 @@ func (c *Config) CompileRegexp() error { Alias: alias, }) } - c.Rules = rules - return nil -} - -func (c *Config) findRule(path string) *Rule { - c.muRules.Lock() - rules := c.Rules - c.muRules.Unlock() - for _, rule := range rules { - if rule.Regexp.MatchString(path) { - return rule - } - } - return nil + return &CompiledConfig{ + Config: c, + rules: rules, + }, nil } -func (c *Config) AliasFor(path string) (string, bool) { +func (c *CompiledConfig) AliasFor(path string) (string, bool) { rule := c.findRule(path) if rule == nil { return "", false @@ -64,6 +51,16 @@ func (c *Config) AliasFor(path string) (string, bool) { return alias, true } +func (c *CompiledConfig) findRule(path string) *Rule { + for _, rule := range c.rules { + if rule.Regexp.MatchString(path) { + return rule + } + } + + return nil +} + type Rule struct { Alias string Regexp *regexp.Regexp