From 5bc9db9acac3c9187e9fc27c1b4a7cf47b1c51d8 Mon Sep 17 00:00:00 2001 From: Will Hawkins Date: Mon, 20 Apr 2026 03:25:58 -0400 Subject: [PATCH] compiler, common, testing: Support For Checking For Invalid Statements Add support functions to check whether a (block of) statement(s) contains any statements that should not appear in that block (e.g., switch in an action). Signed-off-by: Will Hawkins --- Sources/P4Compiler/Common.swift | 22 +++++++ .../SupportTests/InvalidStatements.swift | 58 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 Tests/p4rseTests/SupportTests/InvalidStatements.swift diff --git a/Sources/P4Compiler/Common.swift b/Sources/P4Compiler/Common.swift index a292182..694384b 100644 --- a/Sources/P4Compiler/Common.swift +++ b/Sources/P4Compiler/Common.swift @@ -351,3 +351,25 @@ extension Argument: Compilable { } } } + +func ContainsInvalidStatements( + statement: EvaluatableStatement, invalids: [EvaluatableStatement.Type] +) -> Bool { + for es in invalids { + if type(of: statement) == es { + return true + } + } + return false +} + +func ContainsInvalidStatements(block: BlockStatement, invalids: [EvaluatableStatement.Type]) -> Bool { + return block.statements.contains() { statement in + for es in invalids { + if type(of: statement) == es { + return true + } + } + return false + } +} \ No newline at end of file diff --git a/Tests/p4rseTests/SupportTests/InvalidStatements.swift b/Tests/p4rseTests/SupportTests/InvalidStatements.swift new file mode 100644 index 0000000..4c19192 --- /dev/null +++ b/Tests/p4rseTests/SupportTests/InvalidStatements.swift @@ -0,0 +1,58 @@ +// p4rse, Copyright 2026, Will Hawkins +// +// This file is part of p4rse. +// +// This file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import Common +import Foundation +import Macros +import P4Lang +import P4Runtime +import SwiftTreeSitter +import Testing +import TreeSitter +import TreeSitterP4 + +@testable import P4Compiler + +@Test func test_invalid_statements() async throws { + + let ret = ReturnStatement(P4Value(P4IntValue(withValue: 5))) + let block = BlockStatement([ret]) + + #expect(ContainsInvalidStatements(block: block, invalids: [ReturnStatement.self])) +} + +@Test func test_no_invalid_statements() async throws { + + let exprs = ExpressionStatement(P4Value(P4IntValue(withValue: 5))) + let block = BlockStatement([exprs]) + + #expect(!ContainsInvalidStatements(block: block, invalids: [ReturnStatement.self])) +} + +@Test func test_is_invalid_statement() async throws { + + let ret = ReturnStatement(P4Value(P4IntValue(withValue: 5))) + + #expect(ContainsInvalidStatements(statement: ret, invalids: [ReturnStatement.self])) +} + +@Test func test_no_is_invalid_statement() async throws { + + let exprs = ExpressionStatement(P4Value(P4IntValue(withValue: 5))) + + #expect(!ContainsInvalidStatements(statement: exprs, invalids: [ReturnStatement.self])) +}