aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src')
-rw-r--r--crates/ra_ide_api/src/call_info.rs7
-rw-r--r--crates/ra_ide_api/src/completion.rs48
-rw-r--r--crates/ra_ide_api/src/display.rs49
3 files changed, 54 insertions, 50 deletions
diff --git a/crates/ra_ide_api/src/call_info.rs b/crates/ra_ide_api/src/call_info.rs
index 1885d3da8..66a769c73 100644
--- a/crates/ra_ide_api/src/call_info.rs
+++ b/crates/ra_ide_api/src/call_info.rs
@@ -8,7 +8,7 @@ use ra_syntax::{
8}; 8};
9use hir::Docs; 9use hir::Docs;
10 10
11use crate::{FilePosition, CallInfo, db::RootDatabase}; 11use crate::{FilePosition, CallInfo, FunctionSignature, db::RootDatabase};
12 12
13/// Computes parameter information for the given call expression. 13/// Computes parameter information for the given call expression.
14pub(crate) fn call_info(db: &RootDatabase, position: FilePosition) -> Option<CallInfo> { 14pub(crate) fn call_info(db: &RootDatabase, position: FilePosition) -> Option<CallInfo> {
@@ -108,11 +108,10 @@ impl<'a> FnCallNode<'a> {
108 108
109impl CallInfo { 109impl CallInfo {
110 fn new(db: &RootDatabase, function: hir::Function, node: &ast::FnDef) -> Option<Self> { 110 fn new(db: &RootDatabase, function: hir::Function, node: &ast::FnDef) -> Option<Self> {
111 let sig = crate::completion::function_signature(node)?;
112 let doc = function.docs(db); 111 let doc = function.docs(db);
113 let sig = sig.with_doc_opt(doc); 112 let signature = FunctionSignature::from(node).with_doc_opt(doc);
114 113
115 Some(CallInfo { signature: sig, active_parameter: None }) 114 Some(CallInfo { signature, active_parameter: None })
116 } 115 }
117 116
118 fn parameters(&self) -> &[String] { 117 fn parameters(&self) -> &[String] {
diff --git a/crates/ra_ide_api/src/completion.rs b/crates/ra_ide_api/src/completion.rs
index d8e4410b2..71a35c689 100644
--- a/crates/ra_ide_api/src/completion.rs
+++ b/crates/ra_ide_api/src/completion.rs
@@ -13,7 +13,7 @@ mod complete_scope;
13mod complete_postfix; 13mod complete_postfix;
14 14
15use ra_db::SourceDatabase; 15use ra_db::SourceDatabase;
16use ra_syntax::{ast::{self, AstNode, NameOwner, VisibilityOwner, TypeParamsOwner}, SyntaxKind::{ATTR, COMMENT}}; 16use ra_syntax::{ast::{self, AstNode}, SyntaxKind::{ATTR, COMMENT}};
17 17
18use crate::{ 18use crate::{
19 db, 19 db,
@@ -72,52 +72,8 @@ pub(crate) fn completions(db: &db::RootDatabase, position: FilePosition) -> Opti
72 Some(acc) 72 Some(acc)
73} 73}
74 74
75pub fn generic_parameters<N: TypeParamsOwner>(node: &N) -> Vec<String> {
76 let mut res = vec![];
77 if let Some(type_params) = node.type_param_list() {
78 res.extend(type_params.lifetime_params().map(|p| p.syntax().text().to_string()));
79 res.extend(type_params.type_params().map(|p| p.syntax().text().to_string()));
80 }
81 res
82}
83
84pub fn where_predicates<N: TypeParamsOwner>(node: &N) -> Vec<String> {
85 let mut res = vec![];
86 if let Some(clause) = node.where_clause() {
87 res.extend(clause.predicates().map(|p| p.syntax().text().to_string()));
88 }
89 res
90}
91
92pub fn function_signature(node: &ast::FnDef) -> Option<FunctionSignature> {
93 fn param_list(node: &ast::FnDef) -> Vec<String> {
94 let mut res = vec![];
95 if let Some(param_list) = node.param_list() {
96 if let Some(self_param) = param_list.self_param() {
97 res.push(self_param.syntax().text().to_string())
98 }
99
100 res.extend(param_list.params().map(|param| param.syntax().text().to_string()));
101 }
102 res
103 }
104
105 let sig = FunctionSignature {
106 visibility: node.visibility().map(|n| n.syntax().text().to_string()),
107 name: node.name().map(|n| n.text().to_string()),
108 ret_type: node.ret_type().and_then(|r| r.type_ref()).map(|n| n.syntax().text().to_string()),
109 parameters: param_list(node),
110 generic_parameters: generic_parameters(node),
111 where_predicates: where_predicates(node),
112 // docs are processed separately
113 doc: None,
114 };
115
116 Some(sig)
117}
118
119pub fn function_label(node: &ast::FnDef) -> Option<String> { 75pub fn function_label(node: &ast::FnDef) -> Option<String> {
120 function_signature(node).map(|n| n.to_string()) 76 Some(FunctionSignature::from(node).to_string())
121} 77}
122 78
123pub fn const_label(node: &ast::ConstDef) -> String { 79pub fn const_label(node: &ast::ConstDef) -> String {
diff --git a/crates/ra_ide_api/src/display.rs b/crates/ra_ide_api/src/display.rs
index 9d9d2097f..e01635460 100644
--- a/crates/ra_ide_api/src/display.rs
+++ b/crates/ra_ide_api/src/display.rs
@@ -3,6 +3,8 @@
3use super::*; 3use super::*;
4use std::fmt::{self, Display}; 4use std::fmt::{self, Display};
5use join_to_string::join; 5use join_to_string::join;
6use ra_syntax::ast::{self, AstNode, NameOwner, VisibilityOwner, TypeParamsOwner};
7use std::convert::From;
6 8
7/// Contains information about a function signature 9/// Contains information about a function signature
8#[derive(Debug)] 10#[derive(Debug)]
@@ -30,6 +32,36 @@ impl FunctionSignature {
30 } 32 }
31} 33}
32 34
35impl From<&'_ ast::FnDef> for FunctionSignature {
36 fn from(node: &ast::FnDef) -> FunctionSignature {
37 fn param_list(node: &ast::FnDef) -> Vec<String> {
38 let mut res = vec![];
39 if let Some(param_list) = node.param_list() {
40 if let Some(self_param) = param_list.self_param() {
41 res.push(self_param.syntax().text().to_string())
42 }
43
44 res.extend(param_list.params().map(|param| param.syntax().text().to_string()));
45 }
46 res
47 }
48
49 FunctionSignature {
50 visibility: node.visibility().map(|n| n.syntax().text().to_string()),
51 name: node.name().map(|n| n.text().to_string()),
52 ret_type: node
53 .ret_type()
54 .and_then(|r| r.type_ref())
55 .map(|n| n.syntax().text().to_string()),
56 parameters: param_list(node),
57 generic_parameters: generic_parameters(node),
58 where_predicates: where_predicates(node),
59 // docs are processed separately
60 doc: None,
61 }
62 }
63}
64
33impl Display for FunctionSignature { 65impl Display for FunctionSignature {
34 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 66 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
35 if let Some(t) = &self.visibility { 67 if let Some(t) = &self.visibility {
@@ -61,3 +93,20 @@ impl Display for FunctionSignature {
61 Ok(()) 93 Ok(())
62 } 94 }
63} 95}
96
97pub(crate) fn generic_parameters<N: TypeParamsOwner>(node: &N) -> Vec<String> {
98 let mut res = vec![];
99 if let Some(type_params) = node.type_param_list() {
100 res.extend(type_params.lifetime_params().map(|p| p.syntax().text().to_string()));
101 res.extend(type_params.type_params().map(|p| p.syntax().text().to_string()));
102 }
103 res
104}
105
106pub(crate) fn where_predicates<N: TypeParamsOwner>(node: &N) -> Vec<String> {
107 let mut res = vec![];
108 if let Some(clause) = node.where_clause() {
109 res.extend(clause.predicates().map(|p| p.syntax().text().to_string()));
110 }
111 res
112}