forked from Botanical/BotanJS
Fixed resolver incorrectly stripping class names
This commit is contained in:
@@ -113,52 +113,77 @@ func (r *Resolver) ResolveRequest(code string, mode OutputMode, excludes []strin
|
||||
func (r *Resolver) ResolveSymbol(name string) ([]classmap.Symbol, error) {
|
||||
seen := map[string]bool{}
|
||||
var out []classmap.Symbol
|
||||
if strings.HasSuffix(name, ".*") {
|
||||
prefix := strings.TrimSuffix(name, "*")
|
||||
var keys []string
|
||||
for k, s := range r.Map.Symbols {
|
||||
if strings.HasPrefix(k, prefix) && s.Kind == classmap.KindClass && k != strings.TrimSuffix(prefix, ".") {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
}
|
||||
if len(keys) == 0 {
|
||||
return nil, fmt.Errorf("namespace does not exist or contains no classes: %s", name)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
for _, k := range keys {
|
||||
if err := r.resolveOne(k, seen, &out); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
if err := r.resolveOne(name, seen, &out); err != nil {
|
||||
|
||||
if err := r.resolveImport(name, seen, &out); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (r *Resolver) resolveImport(name string, seen map[string]bool, out *[]classmap.Symbol) error {
|
||||
if strings.HasSuffix(name, ".*") {
|
||||
return r.resolveWildcard(name, seen, out)
|
||||
}
|
||||
|
||||
return r.resolveOne(name, seen, out)
|
||||
}
|
||||
|
||||
func (r *Resolver) resolveWildcard(name string, seen map[string]bool, out *[]classmap.Symbol) error {
|
||||
prefix := strings.TrimSuffix(name, "*")
|
||||
namespace := strings.TrimSuffix(prefix, ".")
|
||||
|
||||
var keys []string
|
||||
for k, s := range r.Map.Symbols {
|
||||
if strings.HasPrefix(k, prefix) &&
|
||||
s.Kind == classmap.KindClass &&
|
||||
k != namespace {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
}
|
||||
|
||||
if len(keys) == 0 {
|
||||
return fmt.Errorf("namespace does not exist or contains no classes: %s", name)
|
||||
}
|
||||
|
||||
sort.Strings(keys)
|
||||
|
||||
for _, k := range keys {
|
||||
if err := r.resolveOne(k, seen, out); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Resolver) resolveOne(name string, seen map[string]bool, out *[]classmap.Symbol) error {
|
||||
if seen[name] {
|
||||
return nil
|
||||
}
|
||||
|
||||
sym, ok := r.Map.Symbols[name]
|
||||
if !ok {
|
||||
return fmt.Errorf("no such class: %s", name)
|
||||
}
|
||||
|
||||
seen[name] = true
|
||||
|
||||
imports := sym.Imports
|
||||
|
||||
// Old resolver uses parent imports when the found node is prop/method.
|
||||
if sym.Kind != classmap.KindClass && sym.Parent != "" {
|
||||
if p, ok := r.Map.Symbols[sym.Parent]; ok {
|
||||
imports = p.Imports
|
||||
}
|
||||
}
|
||||
|
||||
for _, imp := range imports {
|
||||
if err := r.resolveOne(imp, seen, out); err != nil {
|
||||
if err := r.resolveImport(imp, seen, out); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
*out = append(*out, sym)
|
||||
return nil
|
||||
}
|
||||
@@ -315,7 +340,7 @@ func DecodeRequest(code string) ([]string, error) {
|
||||
sep = ","
|
||||
}
|
||||
}
|
||||
cleaner := regexp.MustCompile(`[^A-Za-z.\*\-_/ ,]`)
|
||||
cleaner := regexp.MustCompile(`[^A-Za-z0-9.\*\-_/ ,]`)
|
||||
decoded = cleaner.ReplaceAllString(decoded, "")
|
||||
var fields []string
|
||||
for _, p := range strings.Split(decoded, sep) {
|
||||
|
||||
Reference in New Issue
Block a user