Skip to content

Commit

Permalink
Merge pull request #182 from tonybaloney/qualified_typenames
Browse files Browse the repository at this point in the history
Qualified typenames
  • Loading branch information
tonybaloney authored Aug 30, 2024
2 parents a8f35a9 + 9d65620 commit 99fd1ed
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/CSnakes.Tests/GeneratedSignatureTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public class GeneratedSignatureTests(TestEnvironment testEnv) : IClassFixture<Te
[InlineData("def hello(a: int = 0b10101010) -> None:\n ...\n", "void Hello(long a = 0b10101010)")]
[InlineData("def hello(a: int = 2147483648) -> None:\n ...\n", "void Hello(long a = 2147483648L)")]
[InlineData("def hello(a: Optional[int] = None) -> None:\n ...\n", "void Hello(long? a = null)")]
[InlineData("def hello(a: typing.List[int], b: typing.Dict[str, int]) -> typing.Tuple[str, int]:\n ...\n", "public (string, long) Hello(IReadOnlyList<long> a, IReadOnlyDictionary<string, long> b)")]
public void TestGeneratedSignature(string code, string expected)
{

Expand Down
22 changes: 22 additions & 0 deletions src/CSnakes.Tests/TokenizerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,28 @@ public void ParseFunctionParameterListDoubleGeneric()
Assert.Equal("list[int]", result.Value[0].Type.ToString());
}

[Fact]
public void ParseFunctionParameterListQualifiedGenericType()
{
var code = "(a: typing.List[int], b)";
var tokens = PythonTokenizer.Instance.Tokenize(code);
var result = PythonParser.PythonParameterListTokenizer.TryParse(tokens);
Assert.True(result.HasValue);
Assert.Equal("a", result.Value[0].Name);
Assert.Equal("typing.List[int]", result.Value[0].Type.ToString());
}

[Fact]
public void ParseFunctionParameterListQualifiedBasicType()
{
var code = "(a: np.ndarray, b)";
var tokens = PythonTokenizer.Instance.Tokenize(code);
var result = PythonParser.PythonParameterListTokenizer.TryParse(tokens);
Assert.True(result.HasValue);
Assert.Equal("a", result.Value[0].Name);
Assert.Equal("np.ndarray", result.Value[0].Type.ToString());
}

[Fact]
public void ParseFunctionParameterListEasy()
{
Expand Down
8 changes: 8 additions & 0 deletions src/CSnakes/Parser/PythonParser.TypeDef.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
using CSnakes.Parser.Types;
using Superpower;
using Superpower.Model;
using Superpower.Parsers;

namespace CSnakes.Parser;
public static partial class PythonParser
{
public static TextParser<TextSpan> QualifiedName { get; } =
Span.MatchedBy(
Character.Letter.Or(Character.EqualTo('_'))
.IgnoreThen(Character.LetterOrDigit.Or(Character.EqualTo('_')).Many())
.AtLeastOnceDelimitedBy(Character.EqualTo('.'))
);

public static TokenListParser<PythonToken, PythonTypeSpec?> PythonTypeDefinitionTokenizer { get; } =
(from name in Token.EqualTo(PythonToken.Identifier).Or(Token.EqualTo(PythonToken.None))
#pragma warning disable CS8620
Expand Down
2 changes: 1 addition & 1 deletion src/CSnakes/Parser/PythonTokenizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public static class PythonTokenizer
.Match(Span.EqualTo("None"), PythonToken.None, requireDelimiters: true)
.Match(Span.EqualTo("True"), PythonToken.True, requireDelimiters: true)
.Match(Span.EqualTo("False"), PythonToken.False, requireDelimiters: true)
.Match(Identifier.CStyle, PythonToken.Identifier, requireDelimiters: true) // TODO: (track) Does this require delimiters?
.Match(PythonParser.QualifiedName, PythonToken.Identifier, requireDelimiters: true)
.Match(PythonParser.IntegerConstantToken, PythonToken.Integer, requireDelimiters: true)
.Match(PythonParser.DecimalConstantToken, PythonToken.Decimal, requireDelimiters: true)
.Match(PythonParser.HexidecimalConstantToken, PythonToken.HexidecimalInteger, requireDelimiters: true)
Expand Down
1 change: 1 addition & 0 deletions src/CSnakes/Parser/PythonTokens.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public enum PythonToken
DoubleAsterisk,

Identifier,
QualifiedIdentifier,

[Token(Example = "->")]
Arrow,
Expand Down
2 changes: 1 addition & 1 deletion src/CSnakes/Reflection/TypeReflection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public static TypeSyntax AsPredefinedType(PythonTypeSpec pythonType)
if (pythonType.HasArguments())
{
// Get last occurrence of ] in pythonType
return pythonType.Name switch
return pythonType.Name.Replace("typing.", "") switch
{
"list" => CreateListType(pythonType.Arguments[0]),
"List" => CreateListType(pythonType.Arguments[0]),
Expand Down

0 comments on commit 99fd1ed

Please sign in to comment.