-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathBoundNode.cs
More file actions
184 lines (146 loc) · 4.23 KB
/
Copy pathBoundNode.cs
File metadata and controls
184 lines (146 loc) · 4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Draco.Compiler.Api.Syntax;
using Draco.Compiler.Internal.Symbols;
namespace Draco.Compiler.Internal.BoundTree;
/// <summary>
/// The base for all bound nodes in the bound tree.
/// </summary>
[ExcludeFromCodeCoverage]
internal abstract partial class BoundNode(SyntaxNode? syntax)
{
public SyntaxNode? Syntax { get; } = syntax;
public abstract void Accept(BoundTreeVisitor visitor);
public abstract TResult Accept<TResult>(BoundTreeVisitor<TResult> visitor);
protected static bool Equals<T>(ImmutableArray<T> left, ImmutableArray<T> right)
{
if (left.Length != right.Length) return false;
return left.SequenceEqual(right);
}
}
// Statements
internal partial class BoundNoOpStatement
{
public static BoundNoOpStatement Default { get; } = new(null);
}
// Expressions
internal partial class BoundExpression
{
public virtual TypeSymbol? Type => null;
public TypeSymbol TypeRequired => this.Type ?? WellKnownTypes.ErrorType;
}
internal partial class BoundUnexpectedExpression
{
public override TypeSymbol Type => WellKnownTypes.ErrorType;
}
internal partial class BoundSequencePointExpression
{
public override TypeSymbol? Type => this.Expression.Type;
}
internal partial class BoundUnitExpression
{
public static BoundUnitExpression Default { get; } = new(null);
public override TypeSymbol Type => WellKnownTypes.Unit;
}
internal partial class BoundGotoExpression
{
public override TypeSymbol Type => WellKnownTypes.Never;
}
internal partial class BoundReturnExpression
{
public override TypeSymbol Type => WellKnownTypes.Never;
}
internal partial class BoundBlockExpression
{
public override TypeSymbol Type => this.Value.TypeRequired;
}
internal partial class BoundWhileExpression
{
public override TypeSymbol Type => WellKnownTypes.Unit;
}
internal partial class BoundForExpression
{
public override TypeSymbol Type => WellKnownTypes.Unit;
}
internal partial class BoundParameterExpression
{
public override TypeSymbol Type => this.Parameter.Type;
}
internal partial class BoundFieldExpression
{
public override TypeSymbol Type => this.Field.Type;
}
internal partial class BoundPropertyGetExpression
{
public override TypeSymbol Type => this.Getter.ReturnType;
}
internal partial class BoundPropertySetExpression
{
public override TypeSymbol? Type => this.Value.Type;
}
internal partial class BoundLocalExpression
{
public override TypeSymbol Type => this.Local.Type;
}
internal partial class BoundReferenceErrorExpression
{
public override TypeSymbol Type => WellKnownTypes.ErrorType;
}
internal partial class BoundAndExpression
{
public override TypeSymbol Type => this.Left.TypeRequired;
}
internal partial class BoundOrExpression
{
public override TypeSymbol Type => this.Left.TypeRequired;
}
internal partial class BoundAssignmentExpression
{
public override TypeSymbol Type => this.Left.Type;
}
internal partial class BoundObjectCreationExpression
{
public override TypeSymbol Type => this.ObjectType;
}
internal partial class BoundDelegateCreationExpression
{
public override TypeSymbol Type => (TypeSymbol)this.DelegateConstructor.ContainingSymbol!;
}
internal partial class BoundCallExpression
{
public override TypeSymbol Type => this.Method.ReturnType;
}
internal partial class BoundUnaryExpression
{
public override TypeSymbol Type => this.Operator.ReturnType;
}
internal partial class BoundBinaryExpression
{
public override TypeSymbol Type => this.Operator.ReturnType;
}
// Lvalues
internal partial class BoundLvalue
{
public abstract TypeSymbol Type { get; }
}
internal partial class BoundUnexpectedLvalue
{
public override TypeSymbol Type => WellKnownTypes.ErrorType;
}
internal partial class BoundIllegalLvalue
{
public override TypeSymbol Type => WellKnownTypes.ErrorType;
}
internal partial class BoundLocalLvalue
{
public override TypeSymbol Type => this.Local.Type;
}
internal partial class BoundFieldLvalue
{
public override TypeSymbol Type => this.Field.Type;
}
internal partial class BoundPropertySetLvalue
{
public override TypeSymbol Type => ((IPropertyAccessorSymbol)this.Setter).Property.Type;
}