pointfreeco / swift-parsing

A library for turning nebulous data into well-structured data, with a focus on composition, performance, generality, and ergonomics.
https://www.pointfree.co/collections/parsing
MIT License
864 stars 77 forks source link

CharacterSet Parser throws EXC_BREAKPOINT #333

Open pacu opened 11 months ago

pacu commented 11 months ago

When using a CharacterSet inside a parser, any character that is not in the set will crash the process.

Version:

 {
      "identity" : "swift-parsing",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/pointfreeco/swift-parsing",
      "state" : {
        "revision" : "a0e7d73f462c1c38c59dc40a3969ac40cea42950",
        "version" : "0.13.0"
      }
    }

Proof of Concept:

Run the following test:


extension CharacterSet {
    static let naiveSet = CharacterSet(charactersIn: "abc")
}

let naiveParser = Parse {
    CharacterSet.naiveSet
}

final class LameTest: XCTestCase {
    func testNaiveSetWorks() {
        let validInput = "abacabb"[...]
        let result = naiveParser.parse(validInput)
        XCTAssertEqual(result, validInput)

        let invalidInput = "abacad"[...]

        let unresult = naiveParser.parse(invalidInput)
        XCTAssertEqual(unresult, invalidInput)
    }
}

Expected

The parse() should throw and compiler must err if not called with a try statement, and then actually throw an error.

Result

The function crashes. The compiler does not let parse() be called with a try since it considers it "not throwing"

image

Workaround:

let naiveParser = Parse {
    CharacterSet.naiveSet.eraseToAnyParser()
}