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());
        }
Beispiel #2
0
        //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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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));
        }
Beispiel #6
0
        public Task <object> Handle(DesignHub hub, InvokeArgs args)
        {
            int threadId = args.GetInt32();

            hub.DebugService.Continue(threadId);
            return(Task.FromResult <object>(null));
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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();
            }
        }
Beispiel #9
0
        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));
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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));
        }
Beispiel #13
0
        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));
        }
Beispiel #14
0
        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);
        }
Beispiel #15
0
        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}"),
            };
Beispiel #16
0
        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));
        }
Beispiel #17
0
        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}");
            }
        }
Beispiel #18
0
        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);
        }
Beispiel #19
0
        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
            });
        }
Beispiel #20
0
        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
            });
        }
Beispiel #21
0
        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() }
            });
        }
Beispiel #22
0
        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
            });
        }
Beispiel #23
0
        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());
        }
Beispiel #24
0
        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
            });
        }