From 961ad754517627a1ca5ab580d8c5bba838dbaf9c Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Thu, 14 Oct 2021 17:32:17 -0400 Subject: [PATCH] dot access on aliases --- src/kiss/Reader.hx | 21 ++++++++++++++++++++- src/test/cases/BasicTestCase.hx | 4 ++++ src/test/cases/BasicTestCase.kiss | 7 +++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/kiss/Reader.hx b/src/kiss/Reader.hx index e991671..a20debc 100644 --- a/src/kiss/Reader.hx +++ b/src/kiss/Reader.hx @@ -129,7 +129,26 @@ class Reader { }; // Because macro keys are sorted by length and peekChars(0) returns "", this will be used as the default reader macro: - readTable[""] = (stream:Stream, k) -> Symbol(nextToken(stream, "a symbol name")); + readTable[""] = (stream:Stream, k) -> { + var position = stream.position(); + var token = nextToken(stream, "a symbol name"); + // Process dot-access on alias identifiers + return if (token.indexOf(".") != -1) { + try { + Std.parseFloat(token); + Symbol(token); + } catch (err) { + var tokenParts = token.split("."); + var fieldExp = Symbol(tokenParts.shift()); + while (tokenParts.length > 0) { + fieldExp = FieldExp(tokenParts.shift(), fieldExp.withPos(position)); + } + fieldExp; + } + } else { + Symbol(token); + }; + } return readTable; } diff --git a/src/test/cases/BasicTestCase.hx b/src/test/cases/BasicTestCase.hx index a64f9c1..56c814b 100644 --- a/src/test/cases/BasicTestCase.hx +++ b/src/test/cases/BasicTestCase.hx @@ -309,6 +309,10 @@ class BasicTestCase extends Test { function testLetThrow() { _testLetThrow(); } + + function testDotAccessOnAlias() { + _testDotAccessOnAlias(); + } } class BasicObject { diff --git a/src/test/cases/BasicTestCase.kiss b/src/test/cases/BasicTestCase.kiss index 599984f..9a1e276 100644 --- a/src/test/cases/BasicTestCase.kiss +++ b/src/test/cases/BasicTestCase.kiss @@ -540,3 +540,10 @@ (Assert.fail)} (catch [:String e] (Assert.equals "the error we want" e)))) + +// Test dot-access on identifiers aliases +(var objWithField (object field 5)) +(var float 0.5) // This should still read as a float, not a dot access on a variable called 0 +(defAlias &ident owf objWithField) +(function _testDotAccessOnAlias [] + (Assert.equals 5 owf.field)) \ No newline at end of file