public ErrorTask PostMessage(TaskErrorCategory type, TaskCategory category, CompleteErrorEvent completeError, bool writelog, string key, string msg, params string[] args)
        {
            ErrorTask result  = null;
            string    message = args.Length > 0 ? string.Format(msg + "\n", args) : msg;

            if (type == TaskErrorCategory.Error ||
                type == TaskErrorCategory.Warning)
            {
                if (!_errorCache.ContainsKey(key))
                {
                    ErrorTask error = new ErrorTask();
                    error.Category = category;
                    error.Removed += (sender, e) =>
                    {
                        _errorCache.Remove(key);
                    };
                    error.Text          = message;
                    error.ErrorCategory = type;
                    completeError?.Invoke(error);
                    _errorlist.Tasks.Add(error);
                    _errorlist.Show();
                    _errorCache[key] = error;
                    if (writelog)
                    {
                        WriteLine("{0} - {1}", key, message);
                    }
                    result = error;
                }
                else
                {
                    result = _errorCache[key];
                }
            }
            else if (writelog)
            {
                WriteLine("{0} - {1}", key, message);
            }

            return(result);
        }
        void RegisterError(bool isnewversion, SQDeclaration d, string filepath, ref SQCompileError error)
        {
            if (isnewversion)
            {
                RemoveNodesWithFilepath(filepath);
                _nodeErrors.Remove(filepath);
                if (error != null)
                {
                    _nodeErrors[filepath] = error;
                }

                _errorHandler.RemoveMessageWithPartialKey(filepath);
                //RemoveNodesWithFilepath(filepath);
                //MapObjects(GetNode(filepath), d);
            }
            _nodeErrors.TryGetValue(filepath, out error);
            if (isnewversion && error != null)
            {
                TextSpan ts = new TextSpan();
                ts.iStartLine  = ts.iEndLine = error.line - 1;
                ts.iStartIndex = error.column - 1;
                string             key  = GenerateMessageKey(filepath, ts);
                CompleteErrorEvent func = new CompleteErrorEvent((e) =>
                {
                    e.Line          = ts.iStartLine;
                    e.Column        = ts.iStartIndex;
                    e.Document      = filepath;
                    e.HierarchyItem = GetNode(filepath);
                    int length      = ts.iEndIndex - ts.iStartIndex;
                    e.Navigate     += (s, ee) =>
                    {
                        SQVSUtils.OpenDocumentInNewWindow(filepath, _serviceProvider, ts.iStartLine, ts.iStartIndex, 1);
                    };
                });
                _errorHandler.PostMessage(TaskErrorCategory.Error, TaskCategory.CodeSense, func, false, key, error.error);
            }
        }