Skip to content

代码补全要求

bitbegin edited this page Mar 20, 2019 · 11 revisions

目标

插件基于对Red源代码进行语义分析,需提供较VSCode原始补全功能更有用的信息。目前只需完成对context(包括object)和function(包括func,does)的静态分析。

Context补全

Red程序由Red Value组成,而所有Red Value默认都在一个隐含的全局context里。因此,所有的补全都发生在某一个context内。此类补全需收集context内的set-word作为候选词,当context重复定义时,以最后一次定义的context为准。如context有嵌套,在子context内补全时应同时显示其所有上层context中的候选词。同时,Red Runtime内已经定义的word也需要出现在候选词列表里。

  • 例子1,基本情况
Red []

abc123: "hello"
abc321: 2

ab -> 输入ab,需提示候选词 abc123, abc321, about 和 absolute。注意最后两个是Red Runtime预定义的。
  • 例子2,word重复定义
Red []

abc123: 2
abc123: context [
    xx: 123
]
abc123: context [
    abc: none
    bcd: 2
]

ab -> 输入ab,需提示候选词 abc123, about 和 absolute。
abc123/ -> 输入abc123/,需提示候选词 abc 和 bcd。
  • 例子3,context内提示
Red []

xxx: 1
abc123: 2
abc123: context [
    abc: none
    bcd: 2
]

abc321: context [
    abc222: "haha"
    ab -> 此处输入ab,需提示候选词 abc222, abc123, abc321, about 和 absolute。
          (最近的word显示最靠前,因此abc222显示在第一个)
    abc123/ -> 此处输入abc123/,需提示候选词 abc 和 bcd。
]
  • 例子4,多层嵌套context
Red []

abc123: 2
abc123: context [
    abc: none
    bcd: 2
]

abc321: context [
    xyz: 999
    abc222: "haha"
    bcd: context [
        xxx: 2
        abc333: "cool"
        ab -> 此处输入ab,需提示候选词abc333, abc222, abc123, abc321, about 和 absolute。
              (最近的word显示最靠前,因此abc333显示在第一个)
        abc123/ -> 此处输入abc123/,需提示候选词 abc 和 bcd。
        abc321/ -> 此处输入abc321/,需提示候选词 xyz, abc222 和 bcd。
    ]
    ab -> 此处输入ab,需提示候选词 abc222, abc123, abc321, about 和 absolute。
          (最近的word显示最靠前,因此abc222显示在第一个)
    abc123/ -> 此处输入abc123/,需提示候选词 abc 和 bcd。
]

abc321/bcd/ -> 输入abc123/bcd/,需提示候选词 xxx, abc333.
  • 例子5,合并context
Red []

abc: context [
    abc111: 1
]

abc123: make abc [    ;-- 合并abc context
    abc222: 2
    bcd: 2
]

abc123/ -> 输入abc321/,需提示候选词 abc111, abc222 和 bcd。

函数context补全

每个函数也有个context,需要提示该context内定义的word。此类补全需对函数进行分析。

  • 例子1
Red []

abc: context [
    xxx: 1
]

bbb: context [
    test1: function [][
        abc12: 1
        abc33: 2
        ab -> 此处输入ab,提示候选词 abc12, abc33, abc, about 和 absolute。
    ]

    test2: func [/abc999 /local abc12 abc33][
        ab -> 此处输入ab,提示候选词 abc999, abc12, abc33, abc, about 和 absolute。
              (提示定义的本地变量,哪怕不是set-word。refinement也要提示)
    ]
]
  • 例子2, 补全function的refinement。
Red []

abc123: func [/cool /great /smile /local a b][...]

abc321/ -> 输入abc321/,需提示候选词 cool, great 和 smile.
append/ -> 输入append/,提示候选词 dup, only, part。(对预定义的函数同样需要补全)

block补全

Red []

abc111: [
    abc211 [
        abc311 1
        abc312 []
    ]
    abc212 [
        abc311 2
        abc312 [
           abc411 abc412 3
        ]
    ]
]
abc111/ -> 输入abc111/,需提示候选词 abc211和abc212.
abc111/abc212/ -> 输入abc111/abc212/,需提示候选词 abc311和abc312.
abc111/abc212/abc312/ -> 输入abc111/abc212/abc312/,需提示候选词 abc411和abc412.

file补全

Red []

%/d/ -> 输入文件路径,需提示该路径下的文件。
Clone this wiki locally