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:
parent
ef333f7d93
commit
40c744119c
73
Parser.cs
73
Parser.cs
@ -32,61 +32,76 @@ class Parser
|
||||
[JsonDerivedType(typeof(Function), typeDiscriminator: "st Function")]
|
||||
[JsonDerivedType(typeof(LocalFunction), typeDiscriminator: "st LocalFunction")]
|
||||
[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(region, region) { }
|
||||
public class Assignment(AssignmentNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion)
|
||||
public class Semicolon(CodeRegion region) : StatNode
|
||||
{
|
||||
public CodeRegion region = region;
|
||||
}
|
||||
public class Assignment(AssignmentNode node) : StatNode
|
||||
{
|
||||
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 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 class Break(CodeRegion region) : StatNode(region, region) { }
|
||||
public class Goto(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion)
|
||||
public class Break(CodeRegion region) : StatNode
|
||||
{
|
||||
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 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 class While(WhileNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion)
|
||||
public class While(WhileNode node) : StatNode
|
||||
{
|
||||
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 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 class ForNumerical(ForNumericalNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion)
|
||||
public class ForNumerical(ForNumericalNode node) : StatNode
|
||||
{
|
||||
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 class Function(FunctionNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion)
|
||||
public class Function(FunctionNode node) : StatNode
|
||||
{
|
||||
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 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;
|
||||
}
|
||||
}
|
||||
@ -468,7 +483,7 @@ class Parser
|
||||
{
|
||||
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)
|
||||
{
|
||||
ret.retstat = ParseRetstat(tokens);
|
||||
@ -546,7 +561,7 @@ class Parser
|
||||
}
|
||||
CodeRegion endRegion = tokens[index].region;
|
||||
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:
|
||||
{
|
||||
@ -562,7 +577,7 @@ class Parser
|
||||
}
|
||||
index += 1;
|
||||
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:
|
||||
{
|
||||
@ -683,7 +698,7 @@ class Parser
|
||||
}
|
||||
CodeRegion endRegion = tokens[index].region;
|
||||
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:
|
||||
{
|
||||
@ -736,7 +751,7 @@ class Parser
|
||||
}
|
||||
CodeRegion endRegion = tokens[index].region;
|
||||
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:
|
||||
{
|
||||
@ -762,7 +777,7 @@ class Parser
|
||||
}
|
||||
CodeRegion endRegion = tokens[index].region;
|
||||
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:
|
||||
{
|
||||
@ -775,7 +790,7 @@ class Parser
|
||||
index += 1;
|
||||
FuncnameNode name = ParseFuncname(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:
|
||||
{
|
||||
@ -798,7 +813,7 @@ class Parser
|
||||
string name = ((Token.StringData)tokens[index].data!).data;
|
||||
index += 1;
|
||||
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
|
||||
{
|
||||
@ -850,7 +865,7 @@ class Parser
|
||||
}
|
||||
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
|
||||
@ -862,7 +877,7 @@ class Parser
|
||||
index += 1;
|
||||
List<VarNode> lhs = [SuffixExpToVar(suffixExp)];
|
||||
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:
|
||||
{
|
||||
@ -883,7 +898,7 @@ class Parser
|
||||
index += 1;
|
||||
VarlistNode varlistNode = new(vars: vars, startRegion: startRegion, endRegion: vars[^1].endRegion);
|
||||
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)
|
||||
@ -892,7 +907,7 @@ class Parser
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user