go_types/
display.rs

1// Copyright 2022 The Goscript Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4//
5//
6// This code is adapted from the offical Go code written in Go
7// with license as follows:
8// Copyright 2013 The Go Authors. All rights reserved.
9// Use of this source code is governed by a BSD-style
10// license that can be found in the LICENSE file.
11
12#![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}