Fixed resolver incorrectly stripping class names

This commit is contained in:
2026-06-13 09:48:40 +08:00
parent 803bd80557
commit 021655464d
8 changed files with 61 additions and 36 deletions
+47 -22
View File
@@ -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) {