This commit is contained in:
parent
07ece43f51
commit
f5b0b105b7
|
@ -22,6 +22,7 @@
|
||||||
In Process:
|
In Process:
|
||||||
<ul>
|
<ul>
|
||||||
<li>Ctrl+B:跳转到声明</li>
|
<li>Ctrl+B:跳转到声明</li>
|
||||||
|
<li>Alt+F7:查找使用</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
|
|
|
@ -222,6 +222,98 @@ func FindDeclarationHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
data["cursorCh"] = cursorCh
|
data["cursorCh"] = cursorCh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FindUsagesHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
data := map[string]interface{}{"succ": true}
|
||||||
|
defer util.RetJSON(w, r, data)
|
||||||
|
|
||||||
|
session, _ := user.Session.Get(r, "wide-session")
|
||||||
|
username := session.Values["username"].(string)
|
||||||
|
|
||||||
|
decoder := json.NewDecoder(r.Body)
|
||||||
|
|
||||||
|
var args map[string]interface{}
|
||||||
|
|
||||||
|
if err := decoder.Decode(&args); err != nil {
|
||||||
|
glog.Error(err)
|
||||||
|
http.Error(w, err.Error(), 500)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
filePath := args["file"].(string)
|
||||||
|
curDir := filePath[:strings.LastIndex(filePath, string(os.PathSeparator))]
|
||||||
|
filename := filePath[strings.LastIndex(filePath, string(os.PathSeparator))+1:]
|
||||||
|
|
||||||
|
fout, err := os.Create(filePath)
|
||||||
|
|
||||||
|
if nil != err {
|
||||||
|
glog.Error(err)
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
code := args["code"].(string)
|
||||||
|
fout.WriteString(code)
|
||||||
|
|
||||||
|
if err := fout.Close(); nil != err {
|
||||||
|
glog.Error(err)
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
line := int(args["cursorLine"].(float64))
|
||||||
|
ch := int(args["cursorCh"].(float64))
|
||||||
|
|
||||||
|
offset := getCursorOffset(code, line, ch)
|
||||||
|
|
||||||
|
// TODO: 目前是调用 liteide_stub 工具来查找使用,后续需要重新实现
|
||||||
|
argv := []string{"type", "-cursor", filename + ":" + strconv.Itoa(offset), "-use", "."}
|
||||||
|
cmd := exec.Command("liteide_stub", argv...)
|
||||||
|
cmd.Dir = curDir
|
||||||
|
|
||||||
|
setCmdEnv(cmd, username)
|
||||||
|
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
if nil != err {
|
||||||
|
glog.Error(err)
|
||||||
|
http.Error(w, err.Error(), 500)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result := strings.TrimSpace(string(output))
|
||||||
|
if "" == result {
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
founds := strings.Split(result, "\n")
|
||||||
|
usages := []interface{}{}
|
||||||
|
for _, found := range founds {
|
||||||
|
found = strings.TrimSpace(found)
|
||||||
|
|
||||||
|
part := found[:strings.LastIndex(found, ":")]
|
||||||
|
cursorSep := strings.LastIndex(part, ":")
|
||||||
|
path := found[:cursorSep]
|
||||||
|
cursorLine := found[cursorSep+1 : strings.LastIndex(found, ":")]
|
||||||
|
cursorCh := found[strings.LastIndex(found, ":")+1:]
|
||||||
|
|
||||||
|
usage := map[string]string{}
|
||||||
|
usage["path"] = path
|
||||||
|
usage["cursorLine"] = cursorLine
|
||||||
|
usage["cursorCh"] = cursorCh
|
||||||
|
|
||||||
|
usages = append(usages, usage)
|
||||||
|
}
|
||||||
|
|
||||||
|
// glog.Infof("%s\n%s\n%s\n%s", found, path, cursorLine, cursorCh)
|
||||||
|
|
||||||
|
data["usages"] = usages
|
||||||
|
}
|
||||||
|
|
||||||
func getCursorOffset(code string, line, ch int) (offset int) {
|
func getCursorOffset(code string, line, ch int) (offset int) {
|
||||||
lines := strings.Split(code, "\n")
|
lines := strings.Split(code, "\n")
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ type FileNode struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
IconSkin string `json:"iconSkin"` // 值的末尾应该有一个空格
|
IconSkin string `json:"iconSkin"` // 值的末尾应该有一个空格
|
||||||
Type string `json:"type"`
|
Type string `json:"type"` // "f":文件,"d":文件夹
|
||||||
Mode string `json:"mode"`
|
Mode string `json:"mode"`
|
||||||
FileNodes []*FileNode `json:"children"`
|
FileNodes []*FileNode `json:"children"`
|
||||||
}
|
}
|
||||||
|
|
3
main.go
3
main.go
|
@ -93,7 +93,8 @@ func main() {
|
||||||
http.HandleFunc("/editor/ws", editor.WSHandler)
|
http.HandleFunc("/editor/ws", editor.WSHandler)
|
||||||
http.HandleFunc("/go/fmt", editor.GoFmtHandler)
|
http.HandleFunc("/go/fmt", editor.GoFmtHandler)
|
||||||
http.HandleFunc("/autocomplete", editor.AutocompleteHandler)
|
http.HandleFunc("/autocomplete", editor.AutocompleteHandler)
|
||||||
http.HandleFunc("/finddecl", editor.FindDeclarationHandler)
|
http.HandleFunc("/find/decl", editor.FindDeclarationHandler)
|
||||||
|
http.HandleFunc("/find/usages", editor.FindUsagesHandler)
|
||||||
http.HandleFunc("/html/fmt", editor.HTMLFmtHandler)
|
http.HandleFunc("/html/fmt", editor.HTMLFmtHandler)
|
||||||
http.HandleFunc("/json/fmt", editor.JSONFmtHandler)
|
http.HandleFunc("/json/fmt", editor.JSONFmtHandler)
|
||||||
|
|
||||||
|
|
|
@ -138,7 +138,7 @@ var editors = {
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
url: '/finddecl',
|
url: '/find/decl',
|
||||||
data: JSON.stringify(request),
|
data: JSON.stringify(request),
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
|
@ -172,6 +172,33 @@ var editors = {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CodeMirror.commands.findUsages = function(cm) {
|
||||||
|
var cur = wide.curEditor.getCursor();
|
||||||
|
|
||||||
|
var request = {
|
||||||
|
file: wide.curNode.path,
|
||||||
|
code: wide.curEditor.getValue(),
|
||||||
|
cursorLine: cur.line,
|
||||||
|
cursorCh: cur.ch
|
||||||
|
};
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: '/find/usages',
|
||||||
|
data: JSON.stringify(request),
|
||||||
|
dataType: "json",
|
||||||
|
success: function(data) {
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
if (!data.succ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
},
|
},
|
||||||
newEditor: function(data) {
|
newEditor: function(data) {
|
||||||
$(".ico-fullscreen").show();
|
$(".ico-fullscreen").show();
|
||||||
|
@ -186,7 +213,7 @@ var editors = {
|
||||||
|
|
||||||
editors.tabs.add({
|
editors.tabs.add({
|
||||||
id: id,
|
id: id,
|
||||||
title: '<span title="' + wide.curNode.path + '"><span class="'
|
title: '<span title="' + wide.curNode.path + '"><span class="'
|
||||||
+ wide.curNode.iconSkin + 'ico"></span>' + wide.curNode.name + '</span>',
|
+ wide.curNode.iconSkin + 'ico"></span>' + wide.curNode.name + '</span>',
|
||||||
content: '<textarea id="editor' + id + '"></textarea>'
|
content: '<textarea id="editor' + id + '"></textarea>'
|
||||||
});
|
});
|
||||||
|
@ -218,7 +245,8 @@ var editors = {
|
||||||
"Ctrl-G": "gotoLine",
|
"Ctrl-G": "gotoLine",
|
||||||
"Ctrl-E": "deleteLine",
|
"Ctrl-E": "deleteLine",
|
||||||
"Ctrl-D": "doNothing", // 取消默认的 deleteLine
|
"Ctrl-D": "doNothing", // 取消默认的 deleteLine
|
||||||
"Ctrl-B": "jumpToDecl"
|
"Ctrl-B": "jumpToDecl",
|
||||||
|
"Alt-F7": "findUsages"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue