Commit 45e3f666 authored by Hector Diaz's avatar Hector Diaz Committed by Walter Erquinigo
Browse files

Auto-completion bug fix for dot operator

Summary:
There was a bug on LLDB VSCode where there was the following behavior:

//Code

```
struct foo {
    int bar:
};
...
foo my_foo = {10};
```

Trying to auto-complete my_foo.b with my_foo.bar resulted instead with my_foo.my_foo.bar

This diff fixes this bug and adds some tests to check correct behavior.

It also fixes the same bug using the arrow operator (->) when user manually requests completions.
TODO: Fix bug where no recommended completions are automatically shown with arrow operator

{F11249959}

{F11249958}

Reviewers: wallace

Reviewed By: wallace

Subscribers: teemperor, labath, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D73506
parent fff6a1b0
Loading
Loading
Loading
Loading
+73 −0
Original line number Diff line number Diff line
@@ -113,3 +113,76 @@ class TestVSCode_variables(lldbvscode_testcase.VSCodeTestCaseBase):
                }
            ],
        )

        self.verify_completions(
            self.vscode.get_completions("foo1.v"),
            [
                {
                    "text": "var1",
                    "label": "foo1.var1 -- int"
                }
            ]
        )

        self.verify_completions(
            self.vscode.get_completions("foo1.my_bar_object.v"),
            [
                {
                    "text": "var1",
                    "label": "foo1.my_bar_object.var1 -- int"
                }
            ]
        )

        self.verify_completions(
            self.vscode.get_completions("foo1.var1 + foo1.v"),
            [
                {
                    "text": "var1",
                    "label": "foo1.var1 -- int"
                }
            ]
        )

        self.verify_completions(
            self.vscode.get_completions("foo1.var1 + v"),
            [
                {
                    "text": "var1",
                    "label": "var1 -- int &"
                }
            ]
        )

        #should correctly handle spaces between objects and member operators
        self.verify_completions(
            self.vscode.get_completions("foo1 .v"),
            [
                {
                    "text": "var1",
                    "label": ".var1 -- int"
                }
            ],
            [
                {
                    "text": "var2",
                    "label": ".var2 -- int"
                }
            ]
        )

        self.verify_completions(
            self.vscode.get_completions("foo1 . v"),
            [
                {
                    "text": "var1",
                    "label": "var1 -- int"
                }
            ], 
            [
                {
                    "text": "var2",
                    "label": "var2 -- int"
                }
            ]
        )
+14 −0
Original line number Diff line number Diff line
#include <string>
#include <vector>

struct bar {
  int var1;
};

struct foo {
  int var1;
  bar* my_bar_pointer;
  bar my_bar_object;
  foo* next_foo;
};

int fun(std::vector<std::string> var) {
  return var.size(); // breakpoint 1
}
@@ -12,5 +23,8 @@ int main(int argc, char const *argv[]) {
  std::string str2 = "b";
  std::vector<std::string> vec;
  fun(vec);
  bar bar1 = {2};
  bar* bar2 = &bar1; 
  foo foo1 = {3,&bar1, bar1, NULL};
  return 0; // breakpoint 2
}
+10 −2
Original line number Diff line number Diff line
@@ -953,7 +953,15 @@ void request_completions(const llvm::json::Object &request) {
    std::string description = descriptions.GetStringAtIndex(i);
    
    llvm::json::Object item;
    EmplaceSafeString(item, "text", match);

    llvm::StringRef match_ref = match;
    for(llvm::StringRef commit_point: {".", "->"}) {
      if (match_ref.contains(commit_point)){
        match_ref = match_ref.rsplit(commit_point).second;
      }
    }
    EmplaceSafeString(item, "text", match_ref);

    if (description.empty())
      EmplaceSafeString(item, "label", match);
    else