From 25928c288be8e45a085ae18cb3ecb2e595d41043 Mon Sep 17 00:00:00 2001 From: Sam Vervaeck Date: Wed, 31 May 2023 14:22:35 +0200 Subject: [PATCH] Allow { and } on mupltiple lines with any indentation --- include/bolt/Scanner.hpp | 1 + src/Scanner.cc | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/include/bolt/Scanner.hpp b/include/bolt/Scanner.hpp index 73c2cc44f..3acbbd031 100644 --- a/include/bolt/Scanner.hpp +++ b/include/bolt/Scanner.hpp @@ -54,6 +54,7 @@ namespace bolt { enum class FrameType { Block, LineFold, + Fallthrough, }; class Punctuator : public BufferedStream { diff --git a/src/Scanner.cc b/src/Scanner.cc index 5f6b8a89d..505fe8364 100644 --- a/src/Scanner.cc +++ b/src/Scanner.cc @@ -378,22 +378,40 @@ after_string_contents: auto T0 = Tokens.peek(); - if (llvm::isa(T0)) { - if (Frames.size() == 1) { - return T0; - } - auto Frame = Frames.top(); - Frames.pop(); - switch (Frame) { - case FrameType::Block: - return new BlockEnd(T0->getStartLoc()); - case FrameType::LineFold: - return new LineFoldEnd(T0->getStartLoc()); + switch (T0->getKind()) { + case NodeKind::LBrace: + Frames.push(FrameType::Fallthrough); + break; + case NodeKind::EndOfFile: + { + if (Frames.size() == 1) { + return T0; + } + auto Frame = Frames.top(); + 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(); switch (Frames.top()) { + case FrameType::Fallthrough: + { + if (T0->getKind() == NodeKind::RBrace) { + Frames.pop(); + } + Tokens.get(); + return T0; + } case FrameType::LineFold: { if (T0->getStartLine() > RefLoc.Line