Allow { and } on mupltiple lines with any indentation

This commit is contained in:
Sam Vervaeck 2023-05-31 14:22:35 +02:00
parent b64b18216a
commit 25928c288b
Signed by: samvv
SSH key fingerprint: SHA256:dIg0ywU1OP+ZYifrYxy8c5esO72cIKB+4/9wkZj1VaY
2 changed files with 30 additions and 11 deletions

View file

@ -54,6 +54,7 @@ namespace bolt {
enum class FrameType { enum class FrameType {
Block, Block,
LineFold, LineFold,
Fallthrough,
}; };
class Punctuator : public BufferedStream<Token*> { class Punctuator : public BufferedStream<Token*> {

View file

@ -378,22 +378,40 @@ after_string_contents:
auto T0 = Tokens.peek(); auto T0 = Tokens.peek();
if (llvm::isa<EndOfFile>(T0)) { switch (T0->getKind()) {
if (Frames.size() == 1) { case NodeKind::LBrace:
return T0; Frames.push(FrameType::Fallthrough);
} break;
auto Frame = Frames.top(); case NodeKind::EndOfFile:
Frames.pop(); {
switch (Frame) { if (Frames.size() == 1) {
case FrameType::Block: return T0;
return new BlockEnd(T0->getStartLoc()); }
case FrameType::LineFold: auto Frame = Frames.top();
return new LineFoldEnd(T0->getStartLoc()); Frames.pop();
switch (Frame) {
case FrameType::Fallthrough:
break;
case FrameType::Block:
return new BlockEnd(T0->getStartLoc());
case FrameType::LineFold:
return new LineFoldEnd(T0->getStartLoc());
}
} }
default:
break;
} }
auto RefLoc = Locations.top(); auto RefLoc = Locations.top();
switch (Frames.top()) { switch (Frames.top()) {
case FrameType::Fallthrough:
{
if (T0->getKind() == NodeKind::RBrace) {
Frames.pop();
}
Tokens.get();
return T0;
}
case FrameType::LineFold: case FrameType::LineFold:
{ {
if (T0->getStartLine() > RefLoc.Line if (T0->getStartLine() > RefLoc.Line