Merge #1817

1817: Support path starting with a type r=matklad a=uHOOCCOOHu

The path syntax `<Ty>::foo`

Co-authored-by: uHOOCCOOHu <hooccooh1896@gmail.com>
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index dad1c93..84e1538 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -773,13 +773,13 @@
 
 #[derive(Debug, Clone, PartialEq, Eq)]
 pub struct ConstData {
-    pub(crate) name: Name,
+    pub(crate) name: Option<Name>,
     pub(crate) type_ref: TypeRef,
 }
 
 impl ConstData {
-    pub fn name(&self) -> &Name {
-        &self.name
+    pub fn name(&self) -> Option<&Name> {
+        self.name.as_ref()
     }
 
     pub fn type_ref(&self) -> &TypeRef {
@@ -804,7 +804,7 @@
 }
 
 fn const_data_for<N: NameOwner + TypeAscriptionOwner>(node: &N) -> Arc<ConstData> {
-    let name = node.name().map(|n| n.as_name()).unwrap_or_else(Name::missing);
+    let name = node.name().map(|n| n.as_name());
     let type_ref = TypeRef::from_ast_opt(node.ascribed_type());
     let sig = ConstData { name, type_ref };
     Arc::new(sig)
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs
index 785499f..bf9609d 100644
--- a/crates/ra_hir/src/ty/infer.rs
+++ b/crates/ra_hir/src/ty/infer.rs
@@ -585,7 +585,7 @@
 
                 crate::ImplItem::Const(konst) => {
                     let data = konst.data(self.db);
-                    if segment.name == *data.name() {
+                    if Some(&segment.name) == data.name() {
                         Some(ValueNs::Const(konst))
                     } else {
                         None