Fix tables not properly parsing their key, value types when working with nested tables

This commit is contained in:
Deukhoofd 2019-01-26 13:23:34 +01:00
parent 57b7fd1c69
commit 6b2db3f169
No known key found for this signature in database
GPG Key ID: B4C087AC81641654
10 changed files with 34 additions and 9 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;
@ -183,6 +182,11 @@ namespace UpsilonLanguageServer
}
private static readonly Regex TableMatcher = new Regex(@"table *\((?'catch'.*)\)", RegexOptions.IgnoreCase);
private static readonly Regex TableKeyValueMatcher =
new Regex(
@"(?'keyType'(?:\w| )+) *(?:\((?'keyInternalType'.*)\))* *, *(?'valueType'(?:\w| )+)(?:\((?'valueInternalType'.*)\))*",
RegexOptions.IgnoreCase);
private static TypeContainer ParseType(string input)
{
input = input.Trim();
@ -193,8 +197,7 @@ namespace UpsilonLanguageServer
if (string.Equals(input, "bool", StringComparison.InvariantCultureIgnoreCase))
return Type.Boolean;
if (string.Equals(input, "table", StringComparison.InvariantCultureIgnoreCase))
{
}
return Type.Table;
if (string.Equals(input, "function", StringComparison.InvariantCultureIgnoreCase))
return Type.Function;
if (string.Equals(input, "unknown", StringComparison.InvariantCultureIgnoreCase))
@ -203,13 +206,27 @@ namespace UpsilonLanguageServer
if (match.Success)
{
var group = match.Groups["catch"].Value;
var split = group.Split(',', StringSplitOptions.RemoveEmptyEntries);
return new CompositeTypeContainer()
{
Types = split.Select(ParseType).ToImmutableArray()
};
return ParseTableKeyValue(group);
}
return new TypeContainer(input);
}
private static CompositeTypeContainer ParseTableKeyValue(string s)
{
var match = TableKeyValueMatcher.Match(s);
var dictionary = match.Groups.Where(x => x.Success).ToDictionary(x => x.Name, x => x.Value);
var keyType = ParseType(dictionary["keyType"]);
var valueType = ParseType(dictionary["valueType"]);
if (keyType == Type.Table && dictionary.TryGetValue("keyInternalType", out var keyInternalType))
{
keyType = ParseTableKeyValue(keyInternalType);
}
if (valueType == Type.Table && dictionary.TryGetValue("valueInternalType", out var valueInternalType))
{
valueType = ParseTableKeyValue(valueInternalType);
}
return new CompositeTypeContainer(new[] {keyType, valueType}.ToImmutableArray());
}
}
}

View File

@ -64,12 +64,16 @@ namespace UpsilonLanguageServer.Services
await Client.Window.ShowMessage(MessageType.Info, "Upsilon Language Server Initialized");
}
public void Shutdown()
{
Session.StopServer();
}
[JsonRpcMethod(IsNotification = true)]
public void Exit()
{
Client.Window.ShowMessage(MessageType.Info, "Upsilon Language Server exited");
Session.StopServer();
Process.GetCurrentProcess().Kill();
}
[JsonRpcMethod("$/cancelRequest", IsNotification = true)]

View File

@ -48,6 +48,10 @@ namespace UpsilonLanguageServer.Services
contents.Append($"\n\nReturns: {fVar.FunctionOption.First().ResultType}");
}
}
else if (findNode is BoundVariableAssignment variableAssignment)
{
contents.Append($"\n\nType: {variableAssignment.Variable.Type}");
}
else if (findNode is BoundFunctionExpression fe)
{
contents.Append($"\n\nReturns: {fe.ReturnType}");