Skip to content

Commit 0c64946

Browse files
committed
Simplify identifier expressions
1 parent a4cafbc commit 0c64946

3 files changed

Lines changed: 33 additions & 83 deletions

File tree

ShapeScript/Interpreter.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -709,10 +709,10 @@ private func evaluateParameters(
709709
) throws -> [Value] {
710710
var values = [Value]()
711711
loop: for (i, param) in parameters.enumerated() {
712-
if i < parameters.count - 1, case let .identifier(identifier) = param.type {
713-
let (name, range) = (identifier.name, identifier.range)
712+
if i < parameters.count - 1, case let .identifier(name) = param.type {
714713
switch context.symbol(for: name) {
715714
case let .command(parameterType, fn)? where parameterType != .void:
715+
let identifier = Identifier(name: name, range: param.range)
716716
let range = parameters[i + 1].range.lowerBound ..< parameters.last!.range.upperBound
717717
let param = Expression(type: .tuple(Array(parameters[(i + 1)...])), range: range)
718718
let arg = try evaluateParameter(param, as: parameterType, for: identifier, in: context)
@@ -740,7 +740,7 @@ private func evaluateParameters(
740740
)
741741
}
742742
}
743-
try RuntimeError.wrap(values.append(fn(childContext)), at: range)
743+
try RuntimeError.wrap(values.append(fn(childContext)), at: param.range)
744744
break loop
745745
default:
746746
break
@@ -1113,8 +1113,7 @@ extension Expression {
11131113
return .string(string)
11141114
case let .color(color):
11151115
return .color(color)
1116-
case let .identifier(identifier):
1117-
let (name, range) = (identifier.name, identifier.range)
1116+
case let .identifier(name):
11181117
guard let symbol = context.symbol(for: name) else {
11191118
throw RuntimeError(
11201119
.unknownSymbol(name, options: context.expressionSymbols),

ShapeScript/Parser.swift

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public enum ExpressionType: Equatable {
5959
case number(Double)
6060
case string(String)
6161
case color(Color)
62-
case identifier(Identifier)
62+
case identifier(String)
6363
case block(Identifier, Block)
6464
indirect case tuple([Expression])
6565
indirect case prefix(PrefixOperator, Expression)
@@ -223,8 +223,8 @@ private extension ArraySlice where Element == Token {
223223
}
224224
var identifier: Identifier?
225225
var expression = try require(readExpression(), as: "index or range")
226-
if case let .identifier(id) = expression.type, readToken(.identifier("in")) {
227-
identifier = id
226+
if case let .identifier(name) = expression.type, readToken(.identifier("in")) {
227+
identifier = Identifier(name: name, range: expression.range)
228228
expression = try require(readExpression(), as: "range")
229229
}
230230
let body = try require(readBlock(), as: "loop body")
@@ -299,9 +299,8 @@ private extension ArraySlice where Element == Token {
299299
case let .hexColor(string):
300300
type = .color(Color(hexString: string) ?? .black)
301301
case let .identifier(name):
302-
let identifier = Identifier(name: name, range: range)
303302
guard readToken(.lparen) else {
304-
type = .identifier(identifier)
303+
type = .identifier(name)
305304
break
306305
}
307306
let expression = try require(readExpressions(), as: "expression")
@@ -310,7 +309,7 @@ private extension ArraySlice where Element == Token {
310309
// repackage function syntax as a lisp-style subexpression
311310
// TODO: should we support this as a distinct construct?
312311
var expressions = [Expression(
313-
type: .identifier(identifier),
312+
type: .identifier(name),
314313
range: range
315314
)]
316315
if case let .tuple(params) = expression.type {
@@ -421,10 +420,7 @@ private extension ArraySlice where Element == Token {
421420
var rhs = try require(readSum(), as: "operand")
422421
if let not = not {
423422
rhs = Expression(type: .tuple([
424-
Expression(
425-
type: .identifier(Identifier(name: "not", range: not.range)),
426-
range: not.range
427-
),
423+
Expression(type: .identifier("not"), range: not.range),
428424
rhs,
429425
]), range: not.range.lowerBound ..< rhs.range.upperBound)
430426
}
@@ -434,10 +430,7 @@ private extension ArraySlice where Element == Token {
434430
)
435431
}
436432
return not.map {
437-
let not = Expression(
438-
type: .identifier(Identifier(name: "not", range: $0.range)),
439-
range: $0.range
440-
)
433+
let not = Expression(type: .identifier("not"), range: $0.range)
441434
return Expression(
442435
type: .tuple([not, lhs]),
443436
range: $0.range.lowerBound ..< lhs.range.upperBound
@@ -470,8 +463,9 @@ private extension ArraySlice where Element == Token {
470463
mutating func readExpressions(allowLinebreaks: Bool = false) throws -> Expression? {
471464
var expressions = [Expression]()
472465
while var expression = try readExpression() {
473-
if case let .identifier(identifier) = expression.type, let block = try readBlock() {
474-
let range = identifier.range.lowerBound ..< block.range.upperBound
466+
if case let .identifier(name) = expression.type, let block = try readBlock() {
467+
let range = expression.range.lowerBound ..< block.range.upperBound
468+
let identifier = Identifier(name: name, range: expression.range)
475469
expression = Expression(type: .block(identifier, block), range: range)
476470
}
477471
expressions.append(expression)

ShapeScriptTests/ParserTests.swift

Lines changed: 19 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,9 @@ class ParserTests: XCTestCase {
116116
Identifier(name: "not", range: notRange),
117117
Expression(
118118
type: .infix(
119-
Expression(type: .identifier(Identifier(
120-
name: "a",
121-
range: aRange
122-
)), range: aRange),
119+
Expression(type: .identifier("a"), range: aRange),
123120
.equal,
124-
Expression(type: .identifier(Identifier(
125-
name: "b",
126-
range: bRange
127-
)), range: bRange)
121+
Expression(type: .identifier("b"), range: bRange)
128122
),
129123
range: aRange.lowerBound ..< input.endIndex
130124
)
@@ -146,20 +140,11 @@ class ParserTests: XCTestCase {
146140
Identifier(name: "not", range: notRange),
147141
Expression(
148142
type: .infix(
149-
Expression(type: .identifier(Identifier(
150-
name: "a",
151-
range: aRange
152-
)), range: aRange),
143+
Expression(type: .identifier("a"), range: aRange),
153144
.equal,
154145
Expression(type: .tuple([
155-
Expression(type: .identifier(Identifier(
156-
name: "not",
157-
range: notRange2
158-
)), range: notRange2),
159-
Expression(type: .identifier(Identifier(
160-
name: "b",
161-
range: bRange
162-
)), range: bRange),
146+
Expression(type: .identifier("not"), range: notRange2),
147+
Expression(type: .identifier("b"), range: bRange),
163148
]), range: notRange2.lowerBound ..< bRange.upperBound)
164149
),
165150
range: aRange.lowerBound ..< input.endIndex
@@ -435,10 +420,9 @@ class ParserTests: XCTestCase {
435420
let range1 = input.range(of: "foo")!
436421
let range2 = input.range(of: "2")!
437422
let range = range1.lowerBound ..< range2.upperBound
438-
let identifier = Identifier(name: "foo", range: range1)
439423
XCTAssertEqual(try parse(input), Program(source: input, statements: [
440424
Statement(type: .expression(Expression(type: .infix(
441-
Expression(type: .identifier(identifier), range: range1),
425+
Expression(type: .identifier("foo"), range: range1),
442426
.plus,
443427
Expression(type: .number(2), range: range2)
444428
), range: range)), range: range),
@@ -450,10 +434,9 @@ class ParserTests: XCTestCase {
450434
let range1 = input.range(of: "foo")!
451435
let range2 = input.range(of: "2")!
452436
let range = range1.lowerBound ..< range2.upperBound
453-
let identifier = Identifier(name: "foo", range: range1)
454437
XCTAssertEqual(try parse(input), Program(source: input, statements: [
455438
Statement(type: .expression(Expression(type: .infix(
456-
Expression(type: .identifier(identifier), range: range1),
439+
Expression(type: .identifier("foo"), range: range1),
457440
.to,
458441
Expression(type: .number(2), range: range2)
459442
), range: range)), range: range),
@@ -465,10 +448,9 @@ class ParserTests: XCTestCase {
465448
let range1 = input.range(of: "foo")!
466449
let range2 = input.range(of: "2")!
467450
let range = range1.lowerBound ..< range2.upperBound
468-
let identifier = Identifier(name: "foo", range: range1)
469451
XCTAssertEqual(try parse(input), Program(source: input, statements: [
470452
Statement(type: .expression(Expression(type: .infix(
471-
Expression(type: .identifier(identifier), range: range1),
453+
Expression(type: .identifier("foo"), range: range1),
472454
.step,
473455
Expression(type: .number(2), range: range2)
474456
), range: range)), range: range),
@@ -480,13 +462,11 @@ class ParserTests: XCTestCase {
480462
let range1 = input.range(of: "foo")!
481463
let range2 = input.range(of: "step")!
482464
let range = range1.lowerBound ..< range2.upperBound
483-
let identifier1 = Identifier(name: "foo", range: range1)
484-
let identifier2 = Identifier(name: "step", range: range2)
485465
XCTAssertEqual(try parse(input), Program(source: input, statements: [
486466
Statement(type: .expression(Expression(
487467
type: .tuple([
488-
Expression(type: .identifier(identifier1), range: range1),
489-
Expression(type: .identifier(identifier2), range: range2),
468+
Expression(type: .identifier("foo"), range: range1),
469+
Expression(type: .identifier("step"), range: range2),
490470
]),
491471
range: range
492472
)), range: range),
@@ -498,13 +478,11 @@ class ParserTests: XCTestCase {
498478
let range1 = input.range(of: "foo")!
499479
let range2 = input.range(of: "true")!
500480
let range = range1.lowerBound ..< range2.upperBound
501-
let identifier1 = Identifier(name: "foo", range: range1)
502-
let identifier2 = Identifier(name: "true", range: range2)
503481
XCTAssertEqual(try parse(input), Program(source: input, statements: [
504482
Statement(type: .expression(Expression(type: .infix(
505-
Expression(type: .identifier(identifier1), range: range1),
483+
Expression(type: .identifier("foo"), range: range1),
506484
.and,
507-
Expression(type: .identifier(identifier2), range: range2)
485+
Expression(type: .identifier("true"), range: range2)
508486
), range: range)), range: range),
509487
]))
510488
}
@@ -656,10 +634,7 @@ class ParserTests: XCTestCase {
656634
XCTAssertEqual(try parse(input), Program(source: input, statements: [
657635
Statement(
658636
type: .ifelse(
659-
Expression(
660-
type: .identifier(Identifier(name: "foo", range: fooRange)),
661-
range: fooRange
662-
),
637+
Expression(type: .identifier("foo"), range: fooRange),
663638
Block(statements: [], range: bodyRange),
664639
else: nil
665640
),
@@ -682,21 +657,15 @@ class ParserTests: XCTestCase {
682657
XCTAssertEqual(try parse(input), Program(source: input, statements: [
683658
Statement(
684659
type: .ifelse(
685-
Expression(
686-
type: .identifier(Identifier(name: "foo", range: fooRange)),
687-
range: fooRange
688-
),
660+
Expression(type: .identifier("foo"), range: fooRange),
689661
Block(statements: [], range: bodyRange),
690662
else: nil
691663
),
692664
range: ifRange.lowerBound ..< bodyRange.upperBound
693665
),
694666
Statement(
695667
type: .ifelse(
696-
Expression(
697-
type: .identifier(Identifier(name: "bar", range: barRange)),
698-
range: barRange
699-
),
668+
Expression(type: .identifier("bar"), range: barRange),
700669
Block(statements: [], range: body2Range),
701670
else: nil
702671
),
@@ -714,10 +683,7 @@ class ParserTests: XCTestCase {
714683
XCTAssertEqual(try parse(input), Program(source: input, statements: [
715684
Statement(
716685
type: .ifelse(
717-
Expression(
718-
type: .identifier(Identifier(name: "foo", range: fooRange)),
719-
range: fooRange
720-
),
686+
Expression(type: .identifier("foo"), range: fooRange),
721687
Block(statements: [], range: bodyRange),
722688
else: Block(statements: [], range: elseBodyRange)
723689
),
@@ -738,18 +704,12 @@ class ParserTests: XCTestCase {
738704
XCTAssertEqual(try parse(input), Program(source: input, statements: [
739705
Statement(
740706
type: .ifelse(
741-
Expression(
742-
type: .identifier(Identifier(name: "foo", range: fooRange)),
743-
range: fooRange
744-
),
707+
Expression(type: .identifier("foo"), range: fooRange),
745708
Block(statements: [], range: bodyRange),
746709
else: Block(statements: [
747710
Statement(
748711
type: .ifelse(
749-
Expression(
750-
type: .identifier(Identifier(name: "bar", range: barRange)),
751-
range: barRange
752-
),
712+
Expression(type: .identifier("bar"), range: barRange),
753713
Block(statements: [], range: body2Range),
754714
else: nil
755715
),
@@ -774,10 +734,7 @@ class ParserTests: XCTestCase {
774734
XCTAssertEqual(try parse(input), Program(source: input, statements: [
775735
Statement(
776736
type: .ifelse(
777-
Expression(
778-
type: .identifier(Identifier(name: "foo", range: fooRange)),
779-
range: fooRange
780-
),
737+
Expression(type: .identifier("foo"), range: fooRange),
781738
Block(statements: [], range: bodyRange),
782739
else: Block(statements: [], range: elseBodyRange)
783740
),

0 commit comments

Comments
 (0)