Skip to content

Commit 989d4cc

Browse files
committed
Fix color member access on strings and tuples
1 parent fd7ad3a commit 989d4cc

File tree

3 files changed

+58
-29
lines changed

3 files changed

+58
-29
lines changed

ShapeScript/Interpreter.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,6 +1320,8 @@ extension Expression {
13201320
if case let .tuple(values) = value, values.count == 1 {
13211321
value = values[0]
13221322
}
1323+
assert(!value.members.contains(member.name),
1324+
"\(value.type.errorDescription) should have member '\(member.name)'")
13231325
throw RuntimeError(.unknownMember(
13241326
member.name,
13251327
of: value.type.errorDescription,

ShapeScript/Symbols.swift

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -316,21 +316,20 @@ extension Value {
316316
members.append("last")
317317
}
318318
members += ["count", "allButFirst", "allButLast"]
319-
if isConvertible(to: .string) {
320-
members += ["lines", "words", "characters"]
319+
if let string = self.as(.string) {
320+
members += string.members
321321
}
322-
guard values.allSatisfy({ $0.isConvertible(to: .number) }) else {
323-
return members + (values.count == 1 ? values[0].members : [])
322+
if !members.contains("alpha"), let color = self.as(.color) {
323+
members += color.members
324324
}
325-
if (1 ... 4).contains(values.count) {
326-
members += ["red", "green", "blue", "alpha"]
327-
if values.count < 4 {
328-
members += [
329-
"x", "y", "z",
330-
"width", "height", "depth",
331-
"roll", "yaw", "pitch",
332-
]
333-
}
325+
if let vector = self.as(.vector) {
326+
members += vector.members
327+
}
328+
if let size = self.as(.size) {
329+
members += size.members
330+
}
331+
if let rotation = self.as(.rotation) {
332+
members += rotation.members
334333
}
335334
return members
336335
case .range:
@@ -346,7 +345,11 @@ extension Value {
346345
case .bounds:
347346
return ["min", "max", "size", "center", "width", "height", "depth"]
348347
case .string:
349-
return ["lines", "words", "characters"]
348+
var members = ["lines", "words", "characters"]
349+
if let color = self.as(.color) {
350+
members += color.members
351+
}
352+
return members
350353
case let .object(values):
351354
return values.keys.sorted()
352355
case .texture, .boolean, .number, .text:
@@ -400,25 +403,18 @@ extension Value {
400403
return .number(Double(values.count))
401404
case "lines", "words", "characters":
402405
return self.as(.string)?[name]
403-
default:
404-
if let index = name.ordinalIndex {
405-
return index < values.count ? values[index] : nil
406-
}
407-
}
408-
let numbers = values.compactMap { $0.as(.number)?.doubleValue }
409-
guard numbers.count == values.count else {
410-
return values.count == 1 ? values[0][name] : nil
411-
}
412-
switch name {
413406
case "x", "y", "z":
414-
return values.count < 4 ? Value.vector(Vector(numbers))[name] : nil
407+
return self.as(.vector)?[name]
415408
case "width", "height", "depth":
416-
return values.count < 4 ? Value.size(Vector(size: numbers))[name] : nil
409+
return self.as(.size)?[name]
417410
case "roll", "yaw", "pitch":
418-
return Rotation(rollYawPitchInHalfTurns: numbers).map(Value.rotation)?[name]
411+
return self.as(.rotation)?[name]
419412
case "red", "green", "blue", "alpha":
420-
return Color(numbers).map(Value.color)?[name]
413+
return self.as(.color)?[name]
421414
default:
415+
if let index = name.ordinalIndex {
416+
return index < values.count ? values[index] : nil
417+
}
422418
return nil
423419
}
424420
case let .range(range):
@@ -490,7 +486,10 @@ extension Value {
490486
.map { .string("\($0)") })
491487
case "characters":
492488
return .tuple(string.map { .string("\($0)") })
493-
default: return nil
489+
case "red", "green", "blue", "alpha":
490+
return self.as(.color)?[name]
491+
default:
492+
return nil
494493
}
495494
case let .object(values):
496495
return values[name]

ShapeScriptTests/InterpreterTests.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3136,6 +3136,34 @@ class InterpreterTests: XCTestCase {
31363136
XCTAssertEqual(delegate.log, [0.2])
31373137
}
31383138

3139+
func testHexAlphaLookup() {
3140+
let program = "print #f00.alpha"
3141+
let delegate = TestDelegate()
3142+
XCTAssertNoThrow(try evaluate(parse(program), delegate: delegate))
3143+
XCTAssertEqual(delegate.log, [1])
3144+
}
3145+
3146+
func testHexTupleAlphaLookup() {
3147+
let program = "print (#f00 0.2).alpha"
3148+
let delegate = TestDelegate()
3149+
XCTAssertNoThrow(try evaluate(parse(program), delegate: delegate))
3150+
XCTAssertEqual(delegate.log, [0.2])
3151+
}
3152+
3153+
func testHexStringAlphaLookup() {
3154+
let program = "print \"#f00\".alpha"
3155+
let delegate = TestDelegate()
3156+
XCTAssertNoThrow(try evaluate(parse(program), delegate: delegate))
3157+
XCTAssertEqual(delegate.log, [1])
3158+
}
3159+
3160+
func testHexStringTupleAlphaLookup() {
3161+
let program = "print (\"#f00\" 0.2).alpha"
3162+
let delegate = TestDelegate()
3163+
XCTAssertNoThrow(try evaluate(parse(program), delegate: delegate))
3164+
XCTAssertEqual(delegate.log, [0.2])
3165+
}
3166+
31393167
func testTooLongTupleColorLookup() {
31403168
let program = "print (1 2 3 4 5).red"
31413169
XCTAssertThrowsError(try evaluate(parse(program), delegate: nil)) { error in

0 commit comments

Comments
 (0)