Skip to content

Commit 0cf15fc

Browse files
make setting properties be done via custom syntax
1 parent ac9ac7f commit 0cf15fc

5 files changed

Lines changed: 249 additions & 202 deletions

File tree

Code/ContextSystem/Contexts/ValueExpressionContext.cs

Lines changed: 5 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -176,120 +176,17 @@ public class ValuePropertyHandler(
176176
BaseToken baseToken,
177177
IValueToken valueToken) : ValueExpressionContext.Handler
178178
{
179-
private readonly List<string> _propertyNames = [];
180-
private string _exprRepr = baseToken.RawRep;
181-
private TypeOfValue _lastValueType = valueToken.PossibleValues;
179+
private readonly PropertyAccess _propertyAccess = new(baseToken, valueToken);
182180

183181
public override string FriendlyName => "property access";
184-
public override TypeOfValue PossibleValues => _lastValueType;
182+
public override TypeOfValue PossibleValues => _propertyAccess.PossibleValues;
185183

186-
public override TryGet<Value> GetReturnValue()
187-
{
188-
if (valueToken.Value().HasErrored(out var error, out var value))
189-
{
190-
return $"Failed to get value from '{_exprRepr}'".AsError()
191-
+ error.AsError();
192-
}
184+
public override TryGet<Value> GetReturnValue() => _propertyAccess.ResolveValue();
193185

194-
Value current = value;
195-
foreach (var prop in _propertyNames)
196-
{
197-
if (current is not IValueWithProperties propVal)
198-
{
199-
return $"{current} does not have any properties.";
200-
}
201-
202-
Console.WriteLine(propVal.Properties.Select(kvp => $"{kvp.Key} -> {kvp.Value.ReturnType}").JoinStrings(", "));
203-
204-
IValueWithProperties.PropInfo? propInfo;
205-
if (propVal.Properties is IValueWithProperties.IDynamicPropertyDictionary dynamicDict)
206-
{
207-
if (!dynamicDict.TryGetValue(prop, out propInfo))
208-
{
209-
return $"{current} does not have property '{prop}'.";
210-
}
211-
}
212-
else if (!propVal.Properties.TryGetValue(prop, out propInfo))
213-
{
214-
return $"{current} does not have property '{prop}'.";
215-
}
216-
217-
if (propInfo.GetValue(current).HasErrored(out var fetchError, out var fetchedValue))
218-
{
219-
return fetchError;
220-
}
221-
222-
current = fetchedValue;
223-
}
224-
225-
return current;
226-
}
227-
228-
public override TryAddTokenRes TryAddToken(BaseToken token)
229-
{
230-
if (token is SymbolToken { IsArrow: true })
231-
{
232-
_exprRepr += $" {token.RawRep}";
233-
return TryAddTokenRes.Continue();
234-
}
235-
236-
// type verification
237-
if (_lastValueType.AreKnown(out var types))
238-
{
239-
foreach (var type in types)
240-
{
241-
if (type == typeof(ReferenceValue))
242-
{
243-
_exprRepr += $" {token.RawRep}";
244-
_lastValueType = new UnknownTypeOfValue();
245-
goto found;
246-
}
247-
248-
var props = Value.GetPropertiesOfValue(type);
249-
if (props == null && type == typeof(LiteralValue))
250-
{
251-
foreach (var subType in LiteralValue.Subclasses)
252-
{
253-
var subProps = Value.GetPropertiesOfValue(subType);
254-
if (subProps?.TryGetValue(token.RawRep, out var subProp) is true)
255-
{
256-
_exprRepr += $" {token.RawRep}";
257-
_lastValueType = subProp.ReturnType;
258-
goto found;
259-
}
260-
}
261-
262-
_exprRepr += $" {token.RawRep}";
263-
_lastValueType = new UnknownTypeOfValue();
264-
goto found;
265-
}
266-
if (props is IValueWithProperties.IDynamicPropertyDictionary dynamicDict)
267-
{
268-
if (dynamicDict.TryGetValue(token.RawRep, out var dynamicProp))
269-
{
270-
_exprRepr += $" {token.RawRep}";
271-
_lastValueType = dynamicProp.ReturnType;
272-
goto found;
273-
}
274-
}
275-
else if (props?.TryGetValue(token.RawRep, out var property) is true)
276-
{
277-
_exprRepr += $" {token.RawRep}";
278-
_lastValueType = property.ReturnType;
279-
goto found;
280-
}
281-
}
282-
283-
return TryAddTokenRes.Error($"'{token.RawRep}' is not a valid property of {_lastValueType}.");
284-
}
285-
286-
found:
287-
_propertyNames.Add(token.RawRep);
288-
return TryAddTokenRes.Continue();
289-
}
186+
public override TryAddTokenRes TryAddToken(BaseToken token) => _propertyAccess.TryAddToken(token);
290187

291188
public override Result VerifyCurrentState() => Result.Assert(
292-
_propertyNames.Count > 0,
189+
_propertyAccess.PropertyCount > 0,
293190
$"The '{SymbolToken.Arrow}' operator was used, but no property to be accessed was specified."
294191
);
295192

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,95 @@
1-
using SER.Code.TokenSystem.Tokens.VariableTokens;
1+
using SER.Code.ContextSystem.Structures;
2+
using SER.Code.TokenSystem.Tokens;
3+
using SER.Code.TokenSystem.Tokens.VariableTokens;
24
using SER.Code.ValueSystem;
35
using SER.Code.VariableSystem.Variables;
6+
using SER.Code.ValueSystem.PropertySystem;
7+
using SER.Code.Helpers.ResultSystem;
8+
using System.Collections.Generic;
9+
using SER.Code.Exceptions;
410

511
namespace SER.Code.ContextSystem.Contexts.VariableDefinition;
612

7-
public class ReferenceVariableDefinitionContext(VariableToken<ReferenceVariable, ReferenceValue> varToken) :
8-
VariableDefinitionContext<VariableToken<ReferenceVariable, ReferenceValue>, ReferenceValue, ReferenceVariable>(varToken);
13+
public class ReferenceVariableDefinitionContext(VariableToken<ReferenceVariable, ReferenceValue> varToken) :
14+
VariableDefinitionContext<VariableToken<ReferenceVariable, ReferenceValue>, ReferenceValue, ReferenceVariable>(varToken)
15+
{
16+
private readonly VariableToken<ReferenceVariable, ReferenceValue> _varToken = varToken;
17+
private PropertyAccess? _propertyAccess;
18+
19+
public override TryAddTokenRes TryAddToken(BaseToken token)
20+
{
21+
if (token is SymbolToken { IsArrow: true } && !EqualSignSet)
22+
{
23+
_propertyAccess ??= new PropertyAccess(_varToken, _varToken);
24+
return _propertyAccess.TryAddToken(token);
25+
}
26+
27+
if (_propertyAccess is not null && !EqualSignSet)
28+
{
29+
if (token is SymbolToken { RawRep: "=" })
30+
{
31+
EqualSignSet = true;
32+
return TryAddTokenRes.Continue();
33+
}
34+
35+
return _propertyAccess.TryAddToken(token);
36+
}
37+
38+
return base.TryAddToken(token);
39+
}
40+
41+
public override Result VerifyCurrentState()
42+
{
43+
if (_propertyAccess is not null)
44+
{
45+
if (!EqualSignSet) return $"Value for property assignment '{_propertyAccess.ExprRepr}' was not provided (missing equals sign).";
46+
if (_propertyAccess.PropertyCount == 0) return "No properties specified for property assignment.";
47+
if (Expression is null) return $"Value for property assignment '{_propertyAccess.ExprRepr}' was not provided.";
48+
return Expression.VerifyCurrentState();
49+
}
50+
51+
return base.VerifyCurrentState();
52+
}
53+
54+
protected override IEnumerator<float> Execute()
55+
{
56+
if (_propertyAccess is null)
57+
{
58+
var coro = base.Execute();
59+
while (coro.MoveNext()) yield return coro.Current;
60+
yield break;
61+
}
62+
63+
if (Expression is null) throw new AndrzejFuckedUpException();
64+
65+
var coroExpr = Expression.Run();
66+
while (coroExpr.MoveNext())
67+
{
68+
yield return coroExpr.Current;
69+
}
70+
71+
if (Expression.GetValue().HasErrored(out var error, out var tValue))
72+
{
73+
throw new ScriptRuntimeError(this,
74+
$"Value returned by {FriendlyName} could not be resolved: {error}"
75+
);
76+
}
77+
78+
var lastPropRes = _propertyAccess.ResolveLastProp();
79+
if (lastPropRes.HasErrored(out var lastPropError, out var lastProp))
80+
{
81+
throw new ScriptRuntimeError(this, $"Failed to resolve property for assignment: {lastPropError}");
82+
}
83+
84+
if (!lastProp.propInfo.IsSettable)
85+
{
86+
throw new ScriptRuntimeError(this, $"Property '{lastProp.propInfo.ReturnType}' is read-only.");
87+
}
88+
89+
var setResult = lastProp.propInfo.SetValue(lastProp.target, tValue);
90+
if (setResult.HasErrored(out var setError))
91+
{
92+
throw new ScriptRuntimeError(this, $"Failed to set property: {setError}");
93+
}
94+
}
95+
}

Code/ContextSystem/Contexts/VariableDefinition/VariableDefinitionContext.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,56 +21,56 @@ public abstract class VariableDefinitionContext<TVarToken, TValue, TVariable>(TV
2121
where TValue : Value
2222
where TVariable : Variable<TValue>
2323
{
24-
private bool _equalSignSet = false;
25-
private ValueExpressionContext? _expression = null;
24+
protected bool EqualSignSet = false;
25+
protected ValueExpressionContext? Expression = null;
2626

2727
public override string FriendlyName => $"'{varToken.RawRep}' variable definition";
2828

2929
public override TryAddTokenRes TryAddToken(BaseToken token)
3030
{
31-
if (!_equalSignSet)
31+
if (!EqualSignSet)
3232
{
3333
if (token is not SymbolToken { RawRep: "=" })
3434
{
3535
return TryAddTokenRes.Error(
3636
"After a variable, an equals sign is expected to set a value to said variable.");
3737
}
3838

39-
_equalSignSet = true;
39+
EqualSignSet = true;
4040
return TryAddTokenRes.Continue();
4141
}
4242

43-
if (_expression == null)
43+
if (Expression == null)
4444
{
45-
_expression = new ValueExpressionContext(token, true)
45+
Expression = new ValueExpressionContext(token, true)
4646
{
4747
Script = Script,
4848
ParentContext = this
4949
};
5050
return TryAddTokenRes.Continue();
5151
}
5252

53-
return _expression.TryAddToken(token);
53+
return Expression.TryAddToken(token);
5454
}
5555

5656
public override Result VerifyCurrentState()
5757
{
58-
if (!_equalSignSet) return $"Value for variable '{varToken.RawRep}' was not provided (missing equals sign).";
59-
if (_expression is null) return $"Value for variable '{varToken.RawRep}' was not provided.";
60-
return _expression.VerifyCurrentState();
58+
if (!EqualSignSet) return $"Value for variable '{varToken.RawRep}' was not provided (missing equals sign).";
59+
if (Expression is null) return $"Value for variable '{varToken.RawRep}' was not provided.";
60+
return Expression.VerifyCurrentState();
6161
}
6262

6363
protected override IEnumerator<float> Execute()
6464
{
65-
if (_expression is null) throw new AndrzejFuckedUpException();
65+
if (Expression is null) throw new AndrzejFuckedUpException();
6666

67-
var coro = _expression.Run();
67+
var coro = Expression.Run();
6868
while (coro.MoveNext())
6969
{
7070
yield return coro.Current;
7171
}
7272

73-
if (_expression.GetValue().SuccessTryCast<TValue>().HasErrored(out var error, out var tValue))
73+
if (Expression.GetValue().SuccessTryCast<TValue>().HasErrored(out var error, out var tValue))
7474
{
7575
throw new ScriptRuntimeError(this,
7676
$"Value returned by {FriendlyName} cannot be assigned to the '{varToken.RawRep}' variable: {error}"

Code/MethodSystem/Methods/PropertyMethods/SetPropertyMethod.cs

Lines changed: 0 additions & 78 deletions
This file was deleted.

0 commit comments

Comments
 (0)