()
| 852 | } |
| 853 | |
| 854 | func (c *Completer) qualifierParts() []string { |
| 855 | collectOffset := c.cursorByteOffset - len(c.completionPrefix) |
| 856 | if collectOffset > len(c.sql) { |
| 857 | collectOffset = len(c.sql) |
| 858 | } |
| 859 | before := strings.TrimRight(c.sql[:collectOffset], " \t\r\n") |
| 860 | if !strings.HasSuffix(before, ".") { |
| 861 | return nil |
| 862 | } |
| 863 | before = strings.TrimSuffix(before, ".") |
| 864 | var parts []string |
| 865 | for { |
| 866 | before = strings.TrimRight(before, " \t\r\n") |
| 867 | part, start := lastIdentifierSpan(before) |
| 868 | if part == "" { |
| 869 | break |
| 870 | } |
| 871 | parts = append([]string{unquote(part)}, parts...) |
| 872 | before = strings.TrimRight(before[:start], " \t\r\n") |
| 873 | if !strings.HasSuffix(before, ".") { |
| 874 | break |
| 875 | } |
| 876 | before = strings.TrimSuffix(before, ".") |
| 877 | } |
| 878 | return parts |
| 879 | } |
| 880 | |
| 881 | func lastIdentifierSpan(s string) (string, int) { |
| 882 | s = strings.TrimSpace(s) |
no test coverage detected