From 8645db8de0dca91b3a7ddf03f678aa0d80c4e504 Mon Sep 17 00:00:00 2001 From: John Sundell Date: Fri, 24 Aug 2018 18:42:07 +0200 Subject: [PATCH] Initial commit --- .gitignore | 5 + CODE_OF_CONDUCT.md | 77 +++ CONTRIBUTING.md | 94 ++++ Images/Code.png | Bin 0 -> 13086 bytes Images/Logo.png | Bin 0 -> 218817 bytes LICENSE | 21 + Makefile | 6 + Package.swift | 35 ++ README.md | 166 +++++++ .../CharacterSet/CharacterSet+Contains.swift | 17 + .../Equatable/Equatable+AnyOf.swift | 17 + Sources/Splash/Extensions/Int/Int+IsOdd.swift | 13 + .../Extensions/Sequence/Sequence+AnyOf.swift | 23 + .../Sequence/Sequence+Occurrences.swift | 15 + .../Extensions/Strings/String+IsNumber.swift | 13 + .../Strings/String+PrefixChecking.swift | 25 + .../Extensions/Strings/String+Removing.swift | 13 + .../Strings/Substring+HasSuffix.swift | 16 + Sources/Splash/Grammar/Grammar.swift | 21 + Sources/Splash/Grammar/SwiftGrammar.swift | 364 ++++++++++++++ .../Output/AttributedStringOutputFormat.swift | 114 +++++ Sources/Splash/Output/HTMLOutputFormat.swift | 51 ++ Sources/Splash/Output/OutputBuilder.swift | 25 + Sources/Splash/Output/OutputFormat.swift | 23 + Sources/Splash/Syntax/SyntaxHighlighter.swift | 91 ++++ Sources/Splash/Syntax/SyntaxRule.swift | 22 + Sources/Splash/Theming/Color.swift | 25 + Sources/Splash/Theming/Font.swift | 47 ++ Sources/Splash/Theming/Theme.swift | 51 ++ Sources/Splash/Tokenizing/Segment.swift | 52 ++ Sources/Splash/Tokenizing/TokenType.swift | 29 ++ Sources/Splash/Tokenizing/Tokenizer.swift | 210 ++++++++ Sources/SplashHTMLGen/main.swift | 17 + .../Extensions/CGImage+WriteToURL.swift | 19 + .../Extensions/CommandLine+Options.swift | 61 +++ .../Extensions/NSGraphicsContext+Fill.swift | 18 + .../NSGraphicsContext+InitWithSize.swift | 31 ++ Sources/SplashImageGen/main.swift | 57 +++ .../TokenizerOutputFormat.swift | 36 ++ Sources/SplashTokenizer/main.swift | 17 + Tests/LinuxMain.swift | 12 + .../Core/SyntaxHighlighterTestCase.swift | 35 ++ Tests/SplashTests/Core/TestCaseVerifier.swift | 33 ++ Tests/SplashTests/Core/TestClosure.swift | 10 + .../Core/XCTestCase+TestNames.swift | 21 + Tests/SplashTests/Core/XCTestManifests.swift | 25 + .../SplashTests/Mocks/OutputBuilderMock.swift | 36 ++ .../SplashTests/Mocks/OutputFormatMock.swift | 16 + Tests/SplashTests/Tests/ClosureTests.swift | 144 ++++++ Tests/SplashTests/Tests/CommentTests.swift | 74 +++ .../SplashTests/Tests/DeclarationTests.swift | 455 ++++++++++++++++++ Tests/SplashTests/Tests/EnumTests.swift | 64 +++ .../SplashTests/Tests/FunctionCallTests.swift | 71 +++ Tests/SplashTests/Tests/LiteralTests.swift | 149 ++++++ Tests/SplashTests/Tests/OptionalTests.swift | 59 +++ .../SplashTests/Tests/PreprocessorTests.swift | 78 +++ Tests/SplashTests/Tests/StatementTests.swift | 174 +++++++ 57 files changed, 3393 insertions(+) create mode 100644 .gitignore create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Images/Code.png create mode 100644 Images/Logo.png create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 Package.swift create mode 100644 README.md create mode 100644 Sources/Splash/Extensions/CharacterSet/CharacterSet+Contains.swift create mode 100644 Sources/Splash/Extensions/Equatable/Equatable+AnyOf.swift create mode 100644 Sources/Splash/Extensions/Int/Int+IsOdd.swift create mode 100644 Sources/Splash/Extensions/Sequence/Sequence+AnyOf.swift create mode 100644 Sources/Splash/Extensions/Sequence/Sequence+Occurrences.swift create mode 100644 Sources/Splash/Extensions/Strings/String+IsNumber.swift create mode 100644 Sources/Splash/Extensions/Strings/String+PrefixChecking.swift create mode 100644 Sources/Splash/Extensions/Strings/String+Removing.swift create mode 100644 Sources/Splash/Extensions/Strings/Substring+HasSuffix.swift create mode 100644 Sources/Splash/Grammar/Grammar.swift create mode 100644 Sources/Splash/Grammar/SwiftGrammar.swift create mode 100644 Sources/Splash/Output/AttributedStringOutputFormat.swift create mode 100644 Sources/Splash/Output/HTMLOutputFormat.swift create mode 100644 Sources/Splash/Output/OutputBuilder.swift create mode 100644 Sources/Splash/Output/OutputFormat.swift create mode 100644 Sources/Splash/Syntax/SyntaxHighlighter.swift create mode 100644 Sources/Splash/Syntax/SyntaxRule.swift create mode 100644 Sources/Splash/Theming/Color.swift create mode 100644 Sources/Splash/Theming/Font.swift create mode 100644 Sources/Splash/Theming/Theme.swift create mode 100644 Sources/Splash/Tokenizing/Segment.swift create mode 100644 Sources/Splash/Tokenizing/TokenType.swift create mode 100644 Sources/Splash/Tokenizing/Tokenizer.swift create mode 100644 Sources/SplashHTMLGen/main.swift create mode 100644 Sources/SplashImageGen/Extensions/CGImage+WriteToURL.swift create mode 100644 Sources/SplashImageGen/Extensions/CommandLine+Options.swift create mode 100644 Sources/SplashImageGen/Extensions/NSGraphicsContext+Fill.swift create mode 100644 Sources/SplashImageGen/Extensions/NSGraphicsContext+InitWithSize.swift create mode 100644 Sources/SplashImageGen/main.swift create mode 100644 Sources/SplashTokenizer/TokenizerOutputFormat.swift create mode 100644 Sources/SplashTokenizer/main.swift create mode 100644 Tests/LinuxMain.swift create mode 100644 Tests/SplashTests/Core/SyntaxHighlighterTestCase.swift create mode 100644 Tests/SplashTests/Core/TestCaseVerifier.swift create mode 100644 Tests/SplashTests/Core/TestClosure.swift create mode 100644 Tests/SplashTests/Core/XCTestCase+TestNames.swift create mode 100644 Tests/SplashTests/Core/XCTestManifests.swift create mode 100644 Tests/SplashTests/Mocks/OutputBuilderMock.swift create mode 100644 Tests/SplashTests/Mocks/OutputFormatMock.swift create mode 100644 Tests/SplashTests/Tests/ClosureTests.swift create mode 100644 Tests/SplashTests/Tests/CommentTests.swift create mode 100644 Tests/SplashTests/Tests/DeclarationTests.swift create mode 100644 Tests/SplashTests/Tests/EnumTests.swift create mode 100644 Tests/SplashTests/Tests/FunctionCallTests.swift create mode 100644 Tests/SplashTests/Tests/LiteralTests.swift create mode 100644 Tests/SplashTests/Tests/OptionalTests.swift create mode 100644 Tests/SplashTests/Tests/PreprocessorTests.swift create mode 100644 Tests/SplashTests/Tests/StatementTests.swift diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7fb530a --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +Package.resolved diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..4f7625e --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,77 @@ +# Splash Code of Conduct + +Below is the Code of Conduct that all contributors and participants in the Splash community are expected to adhere to. +It's adopted from the [Contributor Covenant Code of Conduct][homepage]. + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project leader at john@sundell.co. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..ede0348 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,94 @@ +# Splash Contribution Guide + +Welcome to the *Splash Contribution Guide* - a document that aims to give you all the information you need to contribute to the Splash project. + +Before you continue, make sure that you've read & agree to [the Code of Conduct](https://github.com/JohnSundell/Splash/blob/master/CODE_OF_CONDUCT.md). + +## Bugs, feature requests and support + +Splash doesn't use GitHub issues, so all form of support - whether that's asking a question, reporting a bug, or discussing a feature request - takes place in Pull Requests. + +The idea behind this workflow is to encourage more people using Splash to dive into the source code and familiarize themselves with how it works, in order to better be able to *self-service* on bugs and issues - hopefully leading to a better and more fluid experience for everyone involved 😊. + +*This workflow is still very much an experiment, so please be patient and try to keep an open mind as we work things out together* 😉 + +**🐞 I found a bug, how do I report it?** + +If you find a bug, for example a piece of code that doesn't highlight correctly, here's the recommended workflow: + +1. Come up with the simplest code possible that reproduces the issue (`SplashTokenizer` can be a great tool to use in order to quickly test how Splash tokenizes a string of code). +2. Write a test case using the code that reproduces the issue. [See Splash's existing tests for inspiration on how to get started](https://github.com/JohnSundell/Splash/tree/master/Tests/SplashTests/Tests). When writing a test, you essentially give `SyntaxHighlighter` a string to highlight, and then perform an `XCTAssertEqual` against an array of expected components. +3. Either fix the bug yourself, or simply submit your failing test as a Pull Request, and we can work on a solution together. + +While doing the above does require a bit of extra work for the person who found the bug, it gives us as a community a very nice starting point for fixing issues - hopefully leading to quicker fixes and a more constructive workflow. + +**💡 I have an idea for a feature request!** + +First of all, that's awesome! 👍 Your ideas on how to make Splash better and more powerful are super welcome. Here's the recommended workflow for feature requests: + +1. Do some prototyping and come up with a sample implementation of your idea or feature request. Note that this doesn't have to be a fully working, complete implementation, just something that illustrates the feature and your idea on how it could be added to Splash. +2. Submit your sample implementation as a Pull Request. Use the description field to write down why you think the feature should be added and some initial discussion points. +3. Together we'll discuss the feature and your sample implementation, and either accept it as-is, use it as a starting point for a new implementation, or decide that the idea is not worth implementing as this time. + +**🤔 I have a question that the documentation doesn't yet answer** + +With Splash, the goal is to end up with state of the art documentation that answers most of the questions that both users and developers of the tool might have - and the only way to get there is through continued improvement, with your help. + +Here's the recommended workflow for getting your question answered: + +1. Start by looking through the code. Splash is a normal Swift package that uses standard Swift conventions with a (hopefully 😅) well-defined structure. Chances are high that you'll be able to answer your own question by reading through the implementation, the tests, and the inline code documentation. +2. If you found out the answer to your question (congrats! 🎉) - then don't stop there. Other people will probably ask themselves the same question at some point - so let's improve the documentation! Find an appropriate place where your question could've been answered by clearer documentation or a better structure (for example this document, or inline in the code) - and add the documentation you wish would've been there. If you didn't manage to find an answer (no worries, we're all always learning 👍), write down your question as a comment - either in the code or in one of the Markdown documents. +3. Submit your new documentation or your comment as a Pull Request, and we'll work on improving the documentation together. + +## Design and technical decisions + +Like most programs & frameworks, Splash could've been written in many different ways. Specifically for the task of Swift syntax highlighting, there were three main options to consider: + +1. Apply regular expressions to the code in order to tokenize it. This is how most JavaScript-based syntax highlighters work. It's a common and proven approach, but it usually doesn't yield the most accurate results (writing really granular regular expressions is really hard), and can be a bit alienating for people who haven't used advanced regular expressions before. +2. Hook into Apple's SourceKit service. SourceKit is what powers Xcode's syntax highlighting, and works in tandem with the Swift compiler to tokenize and highlight code. SourceKit is awesome, but using it is quite complicated and requires cross-process communication. +3. Simply parse the code manually. Like all programming languages, Swift has a well-defined syntax and clear grammar that we can model in code, in order to parse and tokenize code by iterating through it. + +When I first started exploring the idea of a custom Swift syntax highlighter, I built quick prototypes using all of the above three techniques - and the one that I liked the most (by far) was option number 3. Writing Splash as a normal Swift package, using normal Swift code, with standard Swift conventions turned out (at least for me) to be the most easy to understand and easy to work with solution. + +The next challenge then became to decide exactly *how* to write such a Swift package. Swift's syntax changes over time, so Splash required a flexible setup in order to avoid becoming hard to maintain due to complicated logic and lots of different conditions scattered all over the code. + +## Architectural overview + +Splash's architecture was designed to enable easy tweaking of how it parses and tokenizes code, and to make bugs and edge cases easier to debug - but also to hide all those implementation details from the API user. + +**SyntaxHighlighter** + +The most top level API that most API users will interact with is `SyntaxHighlighter`. It doesn't do much itself, but instead works as the *"middleman"* between the internal `Tokenizer` type and user-configurable implementations of `Grammar` and `OutputFormat`. + +So as an API user, all you have to know in order to use Splash is this: + +```swift +let highlighter = SyntaxHighlighter(format: HTMLOutputFormat()) +let code = highlighter.highlight("func hello() -> Int") +``` + +**Tokenizer** + +The `Tokenizer` type enables `SyntaxHighlighter` to ask for a sequence of code segments for a given string, using a set of delimiters to use to split the code up. It then iterates through each character of the given string and uses the set of delimiters to check when each segment should begin and end. + +The reason `Tokenizer` doesn't simply *split* the string is to enable Splash to have as close to `O(N)` performance characteristics as possible. If we first had to split the string, *then* iterate through it, we would always make at least two passes through the code. With the current approach, only one full pass has to be made. + +**Grammar** + +What delimiters that `Tokenizer` should use to split the code up into segments is determined by the given language `Grammar`. The default implementation is called `SwiftGrammar`, which aims to mimic the behavior of the Swift compiler as close as possible without actually having to compile the code (which is what enables Splash to be so fast). + +The decision to not simply hardcode `SwitftGrammar` across the code base was to [decouple the code using a protocol](https://www.swiftbysundell.com/posts/separation-of-concerns-using-protocols-in-swift) (in this case `Grammar`) to achieve a much more flexible solution. If the Swift grammar changes a lot in the future, we can always add a second implementation while still maintaining backward compatibility, and it also opens up the possibility of using Splash with languages other than Swift - since it doesn't make many (if any) hard assumptions about Swift itself (Objective-C support, anyone? 😉). + +Apart from supplying `Tokenizer` with delimiters, the most important role of a `Grammar` implementation is to provide an array of `SyntaxRule` implementations. When `SyntaxHighlighter` iterates through the segments that its `Tokenizer` gave it, it applies the syntax rules from its `Grammar` to each one of them to figure out each token's type. Each rule is asked if it matches a given segment, and as soon as a match is found that rule's `TokenType` is used to determine the type of that token. + +Have a look at `SwiftGrammar` to see all of its `SyntaxRule` implementations and how they decide how to classify each token using code segments. + +**OutputFormat** + +The final piece of the puzzle is `OutputFormat`, which determines how the result of tokenizing a string of code should be transformed into its final form. Splash ships with two implementations of this protocol `HTMLOutputFormat` and `AttributedStringOutputFormat`, but the framework makes no assumptions about what output format that the API user may want, since the output format can be fully customized. + +An `OutputFormat` has two responsibilities. The first is to define what type that the output will actually be (through its `Output` associated type). The second is to construct an `OutputBuilder` to build up a value of that output format type. Splash uses the *[builder pattern](https://www.swiftbysundell.com/posts/using-the-builder-pattern-in-swift)* to be able to continuously build up the output as it iterates through each token, and at the end call `build()` on the builder to output the final result. + +**Conclusion** + +Hopefully this document has given you an introduction to how Splash works, both in terms of its recommended project workflow and its technical implementation. Feel free to submit Pull Requests to improve this document, and I look forward to working with you on Splash and seeing how you use it 😀 \ No newline at end of file diff --git a/Images/Code.png b/Images/Code.png new file mode 100644 index 0000000000000000000000000000000000000000..04c2c2a17209b5ca93df4b4f8fd0f57b48b16d7b GIT binary patch literal 13086 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 vcnR|V+aK@0`uvX*{nsDP!gNk literal 0 HcmV?d00001 diff --git a/Images/Logo.png b/Images/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d90e1e286f0ead26376c15de61807dec1f740a6 GIT binary patch literal 218817 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%0AU*@+glHg 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 R?kfrKF+!T^ztVM%{(saT7eW94 literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2939a28 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 John Sundell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fe3dbef --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +install: + swift package update + swift build -c release -Xswiftc -static-stdlib + install .build/Release/SplashHTMLGen /usr/local/bin/SplashHTMLGen + install .build/Release/SplashImageGen /usr/local/bin/SplashImageGen + install .build/Release/SplashTokenizer /usr/local/bin/SplashTokenizer diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..7d09cef --- /dev/null +++ b/Package.swift @@ -0,0 +1,35 @@ +// swift-tools-version:4.1 + +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import PackageDescription + +let package = Package( + name: "Splash", + products: [ + .library(name: "Splash", targets: ["Splash"]) + ], + targets: [ + .target(name: "Splash"), + .target( + name: "SplashHTMLGen", + dependencies: ["Splash"] + ), + .target( + name: "SplashImageGen", + dependencies: ["Splash"] + ), + .target( + name: "SplashTokenizer", + dependencies: ["Splash"] + ), + .testTarget( + name: "SplashTests", + dependencies: ["Splash"] + ) + ] +) diff --git a/README.md b/README.md new file mode 100644 index 0000000..91b6c38 --- /dev/null +++ b/README.md @@ -0,0 +1,166 @@ +

    + Splash +

    + +

    + + + Swift Package Manager + + Mac + Linux + + Twitter: @johnsundell + +

    + +Welcome to **Splash** - a fast, lightweight and flexible Swift syntax highlighter. It can be used to generate code sample HTML for a blog post, to turn a string of Swift code into a fully syntax highlighted image, or to build custom developer tools. + +## Usage + +Splash can be used either as a library in your own Swift Package Manager-powered tool or script, or by using one of the three built-in command line tools that act as frontends for the Splash library. + +### 🌍 On the web + +Thanks to my good friend [Gui Rambo](https://twitter.com/_inside), you can [try out Splash directly in your browser](https://splash.rambo.codes)! His web tool lets you use Splash to generate either HTML or an image, by simply pasting Swift code into a text box. + +👉 [splash.rambo.codes](https://splash.rambo.codes) + +### 🖥 On the command line + +The easiest way to get started building things with Splash is to use one of the three built-in command line tools that each enable you to use Splash in different ways. + +#### SplashHTMLGen + +`SplashHTMLGen` uses Splash's HTML output format to generate an HTML string from Swift code. You simply pass it the code you want to highlight as an argument and HTML is returned as standard output. + +For example, if you call it like this: + +``` +$ SplashHTMLGen "func hello(world: String) -> Int" +``` + +You'll get the following output back: + +```html +func hello(world: String) -> Int +``` + +For more information about HTML generation with Splash and how to customize it, see `HTMLOutputFormat`. + +#### SplashImageGen + +`SplashImageGen` uses Splash to generate an `NSAttributedString` from Swift code, then draws that attributed string into a graphics context to turn it into an image, which is then written to disk. + +For example, if you call it like this: + +``` +$ SplashImageGen "func hello(world: String) -> Int" "MyImage.png" +``` + +The following image will be generated (and written to disk as `MyImage.png`): + +Code sample + +*`SplashImageGen` is currently only available on macOS.* + +#### SplashTokenizer + +The final built-in command line tool, `SplashTokenizer`, is mostly useful as a debugging tool when working on Splash - but can also be interesting to use in order to see how Splash breaks down code into tokens. Given a string of Swift code, it simply outputs all of its components (excluding whitespaces). + +So if you call it like this: + +``` +$ SplashTokenizer "func hello(world: String) -> Int" +``` + +You'll get the following standard output back: + +``` +Keyword token: func +Plain text: hello(world: +Type token: String +Plain text: ) +Plain text: -> +Type token: Int +``` + +### 📦 As a package + +To include Splash in your own script or Swift package, [add it as a dependency](#installation) and use the `SyntaxHighlighter` class combined with your output format of choice to highlight a string of code: + +```swift +import Splash + +let highlighter = SyntaxHighlighter(format: HTMLOutputFormat()) +let html = highlighter.highlight("func hello() -> String") +``` + +Splash ships with two built-in output formats - HTML and `NSAttributedString`, but you can also easily add your own by implementing the `OutputFormat` protocol. + +## Installation + +Splash is distributed as a Swift package, making it easy to install for use in scripts, developer tools, server-side applications, or to use its built-in command line tools. + +Splash supports both macOS and Linux. + +*Before you begin, make sure that you have a Swift 4.1-compatible toolchain installed (for example Xcode 9.4 if you're on a Mac).* + +### 📦 As a package + +To install Splash for use in a Swift Package Manager-powered tool or server-side application, add Splash as a dependency to your `Package.swift` file. For more information, please see the [Swift Package Manager documentation](https://github.com/apple/swift-package-manager/tree/master/Documentation). + +### 🏃‍♂️ As a Marathon dependency + +If you want to use Splash in a [Marathon](https://github.com/johnsundell/marathon) script, either add it to your `Marathonfile` (see the Marathon repo for instructions on how to do that), or point Marathon to Splash using the inline dependency syntax: + +```swift +import Splash // https://github.com/johnsundell/splash.git +``` + +### 🛠 Command line tools + +If you want to use Splash through one of its built-in command line tools, start by cloning the repo to your local machine: + +``` +$ git clone https://github.com/johnsundell/splash.git +$ cd Splash +``` + +To run a tool without installing it, you can use the Swift Package Manager's `run` command, like this: + +``` +$ swift run SplashHTMLGen "func hello(world: String) -> Int" +``` + +To install all three command line tools globally on your system, use Make: + +``` +$ make install +``` + +That will install the following three tools in your `/usr/local/bin` folder: + +``` +SplashHTMLGen +SplashImageGen +SplashTokenizer +``` + +If you only wish to install one of these, compile it and then move it to `/usr/local/bin`, like this: + +``` +$ swift build -c release -Xswiftc -static-stdlib +$ install .build/Release/SplashHTMLGen /usr/local/bin/SplashHTMLGen +``` + +## Contributions and support + +Splash is developed completely in the open, and your contributions are more than welcome. It's still a very new project, so I'm sure there are bugs to be found and improvements to be made - and hopefully we can work on those together as a community. + +You might notice that this project does not have GitHub issues enabled. That's because with Splash, I'm trying out a new 100% PR-based open source workflow. This is a bit of an experiment, so let's see how it works out. + +To read more about suggested workflows when contributing to Splash, how to report bugs and feature requests, as well as technical details and an architectural overview - check out the [Contributing Guide](https://github.com/JohnSundell/Splash/blob/master/CONTRIBUTING.md). + +## Hope you enjoy using Splash! + +I had a lot of fun building Splash, and I'm looking forward to continue working on it in the open together with you! I hope you'll like it and that you'll find it useful. Let me know what you think on on [Twitter](https://twitter.com/johnsundell), [Mastodon](https://mastodon.social/@johnsundell) or [Micro.blog](https://micro.blog/johnsundell) 😊 diff --git a/Sources/Splash/Extensions/CharacterSet/CharacterSet+Contains.swift b/Sources/Splash/Extensions/CharacterSet/CharacterSet+Contains.swift new file mode 100644 index 0000000..1c5b830 --- /dev/null +++ b/Sources/Splash/Extensions/CharacterSet/CharacterSet+Contains.swift @@ -0,0 +1,17 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +internal extension CharacterSet { + func contains(_ character: Character) -> Bool { + guard let scalar = character.unicodeScalars.first else { + return false + } + + return contains(scalar) + } +} diff --git a/Sources/Splash/Extensions/Equatable/Equatable+AnyOf.swift b/Sources/Splash/Extensions/Equatable/Equatable+AnyOf.swift new file mode 100644 index 0000000..7a1c7a3 --- /dev/null +++ b/Sources/Splash/Extensions/Equatable/Equatable+AnyOf.swift @@ -0,0 +1,17 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +extension Equatable { + func isAny(of candidates: Self...) -> Bool { + return candidates.contains(self) + } + + func isAny(of candidates: [Self]) -> Bool { + return candidates.contains(self) + } +} diff --git a/Sources/Splash/Extensions/Int/Int+IsOdd.swift b/Sources/Splash/Extensions/Int/Int+IsOdd.swift new file mode 100644 index 0000000..d8b31a2 --- /dev/null +++ b/Sources/Splash/Extensions/Int/Int+IsOdd.swift @@ -0,0 +1,13 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +internal extension Int { + var isEven: Bool { + return self % 2 == 0 + } +} diff --git a/Sources/Splash/Extensions/Sequence/Sequence+AnyOf.swift b/Sources/Splash/Extensions/Sequence/Sequence+AnyOf.swift new file mode 100644 index 0000000..0af8aae --- /dev/null +++ b/Sources/Splash/Extensions/Sequence/Sequence+AnyOf.swift @@ -0,0 +1,23 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +internal extension Sequence where Element: Equatable { + func contains(anyOf candidates: Element...) -> Bool { + return contains(anyOf: candidates) + } + + func contains(anyOf candidates: [Element]) -> Bool { + for candidate in candidates { + if contains(candidate) { + return true + } + } + + return false + } +} diff --git a/Sources/Splash/Extensions/Sequence/Sequence+Occurrences.swift b/Sources/Splash/Extensions/Sequence/Sequence+Occurrences.swift new file mode 100644 index 0000000..b9286f5 --- /dev/null +++ b/Sources/Splash/Extensions/Sequence/Sequence+Occurrences.swift @@ -0,0 +1,15 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +internal extension Sequence where Element: Equatable { + func numberOfOccurrences(of target: Element) -> Int { + return reduce(0) { count, element in + return element == target ? count + 1 : count + } + } +} diff --git a/Sources/Splash/Extensions/Strings/String+IsNumber.swift b/Sources/Splash/Extensions/Strings/String+IsNumber.swift new file mode 100644 index 0000000..38eb2fc --- /dev/null +++ b/Sources/Splash/Extensions/Strings/String+IsNumber.swift @@ -0,0 +1,13 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +extension String { + var isNumber: Bool { + return Int(self) != nil + } +} diff --git a/Sources/Splash/Extensions/Strings/String+PrefixChecking.swift b/Sources/Splash/Extensions/Strings/String+PrefixChecking.swift new file mode 100644 index 0000000..670f134 --- /dev/null +++ b/Sources/Splash/Extensions/Strings/String+PrefixChecking.swift @@ -0,0 +1,25 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +internal extension String { + var isCapitalized: Bool { + guard let firstCharacter = first.map(String.init) else { + return false + } + + return firstCharacter != firstCharacter.lowercased() + } + + var startsWithLetter: Bool { + guard let firstCharacter = first else { + return false + } + + return CharacterSet.letters.contains(firstCharacter) + } +} diff --git a/Sources/Splash/Extensions/Strings/String+Removing.swift b/Sources/Splash/Extensions/Strings/String+Removing.swift new file mode 100644 index 0000000..3571f5d --- /dev/null +++ b/Sources/Splash/Extensions/Strings/String+Removing.swift @@ -0,0 +1,13 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +internal extension String { + func removing(_ substring: String) -> String { + return replacingOccurrences(of: substring, with: "") + } +} diff --git a/Sources/Splash/Extensions/Strings/Substring+HasSuffix.swift b/Sources/Splash/Extensions/Strings/Substring+HasSuffix.swift new file mode 100644 index 0000000..42206b2 --- /dev/null +++ b/Sources/Splash/Extensions/Strings/Substring+HasSuffix.swift @@ -0,0 +1,16 @@ +import Foundation + +#if os(Linux) + +internal extension Substring { + func hasSuffix(_ suffix: String) -> Bool { + guard count >= suffix.count else { + return false + } + + let startIndex = index(endIndex, offsetBy: -suffix.count) + return self[startIndex...] == suffix + } +} + +#endif diff --git a/Sources/Splash/Grammar/Grammar.swift b/Sources/Splash/Grammar/Grammar.swift new file mode 100644 index 0000000..c6d6bda --- /dev/null +++ b/Sources/Splash/Grammar/Grammar.swift @@ -0,0 +1,21 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// Protocol used to define the grammar of a language to use for +/// syntax highlighting. See `SwiftGrammar` for a default implementation +/// of the Swift language grammar. +public protocol Grammar { + /// The set of characters that make up the delimiters that separates + /// tokens within the language, such as punctuation characters. + var delimiters: CharacterSet { get } + /// The rules that define the syntax of the language. When tokenizing, + /// the rules will be iterated over in sequence, and the first rule + /// that matches a given code segment will be used to determine that + /// segment's token type. + var syntaxRules: [SyntaxRule] { get } +} diff --git a/Sources/Splash/Grammar/SwiftGrammar.swift b/Sources/Splash/Grammar/SwiftGrammar.swift new file mode 100644 index 0000000..a48f512 --- /dev/null +++ b/Sources/Splash/Grammar/SwiftGrammar.swift @@ -0,0 +1,364 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// Grammar for the Swift language. Use this implementation when +/// highlighting Swift code. This is the default grammar. +public struct SwiftGrammar: Grammar { + public let delimiters: CharacterSet + public let syntaxRules: [SyntaxRule] + + public init() { + var delimiters = CharacterSet.alphanumerics.inverted + delimiters.remove("_") + delimiters.remove("\"") + delimiters.remove("#") + self.delimiters = delimiters + + syntaxRules = [ + PreprocessingRule(), + CommentRule(), + MultiLineStringRule(), + SingleLineStringRule(), + AttributeRule(), + NumberRule(), + TypeRule(), + CallRule(), + PropertyRule(), + DotAccessRule(), + KeywordRule() + ] + } +} + +private extension SwiftGrammar { + static let keywords: Set = [ + "final", "class", "struct", "enum", "protocol", + "extension", "let", "var", "func", "typealias", + "init", "guard", "if", "else", "return", "get", + "throw", "throws", "for", "in", "open", "weak", + "public", "internal", "private", "fileprivate", + "import", "mutating", "associatedtype", "case", + "switch", "static", "do", "try", "catch", "as", + "super", "self", "set", "true", "false", "nil", + "override", "where", "_", "default", "break", + "#selector", "required", "willSet", "didSet", + "lazy" + ] + + struct PreprocessingRule: SyntaxRule { + var tokenType: TokenType { return .preprocessing } + private let tokens = ["#if", "#endif", "#elseif", "#else"] + + func matches(_ segment: Segment) -> Bool { + if segment.tokens.current.isAny(of: tokens) { + return true + } + + return segment.tokens.onSameLine.contains(anyOf: tokens) + } + } + + struct CommentRule: SyntaxRule { + var tokenType: TokenType { return .comment } + + func matches(_ segment: Segment) -> Bool { + if segment.tokens.current.hasPrefix("//") { + return true + } + + if segment.tokens.onSameLine.contains(anyOf: "//", "///") { + return true + } + + if segment.tokens.current.isAny(of: "/*", "*/") { + return true + } + + return !segment.tokens.containsBalancedOccurrences(of: "/*", and: "*/") + } + } + + struct AttributeRule: SyntaxRule { + var tokenType: TokenType { return .keyword } + + func matches(_ segment: Segment) -> Bool { + return segment.tokens.current == "@" || segment.tokens.previous == "@" + } + } + + struct MultiLineStringRule: SyntaxRule { + var tokenType: TokenType { return .string } + + func matches(_ segment: Segment) -> Bool { + guard !segment.tokens.count(of: "\"\"\"").isEven else { + return false + } + + return !segment.isWithinStringInterpolation + } + } + + struct SingleLineStringRule: SyntaxRule { + var tokenType: TokenType { return .string } + + func matches(_ segment: Segment) -> Bool { + guard segment.isWithinStringLiteral else { + return false + } + + return !segment.isWithinStringInterpolation + } + } + + struct NumberRule: SyntaxRule { + var tokenType: TokenType { return .number } + + func matches(_ segment: Segment) -> Bool { + // Don't match against index-based closure arguments + guard segment.tokens.previous != "$" else { + return false + } + + // Integers can be separated using "_", so handle that + if segment.tokens.current.removing("_").isNumber { + return true + } + + // Double and floating point values that contain a "." + guard segment.tokens.current == "." else { + return false + } + + guard let previous = segment.tokens.previous, + let next = segment.tokens.next else { + return false + } + + return previous.isNumber && next.isNumber + } + } + + struct CallRule: SyntaxRule { + var tokenType: TokenType { return .call } + private let keywordsToAvoid: Set + private let controlFlowTokens = ["if", "&&", "||", "for"] + + init() { + var keywordsToAvoid = keywords + keywordsToAvoid.remove("return") + keywordsToAvoid.remove("try") + keywordsToAvoid.remove("throw") + keywordsToAvoid.remove("if") + self.keywordsToAvoid = keywordsToAvoid + } + + func matches(_ segment: Segment) -> Bool { + guard segment.tokens.current.startsWithLetter else { + return false + } + + if let previousToken = segment.tokens.previous { + guard !keywordsToAvoid.contains(previousToken) else { + return false + } + + // Don't treat enums with associated values as function calls + guard !segment.prefixedByDotAccess else { + return false + } + } + + // Handle trailing closure syntax + guard segment.trailingWhitespace == nil else { + guard segment.tokens.next.isAny(of: "{", "{}") else { + return false + } + + guard !keywords.contains(segment.tokens.current) else { + return false + } + + return !segment.tokens.onSameLine.contains(anyOf: controlFlowTokens) + } + + // Check so that this is an initializer call, not the declaration + if segment.tokens.current == "init" { + guard segment.tokens.previous == "." else { + return false + } + } + + return segment.tokens.next.isAny(of: "(", "()", "())", "(.", "({") + } + } + + struct KeywordRule: SyntaxRule { + var tokenType: TokenType { return .keyword } + + func matches(_ segment: Segment) -> Bool { + if segment.tokens.next == ":" { + guard segment.tokens.current == "default" else { + return false + } + } + + return keywords.contains(segment.tokens.current) + } + } + + struct TypeRule: SyntaxRule { + var tokenType: TokenType { return .type } + + func matches(_ segment: Segment) -> Bool { + // Types should not be highlighted when declared + if let previousToken = segment.tokens.previous { + let declarationKeywords = ["class", "struct", "enum", + "protocol", "typealias", "import"] + + guard !previousToken.isAny(of: declarationKeywords) else { + return false + } + } + + guard segment.tokens.current.isCapitalized else { + return false + } + + guard !segment.prefixedByDotAccess else { + return false + } + + // In a generic declaration, only highlight constraints + if !segment.tokens.onSameLine.contains(anyOf: "var", "let") { + if !segment.tokens.containsBalancedOccurrences(of: "<", and: ">") { + return !segment.tokens.previous.isAny(of: "<", ",") + } + } + + return true + } + } + + struct DotAccessRule: SyntaxRule { + var tokenType: TokenType { return .dotAccess } + + func matches(_ segment: Segment) -> Bool { + guard segment.tokens.previous.isAny(of: ".", "(.") else { + return false + } + + guard !segment.tokens.onSameLine.isEmpty else { + return false + } + + return segment.tokens.onSameLine.first != "import" + } + } + + struct PropertyRule: SyntaxRule { + var tokenType: TokenType { return .property } + + func matches(_ segment: Segment) -> Bool { + guard !segment.tokens.onSameLine.isEmpty else { + return false + } + + guard segment.tokens.previous.isAny(of: ".", "?.") else { + return false + } + + guard !segment.prefixedByDotAccess else { + return false + } + + if let previousToken = segment.tokens.previous { + guard !keywords.contains(previousToken) else { + return false + } + } + + return segment.tokens.onSameLine.first != "import" + } + } +} + +private extension Segment { + var isWithinStringLiteral: Bool { + let delimiter = "\"" + + if tokens.current.hasPrefix(delimiter) { + return true + } + + if tokens.current.hasSuffix(delimiter) { + return true + } + + var markerCounts = (start: 0, end: 0) + var previousToken: String? + + for token in tokens.onSameLine { + guard previousToken != "\\" else { + previousToken = token + continue + } + + if token == delimiter { + if markerCounts.start == markerCounts.end { + markerCounts.start += 1 + } else { + markerCounts.end += 1 + } + } else { + if token.hasPrefix(delimiter) { + markerCounts.start += 1 + } + + if token.hasSuffix(delimiter) { + markerCounts.end += 1 + } + } + + previousToken = token + } + + return markerCounts.start != markerCounts.end + } + + var isWithinStringInterpolation: Bool { + let delimiter = "\\(" + + if tokens.current == delimiter || tokens.previous == delimiter { + return true + } + + let components = tokens.onSameLine.split(separator: delimiter) + + guard components.count > 1 else { + return false + } + + let suffix = components.last! + var paranthesisCount = 1 + + for component in suffix { + paranthesisCount += component.numberOfOccurrences(of: "(") + paranthesisCount -= component.numberOfOccurrences(of: ")") + + guard paranthesisCount > 0 else { + return false + } + } + + return true + } + + var prefixedByDotAccess: Bool { + return tokens.previous == "(." || prefix.hasSuffix(" .") + } +} diff --git a/Sources/Splash/Output/AttributedStringOutputFormat.swift b/Sources/Splash/Output/AttributedStringOutputFormat.swift new file mode 100644 index 0000000..e28ac8a --- /dev/null +++ b/Sources/Splash/Output/AttributedStringOutputFormat.swift @@ -0,0 +1,114 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +#if os(macOS) + +import Cocoa + +/// Output format to use to generate an NSAttributedString from the +/// highlighted code. A `Theme` is used to determine what fonts and +/// colors to use for the various tokens. +public struct AttributedStringOutputFormat: OutputFormat { + public var theme: Theme + + public init(theme: Theme) { + self.theme = theme + } + + public func makeBuilder() -> Builder { + return Builder(theme: theme) + } +} + +public extension AttributedStringOutputFormat { + struct Builder: OutputBuilder { + private let theme: Theme + private lazy var font = loadFont() + private var string = NSMutableAttributedString() + + fileprivate init(theme: Theme) { + self.theme = theme + } + + public mutating func addToken(_ token: String, ofType type: TokenType) { + let color = theme.tokenColors[type] ?? Color(red: 1, green: 1, blue: 1) + string.append(token, font: font, color: color) + } + + public mutating func addPlainText(_ text: String) { + string.append(text, font: font, color: theme.plainTextColor) + } + + public mutating func addWhitespace(_ whitespace: String) { + let color = Color(red: 1, green: 1, blue: 1) + string.append(whitespace, font: font, color: color) + } + + public func build() -> NSAttributedString { + return NSAttributedString(attributedString: string) + } + + private mutating func loadFont() -> NSFont { + let size = CGFloat(theme.font.size) + + switch theme.font.resource { + case .system: + return .defaultFont(ofSize: size) + case .path(let path): + guard let font = NSFont.loaded(from: path, size: size) else { + return .defaultFont(ofSize: size) + } + + return font + } + } + } +} + +private extension NSMutableAttributedString { + func append(_ string: String, font: NSFont, color: Color) { + let color = NSColor( + red: CGFloat(color.red), + green: CGFloat(color.green), + blue: CGFloat(color.blue), + alpha: CGFloat(color.alpha) + ) + + let attributedString = NSAttributedString(string: string, attributes: [ + .foregroundColor: color, + .font: font + ]) + + append(attributedString) + } +} + +private extension NSFont { + static func loaded(from path: String, size: CGFloat) -> NSFont? { + let url = CFURLCreateWithFileSystemPath( + kCFAllocatorDefault, + path as CFString, + .cfurlposixPathStyle, + false + ) + + guard let font = url.flatMap(CGDataProvider.init).flatMap(CGFont.init) else { + return nil + } + + return CTFontCreateWithGraphicsFont(font, size, nil, nil) + } + + static func defaultFont(ofSize size: CGFloat) -> NSFont { + guard let courier = loaded(from: "/Library/Fonts/Courier New.ttf", size: size) else { + return .systemFont(ofSize: size) + } + + return courier + } +} + +#endif diff --git a/Sources/Splash/Output/HTMLOutputFormat.swift b/Sources/Splash/Output/HTMLOutputFormat.swift new file mode 100644 index 0000000..92dd83c --- /dev/null +++ b/Sources/Splash/Output/HTMLOutputFormat.swift @@ -0,0 +1,51 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// Output format to use to generate an HTML string with a semantic +/// representation of the highlighted code. Each token will be wrapped +/// in a `span` element with a CSS class matching the token's type. +/// Optionally, a `classPrefix` can be set to prefix each CSS class with +/// a given string. +public struct HTMLOutputFormat: OutputFormat { + public var classPrefix: String + + public init(classPrefix: String = "") { + self.classPrefix = classPrefix + } + + public func makeBuilder() -> Builder { + return Builder(classPrefix: classPrefix) + } +} + +public extension HTMLOutputFormat { + struct Builder: OutputBuilder { + private let classPrefix: String + private var html = "" + + fileprivate init(classPrefix: String) { + self.classPrefix = classPrefix + } + + public mutating func addToken(_ token: String, ofType type: TokenType) { + html.append("\(token)") + } + + public mutating func addPlainText(_ text: String) { + html.append(text) + } + + public mutating func addWhitespace(_ whitespace: String) { + html.append(whitespace) + } + + public func build() -> String { + return html + } + } +} diff --git a/Sources/Splash/Output/OutputBuilder.swift b/Sources/Splash/Output/OutputBuilder.swift new file mode 100644 index 0000000..85d10cb --- /dev/null +++ b/Sources/Splash/Output/OutputBuilder.swift @@ -0,0 +1,25 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// Protocol used to define a builder for a highlighted string that's +/// returned as output from `SyntaxHighlighter`. Each builder defines +/// its own output type through the `Output` associated type, and can +/// add the various tokens and other text found in the highlighted code +/// in whichever fashion it wants. +public protocol OutputBuilder { + /// The type of output that this builder produces + associatedtype Output + /// Add a token with a given type to the builder + mutating func addToken(_ token: String, ofType type: TokenType) + /// Add some plain text, without any formatting, to the builder + mutating func addPlainText(_ text: String) + /// Add some whitespace to the builder + mutating func addWhitespace(_ whitespace: String) + /// Build the final output based on the builder's current state + func build() -> Output +} diff --git a/Sources/Splash/Output/OutputFormat.swift b/Sources/Splash/Output/OutputFormat.swift new file mode 100644 index 0000000..f7ece1d --- /dev/null +++ b/Sources/Splash/Output/OutputFormat.swift @@ -0,0 +1,23 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// Protocol used to define an output format for a `SyntaxHighlighter`. +/// Default implementations of this protocol are provided for HTML and +/// NSAttributedString outputs, and custom ones can be defined by +/// conforming to this protocol and passing the implementation to a +/// syntax highlighter when it's created. +public protocol OutputFormat { + /// The type of builder that this output format uses. The builder's + /// `Output` type determines the output type of the format. + associatedtype Builder: OutputBuilder + + /// Make a new instance of the output format's builder. This will be + /// called once per syntax highlighting session. The builder is expected + /// to be a newly created, blank instance. + func makeBuilder() -> Builder +} diff --git a/Sources/Splash/Syntax/SyntaxHighlighter.swift b/Sources/Splash/Syntax/SyntaxHighlighter.swift new file mode 100644 index 0000000..2513308 --- /dev/null +++ b/Sources/Splash/Syntax/SyntaxHighlighter.swift @@ -0,0 +1,91 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// This class acts as the main API entry point for Splash. Using it, +/// any code string can be highlighted to any desired format, using +/// any language grammar. Per default, Swift's langauge grammar is used. +/// To initialize this class, pass the desired output format, such as +/// `AttributedStringOutputFormat` or `HTMLOutputFormat`, or a custom +/// implementation. One syntax highlighter may be reused multiple times. +public struct SyntaxHighlighter { + private let format: Format + private let grammar: Grammar + private let tokenizer = Tokenizer() + + /// Initialize an instance with the desired output format. + /// If no grammar is passed, then Swift's grammar is used. + public init(format: Format, grammar: Grammar = SwiftGrammar()) { + self.format = format + self.grammar = grammar + } + + /// Highlight the given code, returning output as specified by the + /// syntax highlighter's `Format`. + public func highlight(_ code: String) -> Format.Builder.Output { + var builder = format.makeBuilder() + var state: (token: String, tokenType: TokenType?)? + + func handle(_ token: String, ofType type: TokenType?, trailingWhitespace: String?) { + guard let whitespace = trailingWhitespace else { + state = (token, type) + return + } + + builder.addToken(token, ofType: type) + builder.addWhitespace(whitespace) + state = nil + } + + for segment in tokenizer.segmentsByTokenizing(code, delimiters: grammar.delimiters) { + let token = segment.tokens.current + let whitespace = segment.trailingWhitespace + + guard !token.isEmpty else { + whitespace.map { builder.addWhitespace($0) } + continue + } + + let tokenType = typeOfToken(in: segment) + + guard var currentState = state else { + handle(token, ofType: tokenType, trailingWhitespace: whitespace) + continue + } + + guard currentState.tokenType == tokenType else { + builder.addToken(currentState.token, ofType: currentState.tokenType) + handle(token, ofType: tokenType, trailingWhitespace: whitespace) + continue + } + + currentState.token.append(token) + handle(currentState.token, ofType: tokenType, trailingWhitespace: whitespace) + } + + if let lastState = state { + builder.addToken(lastState.token, ofType: lastState.tokenType) + } + + return builder.build() + } + + private func typeOfToken(in segment: Segment) -> TokenType? { + let rule = grammar.syntaxRules.first { $0.matches(segment) } + return rule?.tokenType + } +} + +private extension OutputBuilder { + mutating func addToken(_ token: String, ofType type: TokenType?) { + if let type = type { + addToken(token, ofType: type) + } else { + addPlainText(token) + } + } +} diff --git a/Sources/Splash/Syntax/SyntaxRule.swift b/Sources/Splash/Syntax/SyntaxRule.swift new file mode 100644 index 0000000..f3bb796 --- /dev/null +++ b/Sources/Splash/Syntax/SyntaxRule.swift @@ -0,0 +1,22 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// Protocol used to define syntax rules for a language `Grammar`. +/// Each rule is associated with a certain `TokenType` and, when +/// evaluated, is asked to check whether it matches a given segment +/// of code. If the rule matches then the rule's token type will be +/// associated with the given segment's current token. +public protocol SyntaxRule { + /// The token type that this syntax rule represents + var tokenType: TokenType { get } + + /// Determine if the syntax rule matches a given segment. If it's + /// a match, then the rule's `tokenType` will be associated with + /// the segment's current token. + func matches(_ segment: Segment) -> Bool +} diff --git a/Sources/Splash/Theming/Color.swift b/Sources/Splash/Theming/Color.swift new file mode 100644 index 0000000..a89a7cf --- /dev/null +++ b/Sources/Splash/Theming/Color.swift @@ -0,0 +1,25 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// A representation of a color, for use with a `Theme`. +/// Since Splash aims to be cross-platform, it uses this +/// simplified color representation rather than `NSColor` +/// or `UIColor`. +public struct Color { + public var red: Double + public var green: Double + public var blue: Double + public var alpha: Double + + public init(red: Double, green: Double, blue: Double, alpha: Double = 1) { + self.red = red + self.green = green + self.blue = blue + self.alpha = alpha + } +} diff --git a/Sources/Splash/Theming/Font.swift b/Sources/Splash/Theming/Font.swift new file mode 100644 index 0000000..6c7f994 --- /dev/null +++ b/Sources/Splash/Theming/Font.swift @@ -0,0 +1,47 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// A representation of a font, for use with a `Theme`. +/// Since Splash aims to be cross-platform, it uses this +/// simplified color representation rather than `NSFont` +/// or `UIFont`. +public struct Font { + /// The underlying resource used to load the font + public var resource: Resource + /// The size (in points) of the font + public var size: Double + + /// Initialize an instance with a path to a font file + /// on disk and a size. + public init(path: String, size: Double) { + #if os(macOS) + resource = .path((path as NSString).expandingTildeInPath) + #else + resource = .path(path) + #endif + + self.size = size + } + + /// Initialize an instance with a size, and use an + /// appropriate system font to render text. + public init(size: Double) { + resource = .system + self.size = size + } +} + +public extension Font { + /// Enum describing how to load the underlying resource for a font + enum Resource { + /// Use an appropriate system font + case system + /// Load a font file from a given file system path + case path(String) + } +} diff --git a/Sources/Splash/Theming/Theme.swift b/Sources/Splash/Theming/Theme.swift new file mode 100644 index 0000000..1bcc955 --- /dev/null +++ b/Sources/Splash/Theming/Theme.swift @@ -0,0 +1,51 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// A theme describes what fonts and colors to use when rendering +/// certain output formats - such as `NSAttributedString`. A default +/// implementation is provided that matches the "Sundell's Colors" +/// Xcode theme, by using the `sundellsColors(withFont:)` method. +public struct Theme { + /// What font to use to render the highlighted text + public var font: Font + /// What color to use for plain text (no highlighting) + public var plainTextColor: Color + /// What color to use for the text's highlighted tokens + public var tokenColors: [TokenType : Color] + + public init(font: Font, plainTextColor: Color, tokenColors: [TokenType : Color]) { + self.font = font + self.plainTextColor = plainTextColor + self.tokenColors = tokenColors + } +} + +public extension Theme { + /// Create a theme matching the "Sundell's Colors" Xcode theme + static func sundellsColors(withFont font: Font) -> Theme { + return Theme( + font: font, + plainTextColor: Color( + red: 0.66, + green: 0.74, + blue: 0.74 + ), + tokenColors: [ + .keyword : Color(red: 0.91, green: 0.2, blue: 0.54), + .string : Color(red: 0.98, green: 0.39, blue: 0.12), + .type : Color(red: 0.51, green: 0.51, blue: 0.79), + .call : Color(red: 0.2, green: 0.56, blue: 0.9), + .number : Color(red: 0.86, green: 0.44, blue: 0.34), + .comment : Color(red: 0.42, green: 0.54, blue: 0.58), + .property : Color(red: 0.13, green: 0.67, blue: 0.62), + .dotAccess : Color(red: 0.57, green: 0.7, blue: 0), + .preprocessing : Color(red: 0.71, green: 0.54, blue: 0) + ] + ) + } +} diff --git a/Sources/Splash/Tokenizing/Segment.swift b/Sources/Splash/Tokenizing/Segment.swift new file mode 100644 index 0000000..f9850fc --- /dev/null +++ b/Sources/Splash/Tokenizing/Segment.swift @@ -0,0 +1,52 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// A representation of a segment of code, used to determine the type +/// of a given token when passed to a `SyntaxRule` implementation. +public struct Segment { + /// The code that prefixes this segment, that is all the characters + /// up to where the segment's current token begins. + public var prefix: Substring + /// The collection of tokens that the segment includes + public var tokens: Tokens + /// Any whitespace that immediately follows the segment's current token + public var trailingWhitespace: String? + + internal let currentTokenIsDelimiter: Bool + internal var isLastOnLine: Bool +} + +public extension Segment { + /// A collection of tokens included in a code segment + struct Tokens { + /// The number of times a given token has been found up until this point + var counts: [String : Int] + /// The tokens that were previously found on the same line as the current one + var onSameLine: [String] + /// The token that was previously found (may be on a different line) + var previous: String? + /// The current token which is currently being evaluated + var current: String + /// Any upcoming token that will follow the current one + var next: String? + } +} + +public extension Segment.Tokens { + /// Return the number of times a given token has been found up until this point. + /// This is a convenience API over the `counts` dictionary. + func count(of token: String) -> Int { + return counts[token] ?? 0 + } + + /// Return whether an equal number of occurrences have been found of two tokens. + /// For example, this can be used to check if a token is encapsulated by parenthesis. + func containsBalancedOccurrences(of tokenA: String, and tokenB: String) -> Bool { + return count(of: tokenA) == count(of: tokenB) + } +} diff --git a/Sources/Splash/Tokenizing/TokenType.swift b/Sources/Splash/Tokenizing/TokenType.swift new file mode 100644 index 0000000..72b4e0c --- /dev/null +++ b/Sources/Splash/Tokenizing/TokenType.swift @@ -0,0 +1,29 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +/// Enum defining the possible types of tokens that can be highlighted +public enum TokenType: String, Equatable { + /// A keyword, such as `if`, `class` or `let` + case keyword + /// A token that is part of a string literal + case string + /// A reference to a type + case type + /// A call to a function or method + case call + /// A number, either interger of floating point + case number + /// A comment, either single or multi-line + case comment + /// A property being accessed, such as `object.property` + case property + /// A symbol being accessed through dot notation, such as `.myCase` + case dotAccess + /// A preprocessing symbol, such as `#if` or `@available` + case preprocessing +} diff --git a/Sources/Splash/Tokenizing/Tokenizer.swift b/Sources/Splash/Tokenizing/Tokenizer.swift new file mode 100644 index 0000000..6560d97 --- /dev/null +++ b/Sources/Splash/Tokenizing/Tokenizer.swift @@ -0,0 +1,210 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation + +internal struct Tokenizer { + func segmentsByTokenizing(_ code: String, delimiters: CharacterSet) -> AnySequence { + return AnySequence { + return Buffer(iterator: Iterator(code: code, delimiters: delimiters)) + } + } +} + +private extension Tokenizer { + struct Buffer: IteratorProtocol { + private var iterator: Iterator + private var nextSegment: Segment? + + init(iterator: Iterator) { + self.iterator = iterator + } + + mutating func next() -> Segment? { + var segment = nextSegment ?? iterator.next() + nextSegment = iterator.next() + segment?.tokens.next = nextSegment?.tokens.current + return segment + } + } + + struct Iterator: IteratorProtocol { + enum Component { + case token(String) + case delimiter(String) + case whitespace(String) + case newline(String) + } + + private let code: String + private let delimiters: CharacterSet + private var index: String.Index? + private var tokenCounts = [String : Int]() + private var lineTokens = [String]() + private var segments: (current: Segment?, previous: Segment?) + + init(code: String, delimiters: CharacterSet) { + self.code = code + self.delimiters = delimiters + segments = (nil, nil) + } + + mutating func next() -> Segment? { + let nextIndex = makeNextIndex() + + guard nextIndex != code.endIndex else { + let segment = segments.current + segments.current = nil + return segment + } + + index = nextIndex + let component = makeComponent(at: nextIndex) + + switch component { + case .token(let token), .delimiter(let token): + guard var segment = segments.current else { + segments.current = makeSegment(with: component, at: nextIndex) + return next() + } + + guard segment.trailingWhitespace == nil, + component.isDelimiter == segment.currentTokenIsDelimiter else { + return finish(segment, with: component, at: nextIndex) + } + + segment.tokens.current.append(token) + segments.current = segment + return next() + case .whitespace(let whitespace), .newline(let whitespace): + guard var segment = segments.current else { + var segment = makeSegment(with: component, at: nextIndex) + segment.trailingWhitespace = whitespace + segment.isLastOnLine = component.isNewline + segments.current = segment + return next() + } + + if let existingWhitespace = segment.trailingWhitespace { + segment.trailingWhitespace = existingWhitespace.appending(whitespace) + } else { + segment.trailingWhitespace = whitespace + } + + if component.isNewline { + segment.isLastOnLine = true + } + + segments.current = segment + return next() + } + } + + private func makeNextIndex() -> String.Index { + guard let index = index else { + return code.startIndex + } + + return code.index(after: index) + } + + private func makeComponent(at index: String.Index) -> Component { + let character = code[index] + let substring = String(character) + + if character.isWhitespace { + return .whitespace(substring) + } + + if character.isNewline { + return .newline(substring) + } + + if delimiters.contains(character) { + return .delimiter(substring) + } + + return .token(substring) + } + + private func makeSegment(with component: Component, at index: String.Index) -> Segment { + let tokens = Segment.Tokens( + counts: tokenCounts, + onSameLine: lineTokens, + previous: segments.current?.tokens.current, + current: component.token, + next: nil + ) + + return Segment( + prefix: code[.. Segment { + var count = tokenCounts[segment.tokens.current] ?? 0 + count += 1 + tokenCounts[segment.tokens.current] = count + + if segment.isLastOnLine { + lineTokens = [] + } else { + lineTokens.append(segment.tokens.current) + } + + segments.previous = segment + segments.current = makeSegment(with: component, at: index) + + return segment + } + } +} + +extension Tokenizer.Iterator.Component { + var token: String { + switch self { + case .token(let token), + .delimiter(let token): + return token + case .whitespace, .newline: + return "" + } + } + + var isDelimiter: Bool { + switch self { + case .token, .whitespace, .newline: + return false + case .delimiter: + return true + } + } + + var isNewline: Bool { + switch self { + case .token, .whitespace, .delimiter: + return false + case .newline: + return true + } + } +} + +private extension Character { + var isWhitespace: Bool { + return CharacterSet.whitespaces.contains(self) + } + + var isNewline: Bool { + return CharacterSet.newlines.contains(self) + } +} diff --git a/Sources/SplashHTMLGen/main.swift b/Sources/SplashHTMLGen/main.swift new file mode 100644 index 0000000..6a47775 --- /dev/null +++ b/Sources/SplashHTMLGen/main.swift @@ -0,0 +1,17 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import Splash + +guard CommandLine.arguments.count > 1 else { + print("⚠️ Please supply the code to generate HTML for as a string argument") + exit(1) +} + +let code = CommandLine.arguments[1] +let highlighter = SyntaxHighlighter(format: HTMLOutputFormat()) +print(highlighter.highlight(code)) diff --git a/Sources/SplashImageGen/Extensions/CGImage+WriteToURL.swift b/Sources/SplashImageGen/Extensions/CGImage+WriteToURL.swift new file mode 100644 index 0000000..580524f --- /dev/null +++ b/Sources/SplashImageGen/Extensions/CGImage+WriteToURL.swift @@ -0,0 +1,19 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +#if os(macOS) + +import Foundation + +extension CGImage { + func write(to url: URL) { + let destination = CGImageDestinationCreateWithURL(url as CFURL, kUTTypePNG, 1, nil)! + CGImageDestinationAddImage(destination, self, nil) + CGImageDestinationFinalize(destination) + } +} + +#endif diff --git a/Sources/SplashImageGen/Extensions/CommandLine+Options.swift b/Sources/SplashImageGen/Extensions/CommandLine+Options.swift new file mode 100644 index 0000000..bf879af --- /dev/null +++ b/Sources/SplashImageGen/Extensions/CommandLine+Options.swift @@ -0,0 +1,61 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +#if os(macOS) + +import Foundation +import Splash + +extension CommandLine { + struct Options { + let code: String + let outputURL: URL + let padding: CGFloat + let font: Font + } + + static func makeOptions() -> Options? { + guard arguments.count > 2 else { + return nil + } + + let defaults = UserDefaults.standard + + return Options( + code: arguments[1], + outputURL: resolveOutputURL(), + padding: CGFloat(defaults.int(forKey: "p", default: 20)), + font: resolveFont(from: defaults) + ) + } + + private static func resolveOutputURL() -> URL { + let path = arguments[2] as NSString + return URL(fileURLWithPath: path.expandingTildeInPath) + } + + private static func resolveFont(from defaults: UserDefaults) -> Font { + let size = Double(defaults.int(forKey: "s", default: 20)) + + guard let path = defaults.string(forKey: "f") else { + return Font(size: size) + } + + return Font(path: path, size: size) + } +} + +private extension UserDefaults { + func int(forKey key: String, default: CGFloat) -> CGFloat { + guard value(forKey: key) != nil else { + return `default` + } + + return CGFloat(integer(forKey: key)) + } +} + +#endif diff --git a/Sources/SplashImageGen/Extensions/NSGraphicsContext+Fill.swift b/Sources/SplashImageGen/Extensions/NSGraphicsContext+Fill.swift new file mode 100644 index 0000000..126d3f7 --- /dev/null +++ b/Sources/SplashImageGen/Extensions/NSGraphicsContext+Fill.swift @@ -0,0 +1,18 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +#if os(macOS) + +import Cocoa + +extension NSGraphicsContext { + func fill(with color: NSColor, in rect: CGRect) { + cgContext.setFillColor(color.cgColor) + cgContext.fill(rect) + } +} + +#endif diff --git a/Sources/SplashImageGen/Extensions/NSGraphicsContext+InitWithSize.swift b/Sources/SplashImageGen/Extensions/NSGraphicsContext+InitWithSize.swift new file mode 100644 index 0000000..0553dba --- /dev/null +++ b/Sources/SplashImageGen/Extensions/NSGraphicsContext+InitWithSize.swift @@ -0,0 +1,31 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +#if os(macOS) + +import Cocoa + +extension NSGraphicsContext { + convenience init(size: CGSize) { + let scale: CGFloat = 2 + + let context = CGContext( + data: nil, + width: Int(size.width * scale), + height: Int(size.height * scale), + bitsPerComponent: 8, + bytesPerRow: 0, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue + )! + + context.scaleBy(x: scale, y: scale) + + self.init(cgContext: context, flipped: false) + } +} + +#endif diff --git a/Sources/SplashImageGen/main.swift b/Sources/SplashImageGen/main.swift new file mode 100644 index 0000000..a4b7180 --- /dev/null +++ b/Sources/SplashImageGen/main.swift @@ -0,0 +1,57 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +#if os(macOS) + +import Cocoa +import Splash + +guard let options = CommandLine.makeOptions() else { + print(""" + ⚠️ Two arguments are required: + - The code to generate an image for + - The path to write the generated image to + + Optionally, the following arguments can be passed: + -p The amount of padding (in pixels) to apply around the code + -f A path to a font to use when rendering + -s The size of text to use when rendering + """) + exit(1) +} + +let theme = Theme.sundellsColors(withFont: options.font) +let outputFormat = AttributedStringOutputFormat(theme: theme) +let highlighter = SyntaxHighlighter(format: outputFormat) +let string = highlighter.highlight(options.code) +let stringSize = string.size() + +let contextRect = CGRect( + x: 0, + y: 0, + width: stringSize.width + options.padding * 2, + height: stringSize.height + options.padding * 2 +) + +let context = NSGraphicsContext(size: contextRect.size) +NSGraphicsContext.current = context + +let backgroundColor = NSColor(white: 0.12, alpha: 1) +context.fill(with: backgroundColor, in: contextRect) + +string.draw(in: CGRect( + x: options.padding, + y: options.padding, + width: stringSize.width, + height: stringSize.height +)) + +let image = context.cgContext.makeImage()! +image.write(to: options.outputURL) + +#else +print("😞 SplashImageGen currently only supports macOS") +#endif diff --git a/Sources/SplashTokenizer/TokenizerOutputFormat.swift b/Sources/SplashTokenizer/TokenizerOutputFormat.swift new file mode 100644 index 0000000..202d0ec --- /dev/null +++ b/Sources/SplashTokenizer/TokenizerOutputFormat.swift @@ -0,0 +1,36 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import Splash + +struct TokenizerOutputFormat: OutputFormat { + func makeBuilder() -> Builder { + return Builder() + } +} + +extension TokenizerOutputFormat { + struct Builder: OutputBuilder { + private var components = [String]() + + mutating func addToken(_ token: String, ofType type: TokenType) { + components.append("\(type.rawValue.capitalized) token: \(token)") + } + + mutating func addPlainText(_ text: String) { + components.append("Plain text: \(text)") + } + + mutating func addWhitespace(_ whitespace: String) { + // Ignore whitespace + } + + func build() -> String { + return components.joined(separator: "\n") + } + } +} diff --git a/Sources/SplashTokenizer/main.swift b/Sources/SplashTokenizer/main.swift new file mode 100644 index 0000000..a2604a2 --- /dev/null +++ b/Sources/SplashTokenizer/main.swift @@ -0,0 +1,17 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import Splash + +guard CommandLine.arguments.count > 1 else { + print("⚠️ Please supply the code to tokenize as a string argument") + exit(1) +} + +let code = CommandLine.arguments[1] +let highlighter = SyntaxHighlighter(format: TokenizerOutputFormat()) +print(highlighter.highlight(code)) diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift new file mode 100644 index 0000000..b78cd03 --- /dev/null +++ b/Tests/LinuxMain.swift @@ -0,0 +1,12 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import XCTest +import SplashTests + +var tests = [XCTestCaseEntry]() +tests += SplashTests.makeLinuxTests() +XCTMain(tests) diff --git a/Tests/SplashTests/Core/SyntaxHighlighterTestCase.swift b/Tests/SplashTests/Core/SyntaxHighlighterTestCase.swift new file mode 100644 index 0000000..cc45892 --- /dev/null +++ b/Tests/SplashTests/Core/SyntaxHighlighterTestCase.swift @@ -0,0 +1,35 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +/// Test case used as an abstract base class for all tests relating to +/// syntax highlighting. For all such tests, the Swift grammar is used. +class SyntaxHighlighterTestCase: XCTestCase { + private(set) var highlighter: SyntaxHighlighter! + private(set) var builder: OutputBuilderMock! + + override func setUp() { + super.setUp() + builder = OutputBuilderMock() + highlighter = SyntaxHighlighter(format: OutputFormatMock(builder: builder)) + } + + #if os(macOS) + func testHasLinuxVerificationTest() { + let concreteType = type(of: self) + + guard concreteType != SyntaxHighlighterTestCase.self else { + return + } + + XCTAssertTrue(concreteType.testNames.contains("testAllTestsRunOnLinux"), + "All test cases should have a test that verify that their tests run on Linux") + } + #endif +} diff --git a/Tests/SplashTests/Core/TestCaseVerifier.swift b/Tests/SplashTests/Core/TestCaseVerifier.swift new file mode 100644 index 0000000..ca6ee1f --- /dev/null +++ b/Tests/SplashTests/Core/TestCaseVerifier.swift @@ -0,0 +1,33 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest + +struct TestCaseVerifier { + static func verifyLinuxTests(_ tests: [(String, TestClosure)]) -> Bool { + #if os(macOS) + let testNames = Set(tests.map { $0.0 }) + + for name in Case.testNames { + guard name != "testAllTestsRunOnLinux" else { + continue + } + + guard name != "testHasLinuxVerificationTest" else { + continue + } + + guard testNames.contains(name) else { + XCTFail("Test case \(Case.self) does not include test \(name) on Linux") + return false + } + } + #endif + + return true + } +} diff --git a/Tests/SplashTests/Core/TestClosure.swift b/Tests/SplashTests/Core/TestClosure.swift new file mode 100644 index 0000000..15d4c1e --- /dev/null +++ b/Tests/SplashTests/Core/TestClosure.swift @@ -0,0 +1,10 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest + +typealias TestClosure = (T) -> () throws -> Void diff --git a/Tests/SplashTests/Core/XCTestCase+TestNames.swift b/Tests/SplashTests/Core/XCTestCase+TestNames.swift new file mode 100644 index 0000000..8c3fa33 --- /dev/null +++ b/Tests/SplashTests/Core/XCTestCase+TestNames.swift @@ -0,0 +1,21 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest + +#if os(macOS) + +extension XCTestCase { + static var testNames: [String] { + return defaultTestSuite.tests.map { test in + let components = test.name.components(separatedBy: .whitespaces) + return components[1].replacingOccurrences(of: "]", with: "") + } + } +} + +#endif diff --git a/Tests/SplashTests/Core/XCTestManifests.swift b/Tests/SplashTests/Core/XCTestManifests.swift new file mode 100644 index 0000000..159bb4e --- /dev/null +++ b/Tests/SplashTests/Core/XCTestManifests.swift @@ -0,0 +1,25 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import XCTest + +#if !os(macOS) + +public func makeLinuxTests() -> [XCTestCaseEntry] { + return [ + testCase(ClosureTests.allTests), + testCase(CommentTests.allTests), + testCase(DeclarationTests.allTests), + testCase(EnumTests.allTests), + testCase(FunctionCallTests.allTests), + testCase(LiteralTests.allTests), + testCase(OptionalTests.allTests), + testCase(PreprocessorTests.allTests), + testCase(StatementTests.allTests) + ] +} + +#endif diff --git a/Tests/SplashTests/Mocks/OutputBuilderMock.swift b/Tests/SplashTests/Mocks/OutputBuilderMock.swift new file mode 100644 index 0000000..083ebce --- /dev/null +++ b/Tests/SplashTests/Mocks/OutputBuilderMock.swift @@ -0,0 +1,36 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import Splash + +struct OutputBuilderMock: OutputBuilder { + private var components = [Component]() + + mutating func addToken(_ token: String, ofType type: TokenType) { + components.append(.token(token, type)) + } + + mutating func addPlainText(_ text: String) { + components.append(.plainText(text)) + } + + mutating func addWhitespace(_ whitespace: String) { + components.append(.whitespace(whitespace)) + } + + func build() -> [Component] { + return components + } +} + +extension OutputBuilderMock { + enum Component: Equatable { + case token(String, TokenType) + case plainText(String) + case whitespace(String) + } +} diff --git a/Tests/SplashTests/Mocks/OutputFormatMock.swift b/Tests/SplashTests/Mocks/OutputFormatMock.swift new file mode 100644 index 0000000..23a6877 --- /dev/null +++ b/Tests/SplashTests/Mocks/OutputFormatMock.swift @@ -0,0 +1,16 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import Splash + +struct OutputFormatMock: OutputFormat { + let builder: OutputBuilderMock + + func makeBuilder() -> OutputBuilderMock { + return builder + } +} diff --git a/Tests/SplashTests/Tests/ClosureTests.swift b/Tests/SplashTests/Tests/ClosureTests.swift new file mode 100644 index 0000000..637eb07 --- /dev/null +++ b/Tests/SplashTests/Tests/ClosureTests.swift @@ -0,0 +1,144 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class ClosureTests: SyntaxHighlighterTestCase { + func testTrailingClosureWithArguments() { + let components = highlighter.highlight("call() { arg in }") + + XCTAssertEqual(components, [ + .token("call", .call), + .plainText("()"), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("arg"), + .whitespace(" "), + .token("in", .keyword), + .whitespace(" "), + .plainText("}") + ]) + } + + func testTrailingClosureWithoutParanthesis() { + let components = highlighter.highlight("call { $0 }") + + XCTAssertEqual(components, [ + .token("call", .call), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("$0"), + .whitespace(" "), + .plainText("}") + ]) + } + + func testEmptyTrailingClosure() { + let components = highlighter.highlight("call {}") + + XCTAssertEqual(components, [ + .token("call", .call), + .whitespace(" "), + .plainText("{}") + ]) + } + + func testClosureArgumentWithSingleArgument() { + let components = highlighter.highlight("func add(closure: (String) -> Void)") + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("add(closure:"), + .whitespace(" "), + .plainText("("), + .token("String", .type), + .plainText(")"), + .whitespace(" "), + .plainText("->"), + .whitespace(" "), + .token("Void", .type), + .plainText(")") + ]) + } + + func testClosureArgumentWithMultipleArguments() { + let components = highlighter.highlight("func add(closure: (String, Int) -> Void)") + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("add(closure:"), + .whitespace(" "), + .plainText("("), + .token("String", .type), + .plainText(","), + .whitespace(" "), + .token("Int", .type), + .plainText(")"), + .whitespace(" "), + .plainText("->"), + .whitespace(" "), + .token("Void", .type), + .plainText(")") + ]) + } + + func testEscapingClosureArgument() { + let components = highlighter.highlight("func add(closure: @escaping () -> Void)") + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("add(closure:"), + .whitespace(" "), + .token("@escaping", .keyword), + .whitespace(" "), + .plainText("()"), + .whitespace(" "), + .plainText("->"), + .whitespace(" "), + .token("Void", .type), + .plainText(")") + ]) + } + + func testPassingClosureAsArgument() { + let components = highlighter.highlight("object.call({ $0 })") + + XCTAssertEqual(components, [ + .plainText("object."), + .token("call", .call), + .plainText("({"), + .whitespace(" "), + .plainText("$0"), + .whitespace(" "), + .plainText("})") + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension ClosureTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testTrailingClosureWithArguments", testTrailingClosureWithArguments), + ("testTrailingClosureWithoutParanthesis", testTrailingClosureWithoutParanthesis), + ("testEmptyTrailingClosure", testEmptyTrailingClosure), + ("testClosureArgumentWithSingleArgument", testClosureArgumentWithSingleArgument), + ("testClosureArgumentWithMultipleArguments", testClosureArgumentWithMultipleArguments), + ("testEscapingClosureArgument", testEscapingClosureArgument), + ("testPassingClosureAsArgument", testPassingClosureAsArgument) + ] + } +} diff --git a/Tests/SplashTests/Tests/CommentTests.swift b/Tests/SplashTests/Tests/CommentTests.swift new file mode 100644 index 0000000..1b899dd --- /dev/null +++ b/Tests/SplashTests/Tests/CommentTests.swift @@ -0,0 +1,74 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class CommentTests: SyntaxHighlighterTestCase { + func testSingleLineComment() { + let components = highlighter.highlight("call() // Hello call() var \"string\"\ncall()") + + XCTAssertEqual(components, [ + .token("call", .call), + .plainText("()"), + .whitespace(" "), + .token("//", .comment), + .whitespace(" "), + .token("Hello", .comment), + .whitespace(" "), + .token("call()", .comment), + .whitespace(" "), + .token("var", .comment), + .whitespace(" "), + .token("\"string\"", .comment), + .whitespace("\n"), + .token("call", .call), + .plainText("()") + ]) + } + + func testMultiLineComment() { + let components = highlighter.highlight(""" + struct Foo {} + /* Comment + Hello! + */ call() + """) + + XCTAssertEqual(components, [ + .token("struct", .keyword), + .whitespace(" "), + .plainText("Foo"), + .whitespace(" "), + .plainText("{}"), + .whitespace("\n"), + .token("/*", .comment), + .whitespace(" "), + .token("Comment", .comment), + .whitespace("\n "), + .token("Hello!", .comment), + .whitespace("\n"), + .token("*/", .comment), + .whitespace(" "), + .token("call", .call), + .plainText("()") + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension CommentTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testSingleLineComment", testSingleLineComment), + ("testMultiLineComment", testMultiLineComment) + ] + } +} diff --git a/Tests/SplashTests/Tests/DeclarationTests.swift b/Tests/SplashTests/Tests/DeclarationTests.swift new file mode 100644 index 0000000..63a5b23 --- /dev/null +++ b/Tests/SplashTests/Tests/DeclarationTests.swift @@ -0,0 +1,455 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class DeclarationTests: SyntaxHighlighterTestCase { + func testFunctionDeclaration() { + let components = highlighter.highlight("func hello(world: String) -> Int") + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("hello(world:"), + .whitespace(" "), + .token("String", .type), + .plainText(")"), + .whitespace(" "), + .plainText("->"), + .whitespace(" "), + .token("Int", .type) + ]) + } + + func testRequiredFunctionDeclaration() { + let components = highlighter.highlight("required func hello()") + + XCTAssertEqual(components, [ + .token("required", .keyword), + .whitespace(" "), + .token("func", .keyword), + .whitespace(" "), + .plainText("hello()") + ]) + } + + func testPublicFunctionDeclarationWithDocumentationEndingWithDot() { + let components = highlighter.highlight(""" + /// Documentation. + public func hello() + """) + + XCTAssertEqual(components, [ + .token("///", .comment), + .whitespace(" "), + .token("Documentation.", .comment), + .whitespace("\n"), + .token("public", .keyword), + .whitespace(" "), + .token("func", .keyword), + .whitespace(" "), + .plainText("hello()") + ]) + } + + func testFunctionDeclarationWithEmptyExternalLabel() { + let components = highlighter.highlight("func a(_ b: B)") + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("a("), + .token("_", .keyword), + .whitespace(" "), + .plainText("b:"), + .whitespace(" "), + .token("B", .type), + .plainText(")") + ]) + } + + func testGenericFunctionDeclarationWithoutConstraints() { + let components = highlighter.highlight("func hello(a: A, b: B)") + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("hello(a:"), + .whitespace(" "), + .token("A", .type), + .plainText(","), + .whitespace(" "), + .plainText("b:"), + .whitespace(" "), + .token("B", .type), + .plainText(")") + ]) + } + + func testGenericFunctionDeclarationWithSingleConstraint() { + let components = highlighter.highlight("func hello(t: T)") + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("hello(t:"), + .whitespace(" "), + .token("T", .type), + .plainText(")") + ]) + } + + func testGenericFunctionDeclarationWithMultipleConstraints() { + let components = highlighter.highlight("func hello(a: A, b: B)") + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("hello(a:"), + .whitespace(" "), + .token("A", .type), + .plainText(","), + .whitespace(" "), + .plainText("b:"), + .whitespace(" "), + .token("B", .type), + .plainText(")") + ]) + } + + func testGenericStructDeclaration() { + let components = highlighter.highlight("struct MyStruct {}") + + XCTAssertEqual(components, [ + .token("struct", .keyword), + .whitespace(" "), + .plainText("MyStruct"), + .whitespace(" "), + .plainText("{}") + ]) + } + + func testClassDeclaration() { + let components = highlighter.highlight(""" + class Hello { + var required: String + var optional: Int? + } + """) + + XCTAssertEqual(components, [ + .token("class", .keyword), + .whitespace(" "), + .plainText("Hello"), + .whitespace(" "), + .plainText("{"), + .whitespace("\n "), + .token("var", .keyword), + .whitespace(" "), + .plainText("required:"), + .whitespace(" "), + .token("String", .type), + .whitespace("\n "), + .token("var", .keyword), + .whitespace(" "), + .plainText("optional:"), + .whitespace(" "), + .token("Int", .type), + .plainText("?"), + .whitespace("\n"), + .plainText("}") + ]) + } + + func testCompactClassDeclarationWithInitializer() { + let components = highlighter.highlight("class Foo { init(hello: Int) {} }") + + XCTAssertEqual(components, [ + .token("class", .keyword), + .whitespace(" "), + .plainText("Foo"), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .token("init", .keyword), + .plainText("(hello:"), + .whitespace(" "), + .token("Int", .type), + .plainText(")"), + .whitespace(" "), + .plainText("{}"), + .whitespace(" "), + .plainText("}") + ]) + } + + func testSubclassDeclaration() { + let components = highlighter.highlight("class ViewController: UIViewController { }") + + XCTAssertEqual(components, [ + .token("class", .keyword), + .whitespace(" "), + .plainText("ViewController:"), + .whitespace(" "), + .token("UIViewController", .type), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("}") + ]) + } + + func testProtocolDeclaration() { + let components = highlighter.highlight(""" + protocol Hello { + var property: String { get set } + func method() + } + """) + + XCTAssertEqual(components, [ + .token("protocol", .keyword), + .whitespace(" "), + .plainText("Hello"), + .whitespace(" "), + .plainText("{"), + .whitespace("\n "), + .token("var", .keyword), + .whitespace(" "), + .plainText("property:"), + .whitespace(" "), + .token("String", .type), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .token("get", .keyword), + .whitespace(" "), + .token("set", .keyword), + .whitespace(" "), + .plainText("}"), + .whitespace("\n "), + .token("func", .keyword), + .whitespace(" "), + .plainText("method()"), + .whitespace("\n"), + .plainText("}") + ]) + } + + func testExtensionDeclaration() { + let components = highlighter.highlight("extension UIViewController { }") + + XCTAssertEqual(components, [ + .token("extension", .keyword), + .whitespace(" "), + .token("UIViewController", .type), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("}") + ]) + } + + func testExtensionDeclarationWithConstraint() { + let components = highlighter.highlight("extension Hello where Foo == String, Bar: Numeric { }") + + XCTAssertEqual(components, [ + .token("extension", .keyword), + .whitespace(" "), + .token("Hello", .type), + .whitespace(" "), + .token("where", .keyword), + .whitespace(" "), + .token("Foo", .type), + .whitespace(" "), + .plainText("=="), + .whitespace(" "), + .token("String", .type), + .plainText(","), + .whitespace(" "), + .token("Bar", .type), + .plainText(":"), + .whitespace(" "), + .token("Numeric", .type), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("}") + ]) + } + + func testLazyPropertyDeclaration() { + let components = highlighter.highlight(""" + struct Hello { + lazy var property = 0 + } + """) + + XCTAssertEqual(components, [ + .token("struct", .keyword), + .whitespace(" "), + .plainText("Hello"), + .whitespace(" "), + .plainText("{"), + .whitespace("\n "), + .token("lazy", .keyword), + .whitespace(" "), + .token("var", .keyword), + .whitespace(" "), + .plainText("property"), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("0", .number), + .whitespace("\n"), + .plainText("}") + ]) + } + + func testGenericPropertyDeclaration() { + let components = highlighter.highlight("class Hello { var array: Array = [] }") + + XCTAssertEqual(components, [ + .token("class", .keyword), + .whitespace(" "), + .plainText("Hello"), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .token("var", .keyword), + .whitespace(" "), + .plainText("array:"), + .whitespace(" "), + .token("Array", .type), + .plainText("<"), + .token("String", .type), + .plainText(">"), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .plainText("[]"), + .whitespace(" "), + .plainText("}") + ]) + } + + func testPropertyDeclarationWithWillSet() { + let components = highlighter.highlight(""" + struct Hello { + var property: Int { willSet { } } + } + """) + + XCTAssertEqual(components, [ + .token("struct", .keyword), + .whitespace(" "), + .plainText("Hello"), + .whitespace(" "), + .plainText("{"), + .whitespace("\n "), + .token("var", .keyword), + .whitespace(" "), + .plainText("property:"), + .whitespace(" "), + .token("Int", .type), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .token("willSet", .keyword), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("}"), + .whitespace(" "), + .plainText("}"), + .whitespace("\n"), + .plainText("}") + ]) + } + + func testPropertyDeclarationWithDidSet() { + let components = highlighter.highlight(""" + struct Hello { + var property: Int { didSet { } } + } + """) + + XCTAssertEqual(components, [ + .token("struct", .keyword), + .whitespace(" "), + .plainText("Hello"), + .whitespace(" "), + .plainText("{"), + .whitespace("\n "), + .token("var", .keyword), + .whitespace(" "), + .plainText("property:"), + .whitespace(" "), + .token("Int", .type), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .token("didSet", .keyword), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("}"), + .whitespace(" "), + .plainText("}"), + .whitespace("\n"), + .plainText("}") + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension DeclarationTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testFunctionDeclaration", testFunctionDeclaration), + ("testRequiredFunctionDeclaration", testRequiredFunctionDeclaration), + ("testPublicFunctionDeclarationWithDocumentationEndingWithDot", testPublicFunctionDeclarationWithDocumentationEndingWithDot), + ("testFunctionDeclarationWithEmptyExternalLabel", testFunctionDeclarationWithEmptyExternalLabel), + ("testGenericFunctionDeclarationWithoutConstraints", testGenericFunctionDeclarationWithoutConstraints), + ("testGenericFunctionDeclarationWithSingleConstraint", testGenericFunctionDeclarationWithSingleConstraint), + ("testGenericFunctionDeclarationWithMultipleConstraints", testGenericFunctionDeclarationWithMultipleConstraints), + ("testGenericStructDeclaration", testGenericStructDeclaration), + ("testClassDeclaration", testClassDeclaration), + ("testCompactClassDeclarationWithInitializer", testCompactClassDeclarationWithInitializer), + ("testSubclassDeclaration", testSubclassDeclaration), + ("testProtocolDeclaration", testProtocolDeclaration), + ("testExtensionDeclaration", testExtensionDeclaration), + ("testExtensionDeclarationWithConstraint", testExtensionDeclarationWithConstraint), + ("testLazyPropertyDeclaration", testLazyPropertyDeclaration), + ("testGenericPropertyDeclaration", testGenericPropertyDeclaration), + ("testPropertyDeclarationWithWillSet", testPropertyDeclarationWithWillSet), + ("testPropertyDeclarationWithDidSet", testPropertyDeclarationWithDidSet) + ] + } +} diff --git a/Tests/SplashTests/Tests/EnumTests.swift b/Tests/SplashTests/Tests/EnumTests.swift new file mode 100644 index 0000000..be44b62 --- /dev/null +++ b/Tests/SplashTests/Tests/EnumTests.swift @@ -0,0 +1,64 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class EnumTests: SyntaxHighlighterTestCase { + func testEnumDotSyntaxInAssignment() { + let components = highlighter.highlight("let value: Enum = .aCase") + + XCTAssertEqual(components, [ + .token("let", .keyword), + .whitespace(" "), + .plainText("value:"), + .whitespace(" "), + .token("Enum", .type), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .plainText("."), + .token("aCase", .dotAccess) + ]) + } + + func testEnumDotSyntaxAsArgument() { + let components = highlighter.highlight("call(.aCase)") + + XCTAssertEqual(components, [ + .token("call", .call), + .plainText("(."), + .token("aCase", .dotAccess), + .plainText(")") + ]) + } + + func testEnumDotSyntaxWithAssociatedValue() { + let components = highlighter.highlight("call(.error(error))") + + XCTAssertEqual(components, [ + .token("call", .call), + .plainText("(."), + .token("error", .dotAccess), + .plainText("(error))") + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension EnumTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testEnumDotSyntaxInAssignment", testEnumDotSyntaxInAssignment), + ("testEnumDotSyntaxAsArgument", testEnumDotSyntaxAsArgument), + ("testEnumDotSyntaxWithAssociatedValue", testEnumDotSyntaxWithAssociatedValue) + ] + } +} diff --git a/Tests/SplashTests/Tests/FunctionCallTests.swift b/Tests/SplashTests/Tests/FunctionCallTests.swift new file mode 100644 index 0000000..44c5609 --- /dev/null +++ b/Tests/SplashTests/Tests/FunctionCallTests.swift @@ -0,0 +1,71 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class FunctionCallTests: SyntaxHighlighterTestCase { + func testFunctionCallWithIntegers() { + let components = highlighter.highlight("add(1, 2)") + + XCTAssertEqual(components, [ + .token("add", .call), + .plainText("("), + .token("1", .number), + .plainText(","), + .whitespace(" "), + .token("2", .number), + .plainText(")") + ]) + } + + func testImplicitInitializerCall() { + let components = highlighter.highlight("let string = String()") + + XCTAssertEqual(components, [ + .token("let", .keyword), + .whitespace(" "), + .plainText("string"), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("String", .type), + .plainText("()") + ]) + } + + func testExplicitInitializerCall() { + let components = highlighter.highlight("let string = String.init()") + + XCTAssertEqual(components, [ + .token("let", .keyword), + .whitespace(" "), + .plainText("string"), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("String", .type), + .plainText("."), + .token("init", .call), + .plainText("()") + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension FunctionCallTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testFunctionCallWithIntegers", testFunctionCallWithIntegers), + ("testImplicitInitializerCall", testImplicitInitializerCall), + ("testExplicitInitializerCall", testExplicitInitializerCall) + ] + } +} diff --git a/Tests/SplashTests/Tests/LiteralTests.swift b/Tests/SplashTests/Tests/LiteralTests.swift new file mode 100644 index 0000000..1478fee --- /dev/null +++ b/Tests/SplashTests/Tests/LiteralTests.swift @@ -0,0 +1,149 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class LiteralTests: SyntaxHighlighterTestCase { + func testStringLiteral() { + let components = highlighter.highlight("let string = \"Hello, world!\"") + + XCTAssertEqual(components, [ + .token("let", .keyword), + .whitespace(" "), + .plainText("string"), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("\"Hello,", .string), + .whitespace(" "), + .token("world!\"", .string) + ]) + } + + func testStringLiteralPassedToFunction() { + let components = highlighter.highlight("call(\"Hello, world!\")") + + XCTAssertEqual(components, [ + .token("call", .call), + .plainText("("), + .token("\"Hello,", .string), + .whitespace(" "), + .token("world!\"", .string), + .plainText(")") + ]) + } + + func testStringLiteralWithEscapedQuote() { + let components = highlighter.highlight("\"Hello \\\" World\"; call()") + + XCTAssertEqual(components, [ + .token("\"Hello", .string), + .whitespace(" "), + .token("\\\"", .string), + .whitespace(" "), + .token("World\"", .string), + .plainText(";"), + .whitespace(" "), + .token("call", .call), + .plainText("()") + ]) + } + + func testStringLiteralWithAttribute() { + let components = highlighter.highlight("\"@escaping\"") + XCTAssertEqual(components, [.token("\"@escaping\"", .string)]) + } + + func testStringLiteralInterpolation() { + let components = highlighter.highlight("\"Hello \\(variable) world \\(call())\"") + + XCTAssertEqual(components, [ + .token("\"Hello", .string), + .whitespace(" "), + .plainText("\\(variable)"), + .whitespace(" "), + .token("world", .string), + .whitespace(" "), + .plainText("\\("), + .token("call", .call), + .plainText("())"), + .token("\"", .string) + ]) + } + + func testMultiLineStringLiteral() { + let components = highlighter.highlight(""" + let string = \"\"\" + Hello \\(variable) + \"\"\" + """) + + XCTAssertEqual(components, [ + .token("let", .keyword), + .whitespace(" "), + .plainText("string"), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("\"\"\"", .string), + .whitespace("\n"), + .token("Hello", .string), + .whitespace(" "), + .plainText("\\(variable)"), + .whitespace("\n"), + .token("\"\"\"", .string) + ]) + } + + func testDoubleLiteral() { + let components = highlighter.highlight("let double = 1.13") + + XCTAssertEqual(components, [ + .token("let", .keyword), + .whitespace(" "), + .plainText("double"), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("1.13", .number) + ]) + } + + func testIntegerLiteralWithSeparators() { + let components = highlighter.highlight("let int = 1_000_000") + + XCTAssertEqual(components, [ + .token("let", .keyword), + .whitespace(" "), + .plainText("int"), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("1_000_000", .number) + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension LiteralTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testStringLiteral", testStringLiteral), + ("testStringLiteralPassedToFunction", testStringLiteralPassedToFunction), + ("testStringLiteralWithEscapedQuote", testStringLiteralWithEscapedQuote), + ("testStringLiteralWithAttribute", testStringLiteralWithAttribute), + ("testStringLiteralInterpolation", testStringLiteralInterpolation), + ("testMultiLineStringLiteral", testMultiLineStringLiteral), + ("testDoubleLiteral", testDoubleLiteral), + ("testIntegerLiteralWithSeparators", testIntegerLiteralWithSeparators) + ] + } +} diff --git a/Tests/SplashTests/Tests/OptionalTests.swift b/Tests/SplashTests/Tests/OptionalTests.swift new file mode 100644 index 0000000..32a62ed --- /dev/null +++ b/Tests/SplashTests/Tests/OptionalTests.swift @@ -0,0 +1,59 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class OptionalTests: SyntaxHighlighterTestCase { + func testAssigningPropertyWithOptionalChaining() { + let components = highlighter.highlight("object?.property = true") + + XCTAssertEqual(components, [ + .plainText("object?."), + .token("property", .property), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("true", .keyword) + ]) + } + + func testReadingPropertyWithOptionalChaining() { + let components = highlighter.highlight("call(object?.property)") + + XCTAssertEqual(components, [ + .token("call", .call), + .plainText("(object?."), + .token("property", .property), + .plainText(")") + ]) + } + + func testCallingMethodwithOptionalChaining() { + let components = highlighter.highlight("object?.call()") + + XCTAssertEqual(components, [ + .plainText("object?."), + .token("call", .call), + .plainText("()") + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension OptionalTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testAssigningPropertyWithOptionalChaining", testAssigningPropertyWithOptionalChaining), + ("testReadingPropertyWithOptionalChaining", testReadingPropertyWithOptionalChaining), + ("testCallingMethodwithOptionalChaining", testCallingMethodwithOptionalChaining) + ] + } +} diff --git a/Tests/SplashTests/Tests/PreprocessorTests.swift b/Tests/SplashTests/Tests/PreprocessorTests.swift new file mode 100644 index 0000000..6bd920c --- /dev/null +++ b/Tests/SplashTests/Tests/PreprocessorTests.swift @@ -0,0 +1,78 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class PreprocessorTests: SyntaxHighlighterTestCase { + func testPreprocessing() { + let components = highlighter.highlight(""" + #if os(iOS) + call() + #endif + """) + + XCTAssertEqual(components, [ + .token("#if", .preprocessing), + .whitespace(" "), + .token("os(iOS)", .preprocessing), + .whitespace("\n"), + .token("call", .call), + .plainText("()"), + .whitespace("\n"), + .token("#endif", .preprocessing) + ]) + } + + func testSelector() { + let components = highlighter.highlight("addObserver(self, selector: #selector(function(_:)))") + + XCTAssertEqual(components, [ + .token("addObserver", .call), + .plainText("("), + .token("self", .keyword), + .plainText(","), + .whitespace(" "), + .plainText("selector:"), + .whitespace(" "), + .token("#selector", .keyword), + .plainText("("), + .token("function", .call), + .plainText("("), + .token("_", .keyword), + .plainText(":)))") + ]) + } + + func testFunctionAttribute() { + let components = highlighter.highlight("@NSApplicationMain class AppDelegate {}") + + XCTAssertEqual(components, [ + .token("@NSApplicationMain", .keyword), + .whitespace(" "), + .token("class", .keyword), + .whitespace(" "), + .plainText("AppDelegate"), + .whitespace(" "), + .plainText("{}") + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension PreprocessorTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testPreprocessing", testPreprocessing), + ("testSelector", testSelector), + ("testFunctionAttribute", testFunctionAttribute) + ] + } +} diff --git a/Tests/SplashTests/Tests/StatementTests.swift b/Tests/SplashTests/Tests/StatementTests.swift new file mode 100644 index 0000000..514c1d2 --- /dev/null +++ b/Tests/SplashTests/Tests/StatementTests.swift @@ -0,0 +1,174 @@ +/** + * Splash + * Copyright (c) John Sundell 2018 + * MIT license - see LICENSE.md + */ + +import Foundation +import XCTest +import Splash + +final class StatementTests: SyntaxHighlighterTestCase { + func testImportStatement() { + let components = highlighter.highlight("import UIKit") + + XCTAssertEqual(components, [ + .token("import", .keyword), + .whitespace(" "), + .plainText("UIKit") + ]) + } + + func testImportStatementWithSubmodule() { + let components = highlighter.highlight("import os.log") + + XCTAssertEqual(components, [ + .token("import", .keyword), + .whitespace(" "), + .plainText("os.log") + ]) + } + + func testChainedIfElseStatements() { + let components = highlighter.highlight("if condition { } else if call() { } else { \"string\" }") + + XCTAssertEqual(components, [ + .token("if", .keyword), + .whitespace(" "), + .plainText("condition"), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("}"), + .whitespace(" "), + .token("else", .keyword), + .whitespace(" "), + .token("if", .keyword), + .whitespace(" "), + .token("call", .call), + .plainText("()"), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("}"), + .whitespace(" "), + .token("else", .keyword), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .token("\"string\"", .string), + .whitespace(" "), + .plainText("}") + ]) + } + + func testSwitchStatement() { + let components = highlighter.highlight(""" + switch variable { + case .one: break + case .two: callA() + default: + callB() + } + """) + + XCTAssertEqual(components, [ + .token("switch", .keyword), + .whitespace(" "), + .plainText("variable"), + .whitespace(" "), + .plainText("{"), + .whitespace("\n"), + .token("case", .keyword), + .whitespace(" "), + .plainText("."), + .token("one", .dotAccess), + .plainText(":"), + .whitespace(" "), + .token("break", .keyword), + .whitespace("\n"), + .token("case", .keyword), + .whitespace(" "), + .plainText("."), + .token("two", .dotAccess), + .plainText(":"), + .whitespace(" "), + .token("callA", .call), + .plainText("()"), + .whitespace("\n"), + .token("default", .keyword), + .plainText(":"), + .whitespace("\n "), + .token("callB", .call), + .plainText("()"), + .whitespace("\n"), + .plainText("}") + ]) + } + + func testSwitchStatementWithAssociatedValues() { + let components = highlighter.highlight(""" + switch value { + case .one(let a): break + } + """) + + XCTAssertEqual(components, [ + .token("switch", .keyword), + .whitespace(" "), + .plainText("value"), + .whitespace(" "), + .plainText("{"), + .whitespace("\n"), + .token("case", .keyword), + .whitespace(" "), + .plainText("."), + .token("one", .dotAccess), + .plainText("("), + .token("let", .keyword), + .whitespace(" "), + .plainText("a):"), + .whitespace(" "), + .token("break", .keyword), + .whitespace("\n"), + .plainText("}") + ]) + } + + func testForStatementWithStaticProperty() { + let components = highlighter.highlight("for value in Enum.allCases { }") + + XCTAssertEqual(components, [ + .token("for", .keyword), + .whitespace(" "), + .plainText("value"), + .whitespace(" "), + .token("in", .keyword), + .whitespace(" "), + .token("Enum", .type), + .plainText("."), + .token("allCases", .property), + .whitespace(" "), + .plainText("{"), + .whitespace(" "), + .plainText("}") + ]) + } + + func testAllTestsRunOnLinux() { + XCTAssertTrue(TestCaseVerifier.verifyLinuxTests((type(of: self)).allTests)) + } +} + +extension StatementTests { + static var allTests: [(String, TestClosure)] { + return [ + ("testImportStatement", testImportStatement), + ("testImportStatementWithSubmodule", testImportStatementWithSubmodule), + ("testChainedIfElseStatements", testChainedIfElseStatements), + ("testSwitchStatement", testSwitchStatement), + ("testSwitchStatementWithAssociatedValues", testSwitchStatementWithAssociatedValues), + ("testForStatementWithStaticProperty", testForStatementWithStaticProperty) + ] + } +}