1#![allow(dead_code)]
13use super::check::MethodInfo;
14use super::lookup::MethodSet;
15use super::obj::fmt_obj;
16use super::objects::TCObjects;
17use super::objects::{ObjKey, ScopeKey, TypeKey};
18use super::operand::{fmt_expr, Operand};
19use super::scope::fmt_scope_full;
20use super::selection::Selection;
21use super::typ::fmt_type;
22use go_parser::{ast::Expr, ast::Node, AstObjects, Pos};
23use std::fmt;
24
25pub fn type_str(t: &TypeKey, tco: &TCObjects) -> String {
26 format!("{}", Displayer::new(t, None, Some(tco)))
27}
28
29pub trait Display {
30 fn format(
31 &self,
32 f: &mut fmt::Formatter,
33 asto: Option<&AstObjects>,
34 tco: Option<&TCObjects>,
35 ) -> fmt::Result;
36
37 fn position(&self, _: Option<&AstObjects>, _: Option<&TCObjects>) -> Pos {
38 unreachable!()
39 }
40}
41
42pub struct Displayer<'a> {
43 obj: &'a dyn Display,
44 asto: Option<&'a AstObjects>,
45 tco: Option<&'a TCObjects>,
46}
47
48impl<'a> Displayer<'a> {
49 pub fn new(
50 obj: &'a dyn Display,
51 asto: Option<&'a AstObjects>,
52 tco: Option<&'a TCObjects>,
53 ) -> Displayer<'a> {
54 Displayer {
55 obj: obj,
56 asto: asto,
57 tco: tco,
58 }
59 }
60
61 pub fn pos(&self) -> Pos {
62 self.obj.position(self.asto, self.tco)
63 }
64}
65
66impl<'a> fmt::Display for Displayer<'a> {
67 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
68 self.obj.format(f, self.asto, self.tco)
69 }
70}
71
72impl<'a> Display for Expr {
73 fn format(
74 &self,
75 f: &mut fmt::Formatter,
76 asto: Option<&AstObjects>,
77 _: Option<&TCObjects>,
78 ) -> fmt::Result {
79 fmt_expr(self, f, asto.as_ref().unwrap())
80 }
81
82 fn position(&self, asto: Option<&AstObjects>, _: Option<&TCObjects>) -> Pos {
83 self.pos(asto.as_ref().unwrap())
84 }
85}
86
87impl<'a> Display for Operand {
88 fn format(
89 &self,
90 f: &mut fmt::Formatter,
91 asto: Option<&AstObjects>,
92 tco: Option<&TCObjects>,
93 ) -> fmt::Result {
94 self.fmt(f, tco.as_ref().unwrap(), asto.as_ref().unwrap())
95 }
96
97 fn position(&self, asto: Option<&AstObjects>, _: Option<&TCObjects>) -> Pos {
98 self.pos(asto.as_ref().unwrap())
99 }
100}
101
102impl<'a> Display for ObjKey {
103 fn format(
104 &self,
105 f: &mut fmt::Formatter,
106 _: Option<&AstObjects>,
107 tco: Option<&TCObjects>,
108 ) -> fmt::Result {
109 fmt_obj(*self, f, tco.as_ref().unwrap())
110 }
111
112 fn position(&self, _: Option<&AstObjects>, tco: Option<&TCObjects>) -> Pos {
113 tco.as_ref().unwrap().lobjs[*self].pos()
114 }
115}
116
117impl<'a> Display for TypeKey {
118 fn format(
119 &self,
120 f: &mut fmt::Formatter,
121 _: Option<&AstObjects>,
122 tco: Option<&TCObjects>,
123 ) -> fmt::Result {
124 fmt_type(Some(*self), f, tco.as_ref().unwrap())
125 }
126}
127
128impl<'a> Display for MethodInfo {
129 fn format(
130 &self,
131 f: &mut fmt::Formatter,
132 asto: Option<&AstObjects>,
133 tco: Option<&TCObjects>,
134 ) -> fmt::Result {
135 self.fmt(f, tco.as_ref().unwrap(), asto.as_ref().unwrap())
136 }
137}
138
139impl<'a> Display for Selection {
140 fn format(
141 &self,
142 f: &mut fmt::Formatter,
143 _: Option<&AstObjects>,
144 tco: Option<&TCObjects>,
145 ) -> fmt::Result {
146 self.fmt(f, tco.as_ref().unwrap())
147 }
148}
149
150impl<'a> Display for MethodSet {
151 fn format(
152 &self,
153 f: &mut fmt::Formatter,
154 _: Option<&AstObjects>,
155 tco: Option<&TCObjects>,
156 ) -> fmt::Result {
157 self.fmt(f, tco.as_ref().unwrap())
158 }
159}
160
161impl<'a> Display for ScopeKey {
162 fn format(
163 &self,
164 f: &mut fmt::Formatter,
165 _: Option<&AstObjects>,
166 tco: Option<&TCObjects>,
167 ) -> fmt::Result {
168 fmt_scope_full(self, f, 0, tco.as_ref().unwrap())
169 }
170}