From 28f110e2c4e98b2f45bde5c81ab0347a2a85818c Mon Sep 17 00:00:00 2001 From: 0x4261756D <38735823+0x4261756D@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:41:36 +0100 Subject: [PATCH] Further cut down the amount of unnecessary coderegions --- Parser.cs | 118 +++++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/Parser.cs b/Parser.cs index 683f9b7..d551dcc 100644 --- a/Parser.cs +++ b/Parser.cs @@ -4,7 +4,7 @@ using System.Text.Json.Serialization; namespace luaaaaah; -class Parser +internal class Parser { public class ChunkNode(BlockNode block, CodeRegion startRegion, CodeRegion endRegion) { @@ -116,12 +116,12 @@ class Parser public ExplistNode rhs = rhs; public CodeRegion startRegion = startRegion, endRegion = endRegion; } - public class FunctioncallNode(SuffixexpNode function, string? objectArg, ArgsNode args, CodeRegion startRegion, CodeRegion endRegion) + public class FunctioncallNode(SuffixexpNode function, string? objectArg, ArgsNode args) { public SuffixexpNode function = function; public string? objectArg = objectArg; public ArgsNode args = args; - public CodeRegion startRegion = startRegion, endRegion = endRegion; + public CodeRegion startRegion = function.startRegion, endRegion = function.endRegion; } public class WhileNode(ExpNode condition, BlockNode body, CodeRegion startRegion, CodeRegion endRegion) { @@ -192,11 +192,11 @@ class Parser public abstract class SuffixexpNode(CodeRegion startRegion, CodeRegion endRegion) { public CodeRegion startRegion = startRegion, endRegion = endRegion; - public class Normal(NormalSuffixNode node, CodeRegion startRegion, CodeRegion endRegion) : SuffixexpNode(startRegion, endRegion) + public class Normal(NormalSuffixNode node) : SuffixexpNode(node.startRegion, node.endRegion) { public NormalSuffixNode node = node; } - public class Functioncall(FunctioncallNode node, CodeRegion startRegion, CodeRegion endRegion) : SuffixexpNode(startRegion, endRegion) + public class Functioncall(FunctioncallNode node) : SuffixexpNode(node.startRegion, node.endRegion) { public FunctioncallNode node = node; } @@ -231,38 +231,53 @@ class Parser [JsonDerivedType(typeof(Tableconstructor), typeDiscriminator: "e Tableconstructor")] [JsonDerivedType(typeof(Unop), typeDiscriminator: "e Unop")] [JsonDerivedType(typeof(Binop), typeDiscriminator: "e Binop")] - public abstract class ExpNode(CodeRegion startRegion, CodeRegion endRegion) + public abstract class ExpNode { - public CodeRegion startRegion = startRegion, endRegion = endRegion; - public class Nil(CodeRegion region) : ExpNode(region, region) { } - public class False(CodeRegion region) : ExpNode(region, region) { } - public class True(CodeRegion region) : ExpNode(region, region) { } - public class Numeral(INumeral value, CodeRegion region) : ExpNode(region, region) + public class Nil(CodeRegion region) : ExpNode { + public CodeRegion region = region; + } + public class False(CodeRegion region) : ExpNode + { + public CodeRegion region = region; + } + public class True(CodeRegion region) : ExpNode + { + public CodeRegion region = region; + } + public class Numeral(INumeral value, CodeRegion region) : ExpNode + { + public CodeRegion region = region; public INumeral value = value; } - public class LiteralString(string value, CodeRegion region) : ExpNode(region, region) + public class LiteralString(string value, CodeRegion region) : ExpNode { + public CodeRegion region = region; public string value = value; } - public class Varargs(CodeRegion region) : ExpNode(region, region) { } - public class Functiondef(FuncbodyNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) + public class Varargs(CodeRegion region) : ExpNode { + public CodeRegion region = region; + } + public class Functiondef(FuncbodyNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode + { + public CodeRegion startRegion = startRegion; + public CodeRegion endRegion = endRegion; public FuncbodyNode node = node; } - public class Suffixexp(SuffixexpNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) + public class Suffixexp(SuffixexpNode node) : ExpNode { public SuffixexpNode node = node; } - public class Tableconstructor(TableconstructorNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) + public class Tableconstructor(TableconstructorNode node) : ExpNode { public TableconstructorNode node = node; } - public class Unop(UnopNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) + public class Unop(UnopNode node) : ExpNode { public UnopNode node = node; } - public class Binop(BinopNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) + public class Binop(BinopNode node) : ExpNode { public BinopNode node = node; } @@ -409,7 +424,7 @@ class Parser { public ArgsNode node = node; } - public class ArgsFirstArg(ArgsFirstArgNode node, CodeRegion startRegion, CodeRegion endRegion) : SuffixexpSuffix(startRegion, endRegion) + public class ArgsFirstArg(ArgsFirstArgNode node) : SuffixexpSuffix(node.startRegion, node.endRegion) { public ArgsFirstArgNode node = node; } @@ -431,11 +446,11 @@ class Parser public abstract class FieldNode(CodeRegion startRegion, CodeRegion endRegion) { public CodeRegion startRegion = startRegion, endRegion = endRegion; - public class IndexedAssignment(IndexedAssignmentNode node, CodeRegion startRegion, CodeRegion endRegion) : FieldNode(startRegion, endRegion) + public class IndexedAssignment(IndexedAssignmentNode node) : FieldNode(node.startRegion, node.endRegion) { public IndexedAssignmentNode node = node; } - public class Assignment(FieldAssignmentNode node, CodeRegion startRegion, CodeRegion endRegion) : FieldNode(startRegion, endRegion) + public class Assignment(FieldAssignmentNode node) : FieldNode(node.startRegion, node.endRegion) { public FieldAssignmentNode node = node; } @@ -577,7 +592,7 @@ class Parser } index += 1; ExpNode conditon = ParseExp(tokens); - return new StatNode.Repeat(new(condition: conditon, body: body, startRegion: startRegion, endRegion: conditon.endRegion)); + return new StatNode.Repeat(new(condition: conditon, body: body, startRegion: startRegion, endRegion: tokens[index - 1].region)); } case TokenType.If: { @@ -1014,7 +1029,7 @@ class Parser { index += 1; ExpNode inner = ParseExp(tokens); - suffixes.Add(new SuffixexpSuffix.Indexed(node: inner, startRegion: suffixStartRegion, endRegion: inner.endRegion)); + suffixes.Add(new SuffixexpSuffix.Indexed(node: inner, startRegion: suffixStartRegion, endRegion: tokens[index - 1].region)); if(index >= tokens.Length) { throw new Exception($"Index {index} out of bounds of {tokens.Length}, expected `]` to close indexed suffix of suffix-expression starting at {suffixStartRegion}"); @@ -1040,7 +1055,7 @@ class Parser string name = ((Token.StringData)tokens[index].data!).data; index += 1; ArgsNode args = ParseArgs(tokens); - suffixes.Add(new SuffixexpSuffix.ArgsFirstArg(new(name, rest: args, startRegion: suffixStartRegion, endRegion: args.endRegion), startRegion: suffixStartRegion, endRegion: args.endRegion)); + suffixes.Add(new SuffixexpSuffix.ArgsFirstArg(new(name, rest: args, startRegion: suffixStartRegion, endRegion: args.endRegion))); } break; case TokenType.RoundOpen: @@ -1067,32 +1082,20 @@ class Parser SuffixexpSuffix.Args args => new SuffixexpNode.Functioncall( node: new( function: new SuffixexpNode.Normal( - node: new NormalSuffixNode(firstPart, suffixes[..^1], startRegion, args.endRegion), - startRegion: startRegion, - endRegion: args.endRegion + node: new NormalSuffixNode(firstPart, suffixes[..^1], startRegion, args.endRegion) ), args: args.node, - objectArg: null, - startRegion: startRegion, - endRegion: args.endRegion - ), - startRegion: startRegion, - endRegion: args.endRegion + objectArg: null + ) ), SuffixexpSuffix.ArgsFirstArg node => new SuffixexpNode.Functioncall( node: new( function: new SuffixexpNode.Normal( - node: new NormalSuffixNode(firstPart: firstPart, suffixes: suffixes[..^1], startRegion, node.endRegion), - startRegion: startRegion, - endRegion: node.endRegion + node: new NormalSuffixNode(firstPart: firstPart, suffixes: suffixes[..^1], startRegion, node.endRegion) ), objectArg: node.node.name, - args: node.node.rest, - startRegion: startRegion, - endRegion: node.endRegion - ), - startRegion: startRegion, - endRegion: node.endRegion + args: node.node.rest + ) ), _ => null, }; @@ -1106,11 +1109,7 @@ class Parser endRegion = firstPart.endRegion; } - return new SuffixexpNode.Normal( - node: new(firstPart: firstPart, suffixes: suffixes, startRegion: startRegion, endRegion: endRegion), - startRegion: startRegion, - endRegion: endRegion - ); + return new SuffixexpNode.Normal(node: new(firstPart: firstPart, suffixes: suffixes, startRegion: startRegion, endRegion: endRegion)); } private ArgsNode ParseArgs(Token[] tokens) @@ -1246,7 +1245,7 @@ class Parser } index += 1; ExpNode rhs = ParseExp(tokens); - return new FieldNode.IndexedAssignment(node: new(index: indexNode, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); + return new FieldNode.IndexedAssignment(node: new(index: indexNode, rhs: rhs, startRegion: startRegion, endRegion: tokens[index - 1].region)); } case TokenType.Name: { @@ -1255,15 +1254,15 @@ class Parser string name = ((Token.StringData)tokens[index].data!).data; index += 2; ExpNode rhs = ParseExp(tokens); - return new FieldNode.Assignment(node: new(lhs: name, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); + return new FieldNode.Assignment(node: new(lhs: name, rhs: rhs, startRegion: startRegion, endRegion: tokens[index - 1].region)); } ExpNode exp = ParseExp(tokens); - return new FieldNode.Exp(node: exp, startRegion: startRegion, endRegion: exp.endRegion); + return new FieldNode.Exp(node: exp, startRegion: startRegion, endRegion: tokens[index - 1].region); } default: { ExpNode exp = ParseExp(tokens); - return new FieldNode.Exp(node: exp, startRegion: startRegion, endRegion: exp.endRegion); + return new FieldNode.Exp(node: exp, startRegion: startRegion, endRegion: tokens[index - 1].region); } } } @@ -1463,13 +1462,14 @@ class Parser private ExplistNode ParseExplist(Token[] tokens) { + CodeRegion startRegion = tokens[index].region; List exps = [ParseExp(tokens)]; while(index < tokens.Length && tokens[index].type == TokenType.Comma) { index += 1; exps.Add(ParseExp(tokens)); } - return new ExplistNode(exps: exps, startRegion: exps[0].startRegion, endRegion: exps[^1].endRegion); + return new ExplistNode(exps: exps, startRegion: startRegion, endRegion: tokens[index - 1].region); } private ExpNode ParseExp(Token[] tokens) @@ -1497,7 +1497,7 @@ class Parser int associativityBoost = (GetPrecedence(tokens[index]) == precedence) ? 0 : 1; rhs = ParseExpPrecedence(tokens, lhs: rhs, minPrecedence: precedence + associativityBoost); } - currentLhs = new ExpNode.Binop(node: new(lhs: currentLhs, type: op, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); + currentLhs = new ExpNode.Binop(node: new(lhs: currentLhs, type: op, rhs: rhs, startRegion: startRegion, endRegion: tokens[index - 1].region)); } return currentLhs; } @@ -1598,7 +1598,7 @@ class Parser case TokenType.CurlyOpen: { TableconstructorNode inner = ParseTableconstructor(tokens); - return new ExpNode.Tableconstructor(node: inner, startRegion: inner.startRegion, endRegion: inner.endRegion); + return new ExpNode.Tableconstructor(node: inner); } case TokenType.Function: { @@ -1610,30 +1610,30 @@ class Parser { index += 1; ExpNode unop = ParseExp(tokens); - return new ExpNode.Unop(node: new(type: UnopType.Minus, exp: unop, startRegion: startRegion, endRegion: unop.endRegion), startRegion: startRegion, endRegion: unop.endRegion); + return new ExpNode.Unop(node: new(type: UnopType.Minus, exp: unop, startRegion: startRegion, endRegion: tokens[index - 1].region)); } case TokenType.Hash: { index += 1; ExpNode unop = ParseExp(tokens); - return new ExpNode.Unop(node: new(type: UnopType.Length, exp: unop, startRegion: startRegion, endRegion: unop.endRegion), startRegion: startRegion, endRegion: unop.endRegion); + return new ExpNode.Unop(node: new(type: UnopType.Length, exp: unop, startRegion: startRegion, endRegion: tokens[index - 1].region)); } case TokenType.Not: { index += 1; ExpNode unop = ParseExp(tokens); - return new ExpNode.Unop(node: new(type: UnopType.LogicalNot, exp: unop, startRegion: startRegion, endRegion: unop.endRegion), startRegion: startRegion, endRegion: unop.endRegion); + return new ExpNode.Unop(node: new(type: UnopType.LogicalNot, exp: unop, startRegion: startRegion, endRegion: tokens[index - 1].region)); } case TokenType.Tilde: { index += 1; ExpNode unop = ParseExp(tokens); - return new ExpNode.Unop(node: new(type: UnopType.BinaryNot, exp: unop, startRegion: startRegion, endRegion: unop.endRegion), startRegion: startRegion, endRegion: unop.endRegion); + return new ExpNode.Unop(node: new(type: UnopType.BinaryNot, exp: unop, startRegion: startRegion, endRegion: tokens[index - 1].region)); } default: { SuffixexpNode suffixexp = ParseSuffixExp(tokens); - return new ExpNode.Suffixexp(node: suffixexp, startRegion: suffixexp.startRegion, endRegion: suffixexp.endRegion); + return new ExpNode.Suffixexp(node: suffixexp); } } }