Make regions not part of superclass StatNode

Since the majority of subclasses already has a node with the same region this can be omitted
This commit is contained in:
0x4261756D 2024-02-28 17:02:23 +01:00
parent ef333f7d93
commit 40c744119c

View File

@ -32,61 +32,76 @@ class Parser
[JsonDerivedType(typeof(Function), typeDiscriminator: "st Function")] [JsonDerivedType(typeof(Function), typeDiscriminator: "st Function")]
[JsonDerivedType(typeof(LocalFunction), typeDiscriminator: "st LocalFunction")] [JsonDerivedType(typeof(LocalFunction), typeDiscriminator: "st LocalFunction")]
[JsonDerivedType(typeof(Local), typeDiscriminator: "st Local")] [JsonDerivedType(typeof(Local), typeDiscriminator: "st Local")]
public abstract class StatNode(CodeRegion startRegion, CodeRegion endRegion) public abstract class StatNode
{ {
public CodeRegion startRegion = startRegion, endRegion = endRegion; public class Semicolon(CodeRegion region) : StatNode
public class Semicolon(CodeRegion region) : StatNode(region, region) { } {
public class Assignment(AssignmentNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public CodeRegion region = region;
}
public class Assignment(AssignmentNode node) : StatNode
{ {
public AssignmentNode node = node; public AssignmentNode node = node;
} }
public class Functioncall(FunctioncallNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class Functioncall(FunctioncallNode node) : StatNode
{ {
public FunctioncallNode node = node; public FunctioncallNode node = node;
} }
public class Label(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class Label(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode
{ {
public CodeRegion startRegion = startRegion;
public CodeRegion endRegion = endRegion;
public string label = label; public string label = label;
} }
public class Break(CodeRegion region) : StatNode(region, region) { } public class Break(CodeRegion region) : StatNode
public class Goto(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion)
{ {
public CodeRegion region = region;
}
public class Goto(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode
{
public CodeRegion startRegion = startRegion;
public CodeRegion endRegion = endRegion;
public string label = label; public string label = label;
} }
public class Do(BlockNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class Do(BlockNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode
{ {
public CodeRegion startRegion = startRegion;
public CodeRegion endRegion = endRegion;
public BlockNode node = node; public BlockNode node = node;
} }
public class While(WhileNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class While(WhileNode node) : StatNode
{ {
public WhileNode node = node; public WhileNode node = node;
} }
public class Repeat(RepeatNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class Repeat(RepeatNode node) : StatNode
{ {
public RepeatNode node = node; public RepeatNode node = node;
} }
public class If(IfNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class If(IfNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode
{ {
public CodeRegion startRegion = startRegion;
public CodeRegion endRegion = endRegion;
public IfNode node = node; public IfNode node = node;
} }
public class ForNumerical(ForNumericalNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class ForNumerical(ForNumericalNode node) : StatNode
{ {
public ForNumericalNode node = node; public ForNumericalNode node = node;
} }
public class ForGeneric(ForGenericNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class ForGeneric(ForGenericNode node) : StatNode
{ {
public ForGenericNode node = node; public ForGenericNode node = node;
} }
public class Function(FunctionNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class Function(FunctionNode node) : StatNode
{ {
public FunctionNode node = node; public FunctionNode node = node;
} }
public class LocalFunction(LocalFunctionNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class LocalFunction(LocalFunctionNode node) : StatNode
{ {
public LocalFunctionNode node = node; public LocalFunctionNode node = node;
} }
public class Local(LocalNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) public class Local(LocalNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode
{ {
public CodeRegion startRegion = startRegion;
public CodeRegion endRegion = endRegion;
public LocalNode node = node; public LocalNode node = node;
} }
} }
@ -468,7 +483,7 @@ class Parser
{ {
stats.Add(ParseStat(tokens)); stats.Add(ParseStat(tokens));
} }
BlockNode ret = new(stats: stats, startRegion: startRegion, endRegion: (stats.Count == 0) ? startRegion : stats[^1].endRegion); BlockNode ret = new(stats: stats, startRegion: startRegion, endRegion: (stats.Count == 0 && index > 0) ? startRegion : tokens[index - 1].region);
if(index < tokens.Length && tokens[index].type == TokenType.Return) if(index < tokens.Length && tokens[index].type == TokenType.Return)
{ {
ret.retstat = ParseRetstat(tokens); ret.retstat = ParseRetstat(tokens);
@ -546,7 +561,7 @@ class Parser
} }
CodeRegion endRegion = tokens[index].region; CodeRegion endRegion = tokens[index].region;
index += 1; index += 1;
return new StatNode.While(new(condition: condition, body: body, startRegion: startRegion, endRegion: endRegion), startRegion: startRegion, endRegion: endRegion); return new StatNode.While(new(condition: condition, body: body, startRegion: startRegion, endRegion: endRegion));
} }
case TokenType.Repeat: case TokenType.Repeat:
{ {
@ -562,7 +577,7 @@ class Parser
} }
index += 1; index += 1;
ExpNode conditon = ParseExp(tokens); ExpNode conditon = ParseExp(tokens);
return new StatNode.Repeat(new(condition: conditon, body: body, startRegion: startRegion, endRegion: conditon.endRegion), startRegion: startRegion, endRegion: conditon.endRegion); return new StatNode.Repeat(new(condition: conditon, body: body, startRegion: startRegion, endRegion: conditon.endRegion));
} }
case TokenType.If: case TokenType.If:
{ {
@ -683,7 +698,7 @@ class Parser
} }
CodeRegion endRegion = tokens[index].region; CodeRegion endRegion = tokens[index].region;
index += 1; index += 1;
return new StatNode.ForNumerical(new(variable: variable, start: start, end: end, change: change, body: body, startRegion: startRegion, endRegion: endRegion), startRegion: startRegion, endRegion: endRegion); return new StatNode.ForNumerical(new(variable: variable, start: start, end: end, change: change, body: body, startRegion: startRegion, endRegion: endRegion));
} }
case TokenType.Comma: case TokenType.Comma:
{ {
@ -736,7 +751,7 @@ class Parser
} }
CodeRegion endRegion = tokens[index].region; CodeRegion endRegion = tokens[index].region;
index += 1; index += 1;
return new StatNode.ForGeneric(new(vars: names, exps: exps, body: body, startRegion: startRegion, endRegion: endRegion), startRegion: startRegion, endRegion: endRegion); return new StatNode.ForGeneric(new(vars: names, exps: exps, body: body, startRegion: startRegion, endRegion: endRegion));
} }
case TokenType.In: case TokenType.In:
{ {
@ -762,7 +777,7 @@ class Parser
} }
CodeRegion endRegion = tokens[index].region; CodeRegion endRegion = tokens[index].region;
index += 1; index += 1;
return new StatNode.ForGeneric(new(vars: [variable], exps: exps, body: body, startRegion: startRegion, endRegion: endRegion), startRegion: startRegion, endRegion: endRegion); return new StatNode.ForGeneric(new(vars: [variable], exps: exps, body: body, startRegion: startRegion, endRegion: endRegion));
} }
default: default:
{ {
@ -775,7 +790,7 @@ class Parser
index += 1; index += 1;
FuncnameNode name = ParseFuncname(tokens); FuncnameNode name = ParseFuncname(tokens);
FuncbodyNode body = ParseFuncbody(tokens); FuncbodyNode body = ParseFuncbody(tokens);
return new StatNode.Function(new(name: name, body: body, startRegion: startRegion, endRegion: body.endRegion), startRegion: startRegion, endRegion: body.endRegion); return new StatNode.Function(new(name: name, body: body, startRegion: startRegion, endRegion: body.endRegion));
} }
case TokenType.Local: case TokenType.Local:
{ {
@ -798,7 +813,7 @@ class Parser
string name = ((Token.StringData)tokens[index].data!).data; string name = ((Token.StringData)tokens[index].data!).data;
index += 1; index += 1;
FuncbodyNode body = ParseFuncbody(tokens); FuncbodyNode body = ParseFuncbody(tokens);
return new StatNode.LocalFunction(new(name: name, body: body, startRegion: startRegion, endRegion: body.endRegion), startRegion: startRegion, endRegion: body.endRegion); return new StatNode.LocalFunction(new(name: name, body: body, startRegion: startRegion, endRegion: body.endRegion));
} }
else else
{ {
@ -850,7 +865,7 @@ class Parser
} }
if(suffixExp is SuffixexpNode.Functioncall functioncall) if(suffixExp is SuffixexpNode.Functioncall functioncall)
{ {
return new StatNode.Functioncall(node: functioncall.node, startRegion: functioncall.startRegion, endRegion: functioncall.endRegion); return new StatNode.Functioncall(node: functioncall.node);
} }
} }
else else
@ -862,7 +877,7 @@ class Parser
index += 1; index += 1;
List<VarNode> lhs = [SuffixExpToVar(suffixExp)]; List<VarNode> lhs = [SuffixExpToVar(suffixExp)];
ExplistNode rhs = ParseExplist(tokens); ExplistNode rhs = ParseExplist(tokens);
return new StatNode.Assignment(new(lhs: new(vars: lhs, startRegion: startRegion, endRegion: suffixExp.endRegion), rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); return new StatNode.Assignment(new(lhs: new(vars: lhs, startRegion: startRegion, endRegion: suffixExp.endRegion), rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion));
} }
case TokenType.Comma: case TokenType.Comma:
{ {
@ -883,7 +898,7 @@ class Parser
index += 1; index += 1;
VarlistNode varlistNode = new(vars: vars, startRegion: startRegion, endRegion: vars[^1].endRegion); VarlistNode varlistNode = new(vars: vars, startRegion: startRegion, endRegion: vars[^1].endRegion);
ExplistNode rhs = ParseExplist(tokens); ExplistNode rhs = ParseExplist(tokens);
return new StatNode.Assignment(new(lhs: varlistNode, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); return new StatNode.Assignment(new(lhs: varlistNode, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion));
} }
} }
if(suffixExp is SuffixexpNode.Normal) if(suffixExp is SuffixexpNode.Normal)
@ -892,7 +907,7 @@ class Parser
} }
if(suffixExp is SuffixexpNode.Functioncall functioncall) if(suffixExp is SuffixexpNode.Functioncall functioncall)
{ {
return new StatNode.Functioncall(node: functioncall.node, startRegion: functioncall.startRegion, endRegion: functioncall.endRegion); return new StatNode.Functioncall(node: functioncall.node);
} }
} }
} }