Beispiel #1
0
def complete_paths():
    line = util.get_line()[0:util.get_cursor_col_num() - 1]
    m = re.search("res://(((\w|-)+/)*)$", line)
    if m:
        project_dir = util.get_project_dir()
        if not project_dir:
            return
        # Directories and files are grouped and sorted separately.
        dirs = []
        files = []
        base_dir = "{}/{}".format(project_dir, m.group(1))
        if not os.path.isdir(base_dir):
            return
        for entry in os.listdir(base_dir):
            if not entry.startswith("."):
                if not util.filter(entry):
                    continue
                if os.path.isdir("{}/{}".format(base_dir, entry)):
                    dirs.append("{}/".format(entry))
                else:
                    files.append(entry)
        for d in sorted(dirs):
            append_completion(d)
        for f in sorted(files):
            append_completion(f)
Beispiel #2
0
def complete_dot():
    line_num = util.get_cursor_line_num()
    line = util.get_line(line_num)
    col_num = util.get_cursor_col_num()
    token_chain = script.get_token_chain(line, line_num, col_num - 2)
    if token_chain:
        last_token = token_chain[-1]
        last_token_type = type(last_token)

        # Complete statically accessible items in classes.
        if last_token_type is script.ClassToken:
            # Class is defined by Godot.
            if last_token.line == -1:
                c = classes.get_class(last_token.name)
                # Manually add an entry for 'new()' for core types.
                if not c.is_built_in():
                    new_func = classes.GodotMethod("new", c.get_name(), [],
                                                   None)
                    append_completion(build_completion(new_func, c.get_name()))
                _add_class_items(c, _CONSTANTS)
            else:
                for decl in script.iter_static_decls(last_token.line,
                                                     script.ANY_DECLS):
                    append_completion(build_completion(decl))
            return

        # Treat 'self' like we're accessing script variables, but exclude globals.
        if last_token_type is script.VariableToken and last_token.name == "self":
            complete_script(include_globals=False)
            return

        # Complete enum values.
        if last_token_type is script.EnumToken:
            values = script.get_enum_values(last_token.line)
            if values:
                for value in values:
                    append_completion(build_completion(value))
            return

        c_name = None
        flags = None
        if len(token_chain
               ) == 1 and last_token_type is script.SuperAccessorToken:
            c_name = script.get_extended_class(line_num)
            flags = _METHODS
        elif last_token_type is script.MethodToken:
            c_name = last_token.returns
        elif last_token_type is script.VariableToken:
            c_name = last_token.type
        if c_name:
            _add_class_items(classes.get_class(c_name), flags)
Beispiel #3
0
def gdscript_complete():
    util.clear_cache()
    completer.clear_completions()

    line = util.get_line()[0:util.get_cursor_col_num()]
    syn_attr = util.get_syn_attr()
    if syn_attr == "gdComment":
        return
    elif syn_attr == "gdString":
        completer.complete_paths()
    elif re.match("(\s*class\s+\w+\s+)?extends\s*", line):
        completer.complete_class_names(classes.EXTENDABLE)
    elif re.match("export\(\s*", line):
        completer.complete_class_names(classes.EXPORTABLE)
    elif re.match("\s*func", line):
        completer.complete_method_signatures()
    elif line and line[-1] == ".":
        completer.complete_dot()
    else:
        completer.complete_script(include_globals=True)

    completions = completer.get_completions()
    vim.command("let gdscript_completions = " + str(completions))
Beispiel #4
0
def echodoc_search():
    util.clear_cache()

    text = vim.eval("a:text")
    text_len = len(text)
    if text_len == 0:
        return

    m = re.match("\w+", text)
    if not m:
        return
    method_name = m.group(0)

    chain_start = util.get_cursor_col_num() - text_len - 1
    line_num = util.get_cursor_line_num()
    line = util.get_line(line_num)[:chain_start]
    line = "{}{}()".format(line, method_name)

    method_args = None
    tokens = script.get_token_chain(line, line_num, len(line))
    if tokens and type(tokens[-1]) is script.MethodToken:
        method_args = tokens[-1].args
    else:
        return

    hl_identifier = vim.eval("g:echodoc#highlight_identifier")
    hl_arguments = vim.eval("g:echodoc#highlight_arguments")
    arg_hl_index = 0
    paren_count = 0
    for char in text[len(m.group(0)) + 1:]:
        if char == "(":
            paren_count += 1
        elif char == ")":
            paren_count -= 1
        elif char == "," and paren_count <= 0:
            arg_hl_index += 1

    echodoc = [{
        "text": method_name,
        "highlight": hl_identifier
    }, {
        "text": "("
    }]

    arg_count = len(method_args)
    for (i, arg) in enumerate(method_args):
        if arg.type:
            echodoc.append({
                "text": "{} ".format(arg.type),
                "highlight": "gdClass"
            })
        d = {"text": arg.name}
        if arg_hl_index == i:
            d["highlight"] = hl_arguments
        echodoc.append(d)
        if arg_count - 1 > i:
            echodoc.append({"text": ", "})
    if tokens[-1].qualifiers and "vararg" in tokens[-1].qualifiers:
        if arg_count > 0:
            echodoc.append({"text": ", "})
        d = {"text": "..."}
        if arg_hl_index >= arg_count:
            d["highlight"] = hl_arguments
        echodoc.append(d)
    echodoc.append({"text": ")"})

    vim.command("let echodoc_search_result = {}".format(str(echodoc)))