public async Task <object> Handle(DesignHub hub, InvokeArgs args) { var modelID = args.GetString(); var line = args.GetInt32() - 1; var column = args.GetInt32() - 1; var modelNode = hub.DesignTree.FindModelNode(ModelType.Service, ulong.Parse(modelID)); if (modelNode == null) { throw new Exception("Can't find service model node"); } //定位服务入口方法 var doc = hub.TypeSystem.Workspace.CurrentSolution.GetDocument(modelNode.RoslynDocumentId); var semanticModel = await doc.GetSemanticModelAsync(); var sourceText = await doc.GetTextAsync(); var position = sourceText.Lines.GetPosition(new LinePosition(line, column)); var symbol = await SymbolFinder.FindSymbolAtPositionAsync(semanticModel, position, hub.TypeSystem.Workspace); if (symbol == null) { throw new Exception("Can't find service method"); } if (symbol.Kind != SymbolKind.Method) { throw new Exception("Not a method"); } if (symbol.ContainingType.ToString() != string.Format("{0}.ServiceLogic.{1}", modelNode.AppNode.ID, modelNode.Model.Name)) { throw new Exception("Not a service method"); } if (symbol.DeclaredAccessibility.ToString() != "Public") { throw new Exception("Not a service method"); } IMethodSymbol method = symbol as IMethodSymbol; var sb = new StringBuilder("{\"Name\":\""); sb.Append(method.Name); sb.Append("\", \"Args\":["); for (int i = 0; i < method.Parameters.Length; i++) { sb.AppendFormat("{{\"Name\":\"{0}\",\"Type\":\"{1}\"}}", method.Parameters[i].Name, method.Parameters[i].Type); if (i != method.Parameters.Length - 1) { sb.Append(","); } } sb.Append("]}"); return(sb.ToString()); }
//todo:修改实现,获取Changes集合 public async Task <object> Handle(DesignHub hub, InvokeArgs args) { int type = args.GetInt32(); string targetID = args.GetString(); int startLine = args.GetInt32() - 1; //注意:前端传过来的值需要-1 int startColumn = args.GetInt32() - 1; int endLine = args.GetInt32() - 1; int endColumn = args.GetInt32() - 1; string newText = args.GetString(); Document document; if (type == 1) //服务代码变更 { var modelNode = hub.DesignTree.FindModelNode(ModelType.Service, ulong.Parse(targetID)); if (modelNode == null) { throw new Exception($"Cannot find ServiceModel: {targetID}"); } document = hub.TypeSystem.Workspace.CurrentSolution.GetDocument(modelNode.RoslynDocumentId); } else if (type == 2) //表达式代码变更 { throw ExceptionHelper.NotImplemented(); //document = hub.ExpressionDesignService.GetExpressionDocument(targetID); } else { throw ExceptionHelper.NotImplemented(); } if (document == null) { throw new Exception("Can not find opened document: " + targetID); } var sourceText = await document.GetTextAsync(); var startOffset = sourceText.Lines.GetPosition(new LinePosition(startLine, startColumn)); var endOffset = sourceText.Lines.GetPosition(new LinePosition(endLine, endColumn)); sourceText = sourceText.WithChanges(new[] { new TextChange(new TextSpan(startOffset, endOffset - startOffset), newText) }); hub.TypeSystem.Workspace.OnDocumentChanged(document.Id, sourceText); return(null); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { var sourceNodeType = (DesignNodeType)args.GetInt32(); var sourceNodeID = args.GetString(); var targetNodeType = (DesignNodeType)args.GetInt32(); var targetNodeID = args.GetString(); var position = args.GetString(); //inner or before or after var sourceNode = hub.DesignTree.FindNode(sourceNodeType, sourceNodeID); var targetNode = hub.DesignTree.FindNode(targetNodeType, targetNodeID); if (sourceNode == null || targetNode == null) { throw new Exception("处理拖动时无法找到相应的节点"); } //TODO: 再次验证是否允许操作,前端已验证过 //TODO:完整实现以下逻辑,暂只支持Inside if (position == "inner") { switch (sourceNodeType) { case DesignNodeType.FolderNode: throw new NotImplementedException(); case DesignNodeType.EntityModelNode: case DesignNodeType.ServiceModelNode: case DesignNodeType.ViewModelNode: case DesignNodeType.EnumModelNode: case DesignNodeType.EventModelNode: case DesignNodeType.PermissionModelNode: case DesignNodeType.WorkflowModelNode: case DesignNodeType.ReportModelNode: await DropModelNodeInside((ModelNode)sourceNode, targetNode); break; default: throw new NotSupportedException(); } } else { throw new NotImplementedException($"暂未实现 position={position}"); } return(null); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { //TODO:先判断DataStoreRootNode有没有被当前用户签出 // 获取接收到的参数 var storeType = (DataStoreKind)args.GetInt32(); var storeProvider = args.GetString(); var storeName = args.GetString(); // 验证类名称的合法性 if (string.IsNullOrEmpty(storeName)) { throw new Exception("DataStore name can not be null"); } if (!CodeHelper.IsValidIdentifier(storeName) || storeName == "Default") { throw new Exception("DataStore name invalid"); } // TODO: 验证名称是否已存在 // 开始新建存储节点 var model = new DataStoreModel(storeType, storeProvider, storeName); //添加节点至模型树并绑定签出信息 var node = hub.DesignTree.StoreRootNode.AddModel(model, hub); // 保存至本地 await node.SaveAsync(); // 新建RoslynDocument hub.TypeSystem.CreateStoreDocument(node); return(node); }
public Task <object> Handle(DesignHub hub, InvokeArgs args) { var nodeType = (DesignNodeType)args.GetInt32(); var modelID = args.GetString(); //Log.Debug($"nodeType={nodeType} modelId={modelID}"); if (nodeType == DesignNodeType.ServiceModelNode) { var modelNode = hub.DesignTree.FindModelNode(ModelType.Service, ulong.Parse(modelID)); if (modelNode != null) //可能已被删除了,即由删除节点引发的关闭设计器 { var fileName = $"{modelNode.AppNode.Model.Name}.Services.{modelNode.Model.Name}.cs"; var document = hub.TypeSystem.Workspace.GetOpenedDocumentByName(fileName); if (document != null) { hub.TypeSystem.Workspace.CloseDocument(document.Id); } } } else if (nodeType == DesignNodeType.WorkflowModelNode) { throw ExceptionHelper.NotImplemented(); //var sr = modelID.Split('.'); //var modelNode = hub.DesignTree.FindModelNode(ModelType.Workflow, sr[0], sr[1]); //hub.WorkflowDesignService.CloseWorkflowModel(modelNode); } return(Task.FromResult <object>(null)); }
public Task <object> Handle(DesignHub hub, InvokeArgs args) { int threadId = args.GetInt32(); hub.DebugService.Continue(threadId); return(Task.FromResult <object>(null)); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { int selectedNodeType = args.GetInt32(); string selectedNodeId = args.GetString(); var deleteNode = hub.DesignTree.FindNode((DesignNodeType)selectedNodeType, selectedNodeId); if (deleteNode == null) { throw new Exception("Delete target not exists."); } if (!(deleteNode is ModelNode || deleteNode is ApplicationNode || deleteNode.NodeType == DesignNodeType.FolderNode && deleteNode.Nodes.Count == 0)) { throw new Exception("Can not delete it."); } DesignNode rootNode = null; if (deleteNode is ModelNode modelNode) { rootNode = await DeleteModelNode(hub, modelNode); } else if (deleteNode is ApplicationNode appNode) { await DeleteApplicationNode(hub, appNode); } else { throw ExceptionHelper.NotImplemented(); //rootNode = DeleteFolderNode(hub, deleteNode); } //注意:返回rootNode.ID用于前端重新刷新模型根节点 return(rootNode == null ? string.Empty : rootNode.ID); }
public Task <object> Handle(DesignHub hub, InvokeArgs args) { int type = args.GetInt32(); string modelId = args.GetString(); if (type == 1) { var modelNode = hub.DesignTree.FindModelNode(ModelType.Service, ulong.Parse(modelId)); if (modelNode == null) { throw new Exception($"Cannot find ServiceModel: {modelId}"); } var quickFixes = new List <QuickFix>(); var document = hub.TypeSystem.Workspace.CurrentSolution.GetDocument(modelNode.RoslynDocumentId); var semanticModel = document.GetSemanticModelAsync().Result; IEnumerable <Diagnostic> diagnostics = semanticModel.GetDiagnostics(); return(Task.FromResult <object>(diagnostics.Select(MakeQuickFix).ToArray())); } else { throw ExceptionHelper.NotImplemented(); } }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { var refType = (ModelReferenceType)args.GetInt32(); var modelID = args.GetString(); var oldName = args.GetString(); var newName = args.GetString(); return(await RefactoringService.RenameAsync(hub, refType, ulong.Parse(modelID), oldName, newName)); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { var nodeType = (DesignNodeType)args.GetInt32(); var nodeID = args.GetString(); var node = hub.DesignTree.FindNode(nodeType, nodeID); if (node == null) { throw new Exception($"Can't find DesignNode: {nodeID}"); } var modelNode = node as ModelNode; if (modelNode != null) { var curVersion = modelNode.Model.Version; bool checkoutOk = await modelNode.Checkout(); if (!checkoutOk) { throw new Exception($"Can't checkout ModelNode: {nodeID}"); } if (curVersion != modelNode.Model.Version) { return(true); //返回True表示模型已变更,用于前端刷新 } } else if (node.NodeType == DesignNodeType.ModelRootNode) { bool checkoutOk = await node.Checkout(); if (!checkoutOk) { throw new Exception("Can't checkout ModelRootNode"); } return(true); //TODO:暂返回需要更新 } else if (node.NodeType == DesignNodeType.DataStoreNode) { bool checkoutOk = await node.Checkout(); if (!checkoutOk) { throw new Exception("Can't checkout DataStoreNode"); } return(false); } else { throw new Exception("无法签出此类型的节点"); } return(false); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { string modelId = args.GetString(); string itemName = args.GetString(); int value = args.GetInt32(); string comment = args.GetString(); var node = hub.DesignTree.FindModelNode(ModelType.Enum, ulong.Parse(modelId)); if (node == null) { throw new Exception("Can't find enum model node"); } var model = (EnumModel)node.Model; if (!node.IsCheckoutByMe) { throw new Exception("Node has not checkout"); } if (!CodeHelper.IsValidIdentifier(itemName)) { throw new Exception("Name is invalid"); } if (itemName == model.Name) { throw new Exception("Name can not same as Enum name"); } if (model.Items.FirstOrDefault(t => t.Name == itemName) != null) { throw new Exception("Name has exists"); } if (model.Items.FirstOrDefault(t => t.Value == value) != null) { throw new Exception("Value has exists"); } var item = new EnumModelItem(itemName, value); if (!string.IsNullOrEmpty(comment)) { item.Comment = comment; } model.Items.Add(item); // 保存到本地 await node.SaveAsync(null); // 更新RoslynDocument await hub.TypeSystem.UpdateModelDocumentAsync(node); return(item); }
public Task <object> Handle(DesignHub hub, InvokeArgs args) { string fileName = args.GetString(); int fileLen = args.GetInt32(); string appName = args.GetString(); if (string.IsNullOrEmpty(appName)) { throw new ArgumentException("Must asign App"); } //TODO:考虑检测系统所有内置组件是否存在相同名称的 Log.Debug($"验证上传的第三方组件: {fileName} {fileLen}"); return(Task.FromResult <object>(null)); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { var refType = (ModelReferenceType)args.GetInt32(); var modelIDString = args.GetString(); var memberName = args.GetString(); var modelId = ulong.Parse(modelIDString); ModelType modelType = IdUtil.GetModelTypeFromModelId(modelId); var modelNode = hub.DesignTree.FindModelNode(modelType, modelId); if (modelNode == null) { throw new Exception("Can't find model"); } return(await RefactoringService.FindUsagesAsync(hub, refType, modelNode.AppNode.Model.Name, modelNode.Model.Name, memberName)); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { var nodeType = (DesignNodeType)args.GetInt32(); var modelID = args.GetString(); object[] modelInfo = null; if (nodeType == DesignNodeType.ViewModelNode) { modelInfo = new object[4]; modelInfo[0] = args.GetString(); modelInfo[1] = args.GetString(); modelInfo[2] = args.GetString(); modelInfo[3] = args.GetString(); } else if (nodeType == DesignNodeType.ReportModelNode) { modelInfo = new object[1]; modelInfo[0] = args.GetString(); } var node = hub.DesignTree.FindNode(nodeType, modelID); if (node == null) { throw new Exception("Can't find node: " + modelID); } var modelNode = node as ModelNode; if (modelNode == null) { throw new Exception("Node must be ModelNode "); } //开始保存 await modelNode.SaveAsync(modelInfo); return(null); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { // 获取接收到的参数 string modelId = args.GetString(); string memberName = args.GetString(); int entityMemberType = args.GetInt32(); var node = hub.DesignTree.FindModelNode(ModelType.Entity, ulong.Parse(modelId)); if (node == null) { throw new Exception("Can't find entity model node"); } var model = (EntityModel)node.Model; if (!node.IsCheckoutByMe) { throw new Exception("Node has not checkout"); } if (!CodeHelper.IsValidIdentifier(memberName)) { throw new Exception("Name is invalid"); } if (memberName == model.Name) { throw new Exception("Name can not same as Entity name"); } if (model.Members.FindIndex(t => t.Name == memberName) >= 0) //if (model.ContainsMember(memberName)) { throw new Exception("Name has exists"); } EntityMemberModel res = entityMemberType switch { (int)EntityMemberType.DataField => NewDataField(model, memberName, ref args), (int)EntityMemberType.EntityRef => NewEntityRef(hub, model, memberName, ref args), (int)EntityMemberType.EntitySet => NewEntitySet(hub, model, memberName, ref args), _ => throw new NotImplementedException($"未实现的成员类型: {entityMemberType}"), };
public Task <object> Handle(DesignHub hub, InvokeArgs args) { var modelID = args.GetString(); var memeberName = args.GetString(); var propertyName = args.GetString(); var modelNode = hub.DesignTree.FindModelNode(ModelType.Enum, ulong.Parse(modelID)); if (modelNode == null) { throw new Exception("Can't find Enum node"); } var model = (EnumModel)modelNode.Model; var item = model.Items.FirstOrDefault(t => t.Name == memeberName); if (item == null) { throw new Exception($"Can't find Enum item: {memeberName}"); } if (propertyName == "Comment") { var propertyValue = args.GetString(); item.Comment = propertyValue; } else if (propertyName == "Value") { var v = args.GetInt32(); if (model.Items.FirstOrDefault(t => t.Value == v && t.Name != memeberName) != null) { throw new Exception("Value has exists"); } item.Value = v; //TODO:***签出所有此成员的引用项,如服务模型需要重新编译发布 } return(Task.FromResult <object>(true)); }
public async ValueTask <AnyValue> InvokeAsync(ReadOnlyMemory <char> method, InvokeArgs args) { switch (method) { case ReadOnlyMemory <char> s when s.Span.SequenceEqual(nameof(GetGauges)): return(AnyValue.From(await GetGauges())); case ReadOnlyMemory <char> s when s.Span.SequenceEqual(nameof(GetNodes)): return(AnyValue.From(await GetNodes())); case ReadOnlyMemory <char> s when s.Span.SequenceEqual(nameof(GetParts)): return(AnyValue.From(await GetParts())); case ReadOnlyMemory <char> s when s.Span.SequenceEqual(nameof(SetAsMeta)): return(AnyValue.From(await SetAsMeta(args.GetString(), args.GetString(), args.GetInt32()))); case ReadOnlyMemory <char> s when s.Span.SequenceEqual(nameof(PromoteReplFactor)): return(AnyValue.From(await PromoteReplFactor())); default: throw new Exception($"Can't find method: {method}"); } }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { string fileName = args.GetString(); int line = args.GetInt32() - 1; //注意:前端传过来的值需要-1 int column = args.GetInt32() - 1; var document = hub.TypeSystem.Workspace.GetOpenedDocumentByName(fileName); if (document == null) { throw new Exception($"Cannot find opened document: {fileName}"); } var invocation = await GetInvocation(document, line, column); if (invocation == null) { return(null); } var response = new SignatureHelpResponse(); // define active parameter by position foreach (var comma in invocation.Separators) { if (comma.Span.Start > invocation.Position) { break; } response.ActiveParameter += 1; } // process all signatures, define active signature by types var signaturesSet = new HashSet <SignatureHelpItem>(); var bestScore = int.MinValue; SignatureHelpItem bestScoredItem = null; var types = invocation.ArgumentTypes; ISymbol throughSymbol = null; ISymbol throughType = null; var methodGroup = invocation.SemanticModel.GetMemberGroup(invocation.Receiver).OfType <IMethodSymbol>(); if (invocation.Receiver is MemberAccessExpressionSyntax) { var throughExpression = ((MemberAccessExpressionSyntax)invocation.Receiver).Expression; throughSymbol = invocation.SemanticModel.GetSpeculativeSymbolInfo(invocation.Position, throughExpression, SpeculativeBindingOption.BindAsExpression).Symbol; throughType = invocation.SemanticModel.GetSpeculativeTypeInfo(invocation.Position, throughExpression, SpeculativeBindingOption.BindAsTypeOrNamespace).Type; var includeInstance = (throughSymbol != null && !(throughSymbol is ITypeSymbol)) || throughExpression is LiteralExpressionSyntax || throughExpression is TypeOfExpressionSyntax; var includeStatic = (throughSymbol is INamedTypeSymbol) || throughType != null; methodGroup = methodGroup.Where(m => (m.IsStatic && includeStatic) || (!m.IsStatic && includeInstance)); } else if (invocation.Receiver is SimpleNameSyntax && invocation.IsInStaticContext) { methodGroup = methodGroup.Where(m => m.IsStatic || m.MethodKind == MethodKind.LocalFunction); } foreach (var methodOverload in methodGroup) { var signature = BuildSignature(methodOverload); signaturesSet.Add(signature); var score = InvocationScore(methodOverload, types); if (score > bestScore) { bestScore = score; bestScoredItem = signature; } } var signaturesList = signaturesSet.ToList(); response.Signatures = signaturesList; response.ActiveSignature = signaturesList.IndexOf(bestScoredItem); return(response); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { // 获取接收到的参数 int selectedNodeType = args.GetInt32(); string selectedNodeId = args.GetString(); var name = args.GetString(); // 验证类名称的合法性 if (string.IsNullOrEmpty(name) || !CodeHelper.IsValidIdentifier(name)) { throw new Exception("Enum name invalid"); } //获取选择的节点 var selectedNode = hub.DesignTree.FindNode((DesignNodeType)selectedNodeType, selectedNodeId); if (selectedNode == null) { throw new Exception("Can't find selected node"); } //根据选择的节点获取合适的插入位置 var parentNode = hub.DesignTree.FindNewModelParentNode(selectedNode, out uint appId, ModelType.Enum); if (parentNode == null) { throw new Exception("Can't find parent node"); } //判断名称是否已存在 if (hub.DesignTree.FindModelNodeByName(appId, ModelType.Enum, name) != null) { throw new Exception("Enum name has exists"); } //判断当前模型根节点有没有签出 var rootNode = hub.DesignTree.FindModelRootNode(appId, ModelType.Enum); bool rootNodeHasCheckout = rootNode.IsCheckoutByMe; if (!await rootNode.Checkout()) { throw new Exception($"Can't checkout: {rootNode.FullName}"); } //注意:需要重新引用上级文件夹节点,因自动签出上级节点可能已重新加载 //if (!rootNodeHasCheckout && parentNode.NodeType == DesignNodeType.FolderNode) //{ // parentNode = rootNode.FindFolderNode(((FolderNode)parentNode).Folder.ID); // if (parentNode == null) // throw new Exception("上级节点已不存在,请刷新重试"); //} //生成模型标识号并新建模型及节点 var modelId = await Store.ModelStore.GenModelIdAsync(appId, ModelType.Enum, ModelLayer.DEV); //TODO:fix Layer var model = new EnumModel(modelId, name); var node = new ModelNode(model, hub); //添加至设计树 var insertIndex = parentNode.Nodes.Add(node); //设置文件夹 if (parentNode.NodeType == DesignNodeType.FolderNode) { model.FolderId = ((FolderNode)parentNode).Folder.Id; } // 添加至根节点索引内 rootNode.AddModelIndex(node); //设为签出状态 node.CheckoutInfo = new CheckoutInfo(node.NodeType, node.CheckoutInfoTargetID, model.Version, hub.Session.Name, hub.Session.LeafOrgUnitID); // 保存至本地 await node.SaveAsync(null); // 新建Roslyn相关 await hub.TypeSystem.CreateModelDocumentAsync(node); return(new NewNodeResult { ParentNodeType = (int)parentNode.NodeType, ParentNodeID = parentNode.ID, NewNode = node, RootNodeID = rootNodeHasCheckout ? null : rootNode.ID, InsertIndex = insertIndex }); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { // 获取接收到的参数 int selectedNodeType = args.GetInt32(); var selectedNodeId = args.GetString(); var name = args.GetString(); var localizedName = args.GetString(); var storeName = args.GetString(); var orderByDesc = args.GetBoolean(); // 验证类名称的合法性 if (string.IsNullOrEmpty(name)) { throw new Exception("Entity name empty"); } if (!CodeHelper.IsValidIdentifier(name)) { throw new Exception("Entity name invalid"); } //获取选择的节点 var selectedNode = hub.DesignTree.FindNode((DesignNodeType)selectedNodeType, selectedNodeId); if (selectedNode == null) { throw new Exception("Can't find selected node"); } //根据选择的节点获取合适的插入位置 var parentNode = hub.DesignTree.FindNewModelParentNode(selectedNode, out uint appId, ModelType.Entity); if (parentNode == null) { throw new Exception("Can't find parent node"); } //判断名称是否已存在 if (hub.DesignTree.FindModelNodeByName(appId, ModelType.Entity, name) != null) { throw new Exception("Entity name has exists"); } //判断当前模型根节点有没有签出 var rootNode = hub.DesignTree.FindModelRootNode(appId, ModelType.Entity); bool rootNodeHasCheckout = rootNode.IsCheckoutByMe; if (!await rootNode.Checkout()) { throw new Exception($"Can't checkout: {rootNode.FullName}"); } ////注意:需要重新引用上级文件夹节点,因自动签出上级节点可能已重新加载 //if (!rootNodeHasCheckout && parentNode.NodeType == DesignNodeType.FolderNode) //{ // parentNode = rootNode.FindFolderNode(((FolderNode)parentNode).Folder.ID); // if (parentNode == null) // throw new Exception("上级节点已不存在,请刷新重试"); //} //生成模型标识号并新建模型及节点 var modelId = await Store.ModelStore.GenModelIdAsync(appId, ModelType.Entity, ModelLayer.DEV); //TODO:fix Layer //根据映射的存储创建相应的实体模型 EntityModel entityModel; if (string.IsNullOrEmpty(storeName)) { throw new NotImplementedException("Create DTO is not implemented."); } #if FUTURE else if (storeName == "Default") { entityModel = new EntityModel(modelId, name, EntityStoreType.StoreWithMvcc, orderByDesc); //TODO: fix without mvcc } #endif else { var storeNode = hub.DesignTree.FindDataStoreNodeByName(storeName); if (storeNode == null) { throw new Exception($"Can't find store: {storeName}"); } IEntityStoreOptions storeOptions; if (storeNode.Model.Kind == DataStoreKind.Sql) { storeOptions = new SqlStoreOptions(storeNode.Model.Id); } else { storeOptions = new CqlStoreOptions(storeNode.Model.Id); } entityModel = new EntityModel(modelId, name, storeOptions); } //if (!string.IsNullOrWhiteSpace(localizedName)) //entityModel.LocalizedName.Value = localizedName; //添加至设计树 var node = new ModelNode(entityModel, hub); var insertIndex = parentNode.Nodes.Add(node); // 设置文件夹 if (parentNode.NodeType == DesignNodeType.FolderNode) { entityModel.FolderId = ((FolderNode)parentNode).Folder.Id; } // 添加至根节点索引内 rootNode.AddModelIndex(node); // 设为签出状态 node.CheckoutInfo = new CheckoutInfo(node.NodeType, node.CheckoutInfoTargetID, entityModel.Version, hub.Session.Name, hub.Session.LeafOrgUnitID); //保存至Staged await node.SaveAsync(null); // 新建RoslynDocument await hub.TypeSystem.CreateModelDocumentAsync(node); return(new NewNodeResult { ParentNodeType = (int)parentNode.NodeType, ParentNodeID = parentNode.ID, NewNode = node, RootNodeID = rootNodeHasCheckout ? null : rootNode.ID, InsertIndex = insertIndex }); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { string fileName = args.GetString(); int line = args.GetInt32(); int column = args.GetInt32(); var doc = hub.TypeSystem.Workspace.GetOpenedDocumentByName(fileName); if (doc == null) { throw new Exception(string.Format("Cannot find opened document: {0}", fileName)); } //获取当前Symbol var semanticModel = await doc.GetSemanticModelAsync(); var sourceText = await doc.GetTextAsync(); var position = sourceText.Lines.GetPosition(new LinePosition(line - 1, column - 1)); //注意:前端传过来的值需要-1 var symbol = await SymbolFinder.FindSymbolAtPositionAsync(semanticModel, position, hub.TypeSystem.Workspace); if (symbol == null) { return(null); } //判断当前是否在调试暂停中, TODO:判断是否调试目标调试服务 if (hub.DebugService.IsPause) { var ct = new CancellationToken(); var tipInfo = await DataTipInfoGetter.GetInfoAsync(doc, position, ct); var text = tipInfo.Text; if (text == null && !tipInfo.IsDefault) { text = sourceText.GetSubText(tipInfo.Span).ToString(); } var root = await semanticModel.SyntaxTree.GetRootAsync(ct).ConfigureAwait(false); var syntaxNode = root.FindNode(tipInfo.Span); if (syntaxNode == null) { //Log.Warn($"SyntaxNode is null, 表达式:{tipInfo.Text}"); tipInfo = new DebugDataTipInfo(tipInfo.Span, text); } else { tipInfo = DataTipInfoGetter.GetInfo(root, semanticModel, syntaxNode, text, ct); //Log.Warn($"SyntaxNode: {syntaxNode} type:{syntaxNode.GetType().Name} 表达式:{tipInfo.Text}"); } //TODO:暂简单实现,判断symbol是否变量 if (symbol is ILocalSymbol || symbol is IParameterSymbol || symbol is IPropertySymbol || symbol is IFieldSymbol) { var expression = tipInfo.Text; //expression = "var emp = __context.emp;\nemp.ToString()"; //TODO: 根据虚拟类型转换请求,重新实现SymbolReader //https://github.com/Samsung/netcoredbg/issues/28 netcoredbg暂无法计算emp.ToJson(),即无法计算方法 //var typeSymbol = TypeHelper.GetSymbolType(symbol) as INamedTypeSymbol; //if (TypeHelper.IsEntityClass(typeSymbol)) //{ //} var waithandler = new AutoResetEvent(false); string symbolValue = "取值超时"; hub.DebugService.Evaluate(expression, res => { symbolValue = res; waithandler.Set(); }); waithandler.WaitOne(5000); var type = TypeHelper.GetSymbolType(symbol); return(new Hover() { StartLine = line, StartColumn = column, EndLine = line, EndColumn = column, Contents = new object[] { $"**{type}**", symbolValue } }); } return(null); } return(new Hover() { StartLine = line, StartColumn = column, EndLine = line, EndColumn = column, Contents = new object[] { symbol.ToDisplayString() } }); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { //读取参数 int selectedNodeType = args.GetInt32(); string selectedNodeId = args.GetString(); string name = args.GetString(); if (string.IsNullOrEmpty(name)) { throw new Exception("名称不能为空"); } //获取选择的节点 var selectedNode = hub.DesignTree.FindNode((DesignNodeType)selectedNodeType, selectedNodeId); if (selectedNode == null) { throw new Exception("无法找到当前节点"); } //根据选择的节点获取合适的插入位置 var parentNode = hub.DesignTree.FindNewFolderParentNode(selectedNode, out uint appId, out ModelType modelType); if (parentNode == null) { throw new Exception("无法找到上级节点"); } if (parentNode.Nodes.Exists(t => t.NodeType == DesignNodeType.FolderNode && t.Text == name)) { throw new Exception("当前目录下已存在同名文件夹"); } //判断当前模型根节点有没有签出 var rootNode = hub.DesignTree.FindModelRootNode(appId, modelType); bool rootNodeHasCheckout = rootNode.IsCheckoutByMe; if (!await rootNode.Checkout()) { throw new Exception($"Can't checkout: {rootNode.FullName}"); } ////注意:需要重新引用上级文件夹节点,因自动签出上级节点可能已重新加载 //if (!rootNodeHasCheckout && parentNode.NodeType == DesignNodeType.FolderNode) //{ // parentNode = rootNode.FindFolderNode(((FolderNode)parentNode).Folder.ID); // if (parentNode == null) // throw new Exception("上级节点已不存在,请刷新重试"); //} // 判断选择节点即parentNode是文件夹还是模型根节点 ModelFolder model = null; if (parentNode.NodeType == DesignNodeType.FolderNode) { model = new ModelFolder(((FolderNode)parentNode).Folder, name); } else if (parentNode.NodeType == DesignNodeType.ModelRootNode) { //判断是否存在根文件夹 if (rootNode.RootFolder == null) { rootNode.RootFolder = new ModelFolder(appId, rootNode.TargetType); } model = new ModelFolder(rootNode.RootFolder, name); } else { throw new Exception("不允许在此节点创建文件夹"); } var node = new FolderNode(model); //添加至设计树 var insertIndex = parentNode.Nodes.Add(node); // 添加至根节点索引内 rootNode.AddFolderIndex(node); // 保存到本地 await node.SaveAsync(); return(new NewNodeResult { ParentNodeType = (int)parentNode.NodeType, ParentNodeID = parentNode.ID, NewNode = node, RootNodeID = rootNodeHasCheckout ? null : rootNode.ID, InsertIndex = insertIndex }); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { int type = args.GetInt32(); //TODO: remove it string fileName = args.GetString(); int line = args.GetInt32() - 1; //注意:前端传过来的值需要-1 int column = args.GetInt32() - 1; string wordToComplete = args.GetString(); WantsType wants = WantsType.WantDocumentationForEveryCompletionResult | WantsType.WantKind | WantsType.WantReturnType; //暂默认 var completions = new HashSet <AutoCompleteItem>(); var document = hub.TypeSystem.Workspace.GetOpenedDocumentByName(fileName); if (document == null) { throw new Exception($"Cannot find opened document: {fileName}"); } var sourceText = await document.GetTextAsync(); var position = sourceText.Lines.GetPosition(new LinePosition(line, column)); var service = CompletionService.GetService(document); var completionList = await service.GetCompletionsAsync(document, position); if (completionList != null) { // Only trigger on space if Roslyn has object creation items //if (request.TriggerCharacter == " " && !completionList.Items.Any(i => i.IsObjectCreationCompletionItem())) //{ // return completions; //} // get recommened symbols to match them up later with SymbolCompletionProvider var semanticModel = await document.GetSemanticModelAsync(); var recommendedSymbols = await Recommender.GetRecommendedSymbolsAtPositionAsync(semanticModel, position, hub.TypeSystem.Workspace); foreach (var item in completionList.Items) { var completionText = item.DisplayText; if (completionText.IsValidCompletionFor(wordToComplete)) { var symbols = await item.GetCompletionSymbolsAsync(recommendedSymbols, document); if (symbols.Any()) { foreach (var symbol in symbols) { if (item.UseDisplayTextAsCompletionText()) { completionText = item.DisplayText; } else if (item.TryGetInsertionText(out var insertionText)) { completionText = insertionText; } else { completionText = symbol.Name; } if (symbol != null) { if ((wants & WantsType.WantSnippet) == WantsType.WantSnippet) { // foreach (var completion in MakeSnippetedResponses(request, symbol, completionText)) // { // completions.Add(completion); // } } else { completions.Add(MakeAutoCompleteResponse(wants, symbol, completionText)); } } } // if we had any symbols from the completion, we can continue, otherwise it means // the completion didn't have an associated symbol so we'll add it manually continue; } // for other completions, i.e. keywords, create a simple AutoCompleteResponse // we'll just assume that the completion text is the same // as the display text. var response = new AutoCompleteItem() { CompletionText = item.DisplayText, DisplayText = item.DisplayText, Snippet = item.DisplayText, Kind = (wants & WantsType.WantKind) == WantsType.WantKind ? item.Tags.First() : null }; completions.Add(response); } } } //todo: 处理overloads return(completions .OrderByDescending(c => c.CompletionText.IsValidCompletionStartsWithExactCase(wordToComplete)) .ThenByDescending(c => c.CompletionText.IsValidCompletionStartsWithIgnoreCase(wordToComplete)) .ThenByDescending(c => c.CompletionText.IsCamelCaseMatch(wordToComplete)) .ThenByDescending(c => c.CompletionText.IsSubsequenceMatch(wordToComplete)) .ThenBy(c => c.DisplayText, StringComparer.OrdinalIgnoreCase) .ThenBy(c => c.CompletionText, StringComparer.OrdinalIgnoreCase) .ToArray()); }
public async Task <object> Handle(DesignHub hub, InvokeArgs args) { //读取参数 int selectedNodeType = args.GetInt32(); string selectedNodeId = args.GetString(); string newname = args.GetString(); //先判断名称有效性 if (string.IsNullOrEmpty(newname)) { throw new Exception("名称不能为空"); } if (!CodeHelper.IsValidIdentifier(newname)) { throw new Exception("名称包含无效字符"); } //获取选择的节点 var selectedNode = hub.DesignTree.FindNode((DesignNodeType)selectedNodeType, selectedNodeId); if (selectedNode == null) { throw new Exception("无法找到当前节点"); } //根据选择的节点获取合适的插入位置 var parentNode = hub.DesignTree.FindNewModelParentNode(selectedNode, out uint appId, ModelType.View); if (parentNode == null) { throw new Exception("无法找到当前节点的上级节点"); } //判断名称是否已存在 if (hub.DesignTree.FindModelNodeByName(appId, ModelType.View, newname) != null) { throw new Exception("View name has exists"); } //判断当前模型根节点有没有签出 var rootNode = hub.DesignTree.FindModelRootNode(appId, ModelType.View); bool rootNodeHasCheckout = rootNode.IsCheckoutByMe; if (!await rootNode.Checkout()) { throw new Exception($"Can't checkout: {rootNode.FullName}"); } ////注意:需要重新引用上级文件夹节点,因自动签出上级节点可能已重新加载 //if (!rootNodeHasCheckout && parentNode.NodeType == DesignNodeType.FolderNode) //{ // parentNode = rootNode.FindFolderNode(((FolderNode)parentNode).Folder.ID); // if (parentNode == null) // throw new Exception("上级节点已不存在,请刷新重试"); //} //生成模型标识号并新建模型及节点 var modelId = await Store.ModelStore.GenModelIdAsync(appId, ModelType.View, ModelLayer.DEV); //TODO:fix Layer var model = new ViewModel(modelId, newname); var node = new ModelNode(model, hub); //添加至设计树 var insertIndex = parentNode.Nodes.Add(node); //设置文件夹 if (parentNode.NodeType == DesignNodeType.FolderNode) { model.FolderId = ((FolderNode)parentNode).Folder.Id; } //添加至根节点索引内 rootNode.AddModelIndex(node); //设为签出状态 node.CheckoutInfo = new CheckoutInfo(node.NodeType, node.CheckoutInfoTargetID, model.Version, hub.Session.Name, hub.Session.LeafOrgUnitID); //保存至本地 var templateCode = "<div>Hello Future!</div>"; var scriptCode = $"@Component\nexport default class {model.Name} extends Vue {{\n\n}}\n"; await node.SaveAsync(new object[] { templateCode, scriptCode, string.Empty, string.Empty }); //ViewModel无需新建RoslynDocument return(new NewNodeResult() { ParentNodeType = (int)parentNode.NodeType, ParentNodeID = parentNode.ID, NewNode = node, RootNodeID = rootNodeHasCheckout ? null : rootNode.ID, InsertIndex = insertIndex }); }