From b9702afbd46d676fbe5d4e141703a389a9b81457 Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Mon, 13 Aug 2018 20:00:27 +0100 Subject: [PATCH] fixed indetnations --- Sources/ForTag.swift | 6 ++-- Sources/Lexer.swift | 3 +- Sources/Node.swift | 4 +-- Sources/Parser.swift | 21 ++++++------ Tests/StencilTests/ForNodeSpec.swift | 50 ++++++++++++++-------------- Tests/StencilTests/LexerSpec.swift | 2 +- 6 files changed, 42 insertions(+), 44 deletions(-) diff --git a/Sources/ForTag.swift b/Sources/ForTag.swift index d5bfee7..3432b95 100644 --- a/Sources/ForTag.swift +++ b/Sources/ForTag.swift @@ -31,8 +31,8 @@ class ForNode : NodeType { let resolvable = try parser.compileResolvable(components[3], containedIn: token) let `where` = hasToken("where", at: 4) - ? try parseExpression(components: Array(components.suffix(from: 5)), tokenParser: parser, token: token) - : nil + ? try parseExpression(components: Array(components.suffix(from: 5)), tokenParser: parser, token: token) + : nil let forNodes = try parser.parse(until(["endfor", "empty"])) @@ -145,7 +145,7 @@ class ForNode : NodeType { try renderNodes(nodes, context) } } - }.joined(separator: "") + }.joined(separator: "") } return try context.push { diff --git a/Sources/Lexer.swift b/Sources/Lexer.swift index 4c8f8a8..ec833d5 100644 --- a/Sources/Lexer.swift +++ b/Sources/Lexer.swift @@ -189,8 +189,7 @@ extension String { lineNumber += 1 lineContent = line if let rangeOfLine = self.range(of: line), rangeOfLine.contains(range.lowerBound) { - offset = distance(from: rangeOfLine.lowerBound, to: - range.lowerBound) + offset = distance(from: rangeOfLine.lowerBound, to: range.lowerBound) break } } diff --git a/Sources/Node.swift b/Sources/Node.swift index c0e644c..c4bb77a 100644 --- a/Sources/Node.swift +++ b/Sources/Node.swift @@ -11,13 +11,13 @@ public protocol NodeType { /// Render the collection of nodes in the given context public func renderNodes(_ nodes:[NodeType], _ context:Context) throws -> String { - return try nodes.map({ + return try nodes.map { do { return try $0.render(context) } catch { throw error.withToken($0.token) } - }).joined(separator: "") + }.joined(separator: "") } public class SimpleNode : NodeType { diff --git a/Sources/Parser.swift b/Sources/Parser.swift index fd984a4..81d9335 100644 --- a/Sources/Parser.swift +++ b/Sources/Parser.swift @@ -120,19 +120,18 @@ public class TokenParser { do { return try FilterExpression(token: filterToken, parser: self) } catch { - if var error = error as? TemplateSyntaxError, error.token == nil { - // find offset of filter in the containing token so that only filter is highligted, not the whole token - if let filterTokenRange = containingToken.contents.range(of: filterToken) { - var rangeLine = containingToken.sourceMap.line - rangeLine.offset += containingToken.contents.distance(from: containingToken.contents.startIndex, to: filterTokenRange.lowerBound) - error.token = .variable(value: filterToken, at: SourceMap(filename: containingToken.sourceMap.filename, line: rangeLine)) - } else { - error.token = containingToken - } - throw error - } else { + guard var syntaxError = error as? TemplateSyntaxError, syntaxError.token == nil else { throw error } + // find offset of filter in the containing token so that only filter is highligted, not the whole token + if let filterTokenRange = containingToken.contents.range(of: filterToken) { + var rangeLine = containingToken.sourceMap.line + rangeLine.offset += containingToken.contents.distance(from: containingToken.contents.startIndex, to: filterTokenRange.lowerBound) + syntaxError.token = .variable(value: filterToken, at: SourceMap(filename: containingToken.sourceMap.filename, line: rangeLine)) + } else { + syntaxError.token = containingToken + } + throw syntaxError } } diff --git a/Tests/StencilTests/ForNodeSpec.swift b/Tests/StencilTests/ForNodeSpec.swift index 4fb1a04..ddb7692 100644 --- a/Tests/StencilTests/ForNodeSpec.swift +++ b/Tests/StencilTests/ForNodeSpec.swift @@ -13,7 +13,7 @@ func testForNode() { "two": "II", ], "tuples": [(1, 2, 3), (4, 5, 6)] - ]) + ]) $0.it("renders the given nodes for each item") { let nodes: [NodeType] = [VariableNode(variable: "item")] @@ -31,7 +31,7 @@ func testForNode() { $0.it("renders a context variable of type Array") { let any_context = Context(dictionary: [ "items": ([1, 2, 3] as [Any]) - ]) + ]) let nodes: [NodeType] = [VariableNode(variable: "item")] let node = ForNode(resolvable: Variable("items"), loopVariables: ["item"], nodes: nodes, emptyNodes: []) @@ -54,17 +54,17 @@ func testForNode() { try expect(try node.render(context)) == "123" } -#if os(OSX) + #if os(OSX) $0.it("renders a context variable of type NSArray") { let nsarray_context = Context(dictionary: [ "items": NSArray(array: [1, 2, 3]) - ]) + ]) let nodes: [NodeType] = [VariableNode(variable: "item")] let node = ForNode(resolvable: Variable("items"), loopVariables: ["item"], nodes: nodes, emptyNodes: []) try expect(try node.render(nsarray_context)) == "123" } -#endif + #endif $0.it("renders the given nodes while providing if the item is first in the context") { let nodes: [NodeType] = [VariableNode(variable: "item"), VariableNode(variable: "forloop.first")] @@ -97,31 +97,31 @@ func testForNode() { } $0.it("renders the given nodes while filtering items using where expression") { - let nodes: [NodeType] = [VariableNode(variable: "item"), VariableNode(variable: "forloop.counter")] + let nodes: [NodeType] = [VariableNode(variable: "item"), VariableNode(variable: "forloop.counter")] let `where` = try parseExpression(components: ["item", ">", "1"], tokenParser: TokenParser(tokens: [], environment: Environment()), token: .text(value: "", at: .unknown)) - let node = ForNode(resolvable: Variable("items"), loopVariables: ["item"], nodes: nodes, emptyNodes: [], where: `where`) - try expect(try node.render(context)) == "2132" + let node = ForNode(resolvable: Variable("items"), loopVariables: ["item"], nodes: nodes, emptyNodes: [], where: `where`) + try expect(try node.render(context)) == "2132" } $0.it("renders the given empty nodes when all items filtered out with where expression") { - let nodes: [NodeType] = [VariableNode(variable: "item")] - let emptyNodes: [NodeType] = [TextNode(text: "empty")] + let nodes: [NodeType] = [VariableNode(variable: "item")] + let emptyNodes: [NodeType] = [TextNode(text: "empty")] let `where` = try parseExpression(components: ["item", "==", "0"], tokenParser: TokenParser(tokens: [], environment: Environment()), token: .text(value: "", at: .unknown)) - let node = ForNode(resolvable: Variable("emptyItems"), loopVariables: ["item"], nodes: nodes, emptyNodes: emptyNodes, where: `where`) - try expect(try node.render(context)) == "empty" + let node = ForNode(resolvable: Variable("emptyItems"), loopVariables: ["item"], nodes: nodes, emptyNodes: emptyNodes, where: `where`) + try expect(try node.render(context)) == "empty" } $0.it("can render a filter with spaces") { let templateString = "{% for article in ars | default: a, b , articles %}" + "- {{ article.title }} by {{ article.author }}.\n" + - "{% endfor %}\n" + "{% endfor %}\n" let context = Context(dictionary: [ "articles": [ Article(title: "Migrating from OCUnit to XCTest", author: "Kyle Fuller"), Article(title: "Memory Management with ARC", author: "Kyle Fuller"), ] - ]) + ]) let template = Template(templateString: templateString) let result = try template.render(context) @@ -129,7 +129,7 @@ func testForNode() { let fixture = "" + "- Migrating from OCUnit to XCTest by Kyle Fuller.\n" + "- Memory Management with ARC by Kyle Fuller.\n" + - "\n" + "\n" try expect(result) == fixture } @@ -184,7 +184,7 @@ func testForNode() { $0.it("can iterate over dictionary") { let templateString = "{% for key, value in dict %}" + "{{ key }}: {{ value }}," + - "{% endfor %}" + "{% endfor %}" let template = Template(templateString: templateString) let result = try template.render(context) @@ -197,7 +197,7 @@ func testForNode() { let nodes: [NodeType] = [ VariableNode(variable: "key"), TextNode(text: ","), - ] + ] let emptyNodes: [NodeType] = [TextNode(text: "empty")] let node = ForNode(resolvable: Variable("dict"), loopVariables: ["key"], nodes: nodes, emptyNodes: emptyNodes, where: nil) let result = try node.render(context) @@ -212,7 +212,7 @@ func testForNode() { TextNode(text: "="), VariableNode(variable: "value"), TextNode(text: ","), - ] + ] let emptyNodes: [NodeType] = [TextNode(text: "empty")] let node = ForNode(resolvable: Variable("dict"), loopVariables: ["key", "value"], nodes: nodes, emptyNodes: emptyNodes, where: nil) @@ -237,14 +237,14 @@ func testForNode() { let context = Context(dictionary: [ "struct": MyStruct(string: "abc", number: 123) - ]) + ]) let nodes: [NodeType] = [ VariableNode(variable: "property"), TextNode(text: "="), VariableNode(variable: "value"), TextNode(text: "\n"), - ] + ] let node = ForNode(resolvable: Variable("struct"), loopVariables: ["property", "value"], nodes: nodes, emptyNodes: []) let result = try node.render(context) @@ -254,14 +254,14 @@ func testForNode() { $0.it("can iterate tuple items") { let context = Context(dictionary: [ "tuple": (one: 1, two: "dva"), - ]) + ]) let nodes: [NodeType] = [ VariableNode(variable: "label"), TextNode(text: "="), VariableNode(variable: "value"), TextNode(text: "\n"), - ] + ] let node = ForNode(resolvable: Variable("tuple"), loopVariables: ["label", "value"], nodes: nodes, emptyNodes: []) let result = try node.render(context) @@ -289,15 +289,15 @@ func testForNode() { let context = Context(dictionary: [ "class": MySubclass("child", "base", 1) - ]) + ]) let nodes: [NodeType] = [ VariableNode(variable: "label"), TextNode(text: "="), VariableNode(variable: "value"), TextNode(text: "\n"), - ] - + ] + let node = ForNode(resolvable: Variable("class"), loopVariables: ["label", "value"], nodes: nodes, emptyNodes: []) let result = try node.render(context) diff --git a/Tests/StencilTests/LexerSpec.swift b/Tests/StencilTests/LexerSpec.swift index 9fe8df0..2a9f1e1 100644 --- a/Tests/StencilTests/LexerSpec.swift +++ b/Tests/StencilTests/LexerSpec.swift @@ -77,7 +77,7 @@ func testLexer() { "%}{{\n" + "name\n" + "}}{%\n" + - "endif %}." + "endif %}." let lexer = Lexer(templateString: templateString)