mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-03 00:00:49 +08:00
修复了全局节点连接异常异常。
This commit is contained in:
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Serein.Script.Node
|
||||
{
|
||||
@@ -22,6 +23,13 @@ namespace Serein.Script.Node
|
||||
public ASTNode Value { get; }
|
||||
|
||||
public AssignmentNode(ASTNode target, ASTNode value) => (Target, Value) = (target, value);
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Target} = {Value}";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -33,5 +33,10 @@ namespace Serein.Script.Node
|
||||
Operator = op;
|
||||
Right = right;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"({Left} {Operator} {Right})";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,11 @@ namespace Serein.Script.Node
|
||||
this.ClassType = className;
|
||||
}
|
||||
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
var p = string.Join(",", Propertys.Select(p => $"{p.Value}"));
|
||||
return $"{ClassType}({p})";
|
||||
}
|
||||
|
||||
|
||||
/* /// <summary>
|
||||
|
||||
@@ -26,6 +26,12 @@ namespace Serein.Script.Node
|
||||
this.Collection = Collection;
|
||||
this.Index = indexValue;
|
||||
}
|
||||
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Collection}[{Index}]";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -48,5 +54,10 @@ namespace Serein.Script.Node
|
||||
this.Collection = collection;
|
||||
this.Value = value;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Collection} = {Value}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,9 @@ namespace Serein.Script.Node
|
||||
Value = value;
|
||||
}
|
||||
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"ctor {Class}.{MemberName} = {Value}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Claims;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -26,6 +27,12 @@ namespace Serein.Script.Node
|
||||
FunctionName = functionName;
|
||||
Arguments = arguments;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
var p = string.Join(",", Arguments.Select(p => $"{p}"));
|
||||
return $"{FunctionName}({p})";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,5 +16,11 @@ namespace Serein.Script.Node
|
||||
/// </summary>
|
||||
public string Name { get; }
|
||||
public IdentifierNode(string name) => Name = name;
|
||||
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"let {Name}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,5 +26,10 @@ namespace Serein.Script.Node
|
||||
Object = obj;
|
||||
MemberName = memberName;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Object}.{MemberName}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,5 +31,10 @@ namespace Serein.Script.Node
|
||||
MemberName = memberName;
|
||||
Value = value;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Object}.{MemberName} = {Value}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,5 +32,12 @@ namespace Serein.Script.Node
|
||||
FunctionName = functionName;
|
||||
Arguments = arguments;
|
||||
}
|
||||
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
var p = string.Join(",", Arguments.Select(p => $"{p}"));
|
||||
return $"{Object}.{FunctionName}({p})";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,13 @@ namespace Serein.Script.Node
|
||||
CtorAssignments = ctorAssignments;
|
||||
return this;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
var arg = string.Join(",", Arguments.Select(p => $"{p}"));
|
||||
var ctor_arg = string.Join(",", CtorAssignments.Select(p => $"{p}"));
|
||||
return $"new {Type}({arg}){ctor_arg}";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,5 +18,9 @@ namespace Serein.Script.Node
|
||||
TypeName = typeName;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"[type]{TypeName}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,5 +13,10 @@ namespace Serein.Script.Node
|
||||
{
|
||||
public bool Value { get; }
|
||||
public BooleanNode(bool value) => Value = value;
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Value}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,5 +13,9 @@ namespace Serein.Script.Node
|
||||
{
|
||||
Value = char.Parse(value);
|
||||
}
|
||||
public override string ToString()
|
||||
{
|
||||
return $"'{Value}'";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,5 +11,9 @@ namespace Serein.Script.Node
|
||||
/// </summary>
|
||||
public class NullNode : ASTNode
|
||||
{
|
||||
public override string ToString()
|
||||
{
|
||||
return $"Null";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,11 @@ namespace Serein.Script.Node
|
||||
{
|
||||
public T Value { get; }
|
||||
public NumberNode(T value) => Value = value;
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Value}";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -55,6 +55,11 @@ namespace Serein.Script.Node
|
||||
}
|
||||
Value = output.ToString();
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"\"{Value}\"";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,9 +8,6 @@ namespace Serein.Script
|
||||
|
||||
public class SereinScript
|
||||
{
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 类型分析
|
||||
/// </summary>
|
||||
|
||||
@@ -1,21 +1,53 @@
|
||||
namespace Serein.Script
|
||||
{
|
||||
/// <summary>
|
||||
/// 脚本方法信息
|
||||
/// </summary>
|
||||
public class SereinScriptMethodInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 类名
|
||||
/// </summary>
|
||||
public string ClassName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 方法名
|
||||
/// </summary>
|
||||
public string MethodName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 返回类型
|
||||
/// </summary>
|
||||
public Type? ReturnType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否异步
|
||||
/// </summary>
|
||||
public bool IsAsync { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 入参参数信息
|
||||
/// </summary>
|
||||
public List<SereinScriptParamInfo> ParamInfos { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 对应的C#代码
|
||||
/// </summary>
|
||||
public string CsharpCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 入参信息
|
||||
/// </summary>
|
||||
public class SereinScriptParamInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 入参参数名称
|
||||
/// </summary>
|
||||
public string ParamName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 入参类型
|
||||
/// </summary>
|
||||
public Type ParameterType { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Serein.Script.Node;
|
||||
using Serein.Library.Utils;
|
||||
using Serein.Script.Node;
|
||||
using Serein.Script.Node.FlowControl;
|
||||
using System.Text;
|
||||
|
||||
@@ -88,20 +89,38 @@ namespace Serein.Script
|
||||
Indent();
|
||||
if(param is null || param.Count == 0)
|
||||
{
|
||||
// 生成方法签名
|
||||
AppendLine($"public static {returnContent} {mehtodName}()");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 生成方法签名
|
||||
AppendLine($"public static {returnContent} {mehtodName}({GetMethodParamster(param)})");
|
||||
}
|
||||
AppendLine( "{");
|
||||
Indent();
|
||||
foreach (var stmt in programNode.Statements)
|
||||
// 生成变量节点
|
||||
var idfNodesTemp = _symbolInfos.Keys.Where(key => key is IdentifierNode)
|
||||
.OfType<IdentifierNode>().ToList() ;
|
||||
var idfNodes = (param is null) switch
|
||||
{
|
||||
ConvertCode(stmt); // 递归遍历
|
||||
true => idfNodesTemp.DistinctBy(n => n.Name).ToList(),
|
||||
false => idfNodesTemp.DistinctBy(n => n.Name).DistinctByCondition(n => !param.ContainsKey(n.Name) ).ToList(),
|
||||
};
|
||||
foreach (var idf in idfNodes)
|
||||
{
|
||||
var varName = idf.Name;
|
||||
var varType = _symbolInfos[idf];
|
||||
AppendLine($"global::{varType.FullName} {varName} = default; // 变量");
|
||||
}
|
||||
AppendLine("");
|
||||
|
||||
// 递归遍历节点生成代码
|
||||
foreach (var stmt in programNode.Statements)
|
||||
{
|
||||
ConvertCode(stmt);
|
||||
Append(";");
|
||||
}
|
||||
|
||||
if (_symbolInfos[programNode] == typeof(void))
|
||||
{
|
||||
AppendLine("");
|
||||
@@ -192,8 +211,8 @@ namespace Serein.Script
|
||||
void ConvertCodeOfIdentifierNode(IdentifierNode identifierNode)
|
||||
{
|
||||
var varName = identifierNode.Name;
|
||||
|
||||
if(_local.TryGetValue(varName, out var type))
|
||||
Append(varName);
|
||||
/*if (_local.TryGetValue(varName, out var type))
|
||||
{
|
||||
// 定义过,需要使用变量
|
||||
Append(varName);
|
||||
@@ -211,7 +230,7 @@ namespace Serein.Script
|
||||
{
|
||||
throw new Exception($"加载符号表时,无法匹配 IdentifierNode 节点的类型。 name : {varName}");
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
ConvertCodeOfIdentifierNode(identifierNode);
|
||||
break;
|
||||
@@ -227,7 +246,6 @@ namespace Serein.Script
|
||||
foreach(var item in ifNOde.TrueBranch)
|
||||
{
|
||||
ConvertCode(item);
|
||||
//Append(";");
|
||||
AppendLine(string.Empty);
|
||||
}
|
||||
Unindent();
|
||||
@@ -235,10 +253,9 @@ namespace Serein.Script
|
||||
AppendLine("else");
|
||||
AppendLine("{");
|
||||
Indent();
|
||||
foreach (var item in ifNOde.TrueBranch)
|
||||
foreach (var item in ifNOde.FalseBranch)
|
||||
{
|
||||
ConvertCode(item);
|
||||
//Append(";");
|
||||
AppendLine(string.Empty);
|
||||
}
|
||||
Unindent();
|
||||
|
||||
@@ -198,7 +198,7 @@ namespace Serein.Script
|
||||
var targetType = Analysis(assignmentNode.Target);
|
||||
var valueType = Analysis (assignmentNode.Value);
|
||||
if (!targetType.IsAssignableFrom(valueType))
|
||||
throw new Exception($"索引类型不匹配:需要 {targetType},实际为 {valueType}");
|
||||
throw new Exception($"赋值类型不匹配:需要 {targetType},实际为 {valueType}");
|
||||
NodeSymbolInfos[assignmentNode.Value] = valueType;
|
||||
NodeSymbolInfos[assignmentNode.Target] = valueType;
|
||||
NodeSymbolInfos[assignmentNode] = typeof(void); // 赋值语句不产生类型
|
||||
|
||||
Reference in New Issue
Block a user