public bool Compile(SquirrelVersion sv, string src, ref SQCompileError err)
 {
     /*if (sv == SquirrelVersion.Squirrel2)
      * {
      *  Squirrel.Squirrel2.CompilerError cr = null;
      *  if (!c2.Compile(src, ref cr))
      *  {
      *      err = new SQCompileError();
      *      err.column = cr.column;
      *      err.line = cr.line;
      *      err.error = cr.error;
      *      return false;
      *  }
      *  return true;
      * }*/
     if (sv == SquirrelVersion.Squirrel3)
     {
         Squirrel.Squirrel3.CompilerError cr = null;
         if (!c3.Compile(src, ref cr))
         {
             err        = new SQCompileError();
             err.column = cr.column;
             err.line   = cr.line;
             err.error  = cr.error;
             return(false);
         }
         return(true);
     }
     err       = new SQCompileError();
     err.error = "invalid language version selected";
     return(false);
 }
        public bool Compile(ITextBuffer buffer, ref SQCompileError error)
        {
            bool   result   = _instance.Compile(buffer.CurrentSnapshot.GetText(), ref error);
            string filepath = SQLanguageServiceEX.GetFileName(buffer);

            RegisterError(true, null, filepath, ref error);
            return(result);
        }
        public void Parse()
        {
            string[] freshfiles;
            var      buffers = GetLoadedBuffers(out freshfiles);

            foreach (var buffer in buffers)
            {
                bool newversion;
                Parse(buffer, out newversion);
            }

            foreach (var file in freshfiles)
            {
                if (File.Exists(file))
                {
                    SQCompileError e = null;
                    Parse(file);
                }
            }
        }
        public IEnumerable <ITagSpan <ErrorTag> > GetTags(NormalizedSnapshotSpanCollection spans)
        {
            ITextSnapshot  currentSnapshot = _buffer.CurrentSnapshot;
            SQCompileError error           = null;

            if (firsttime)
            {
                _languangeService.Compile(_buffer, ref error);
                firsttime = false;
            }
            else
            {
                error = _languangeService.GetError(filepath);
            }
            if (error != null)
            {
                SnapshotSpan?span = null;
                try
                {
                    ITextSnapshot     shot = _buffer.CurrentSnapshot;
                    ITextSnapshotLine line = shot.GetLineFromLineNumber(error.line - 1);
                    int c        = error.column - 1;
                    int length   = Math.Max(line.Length - c, 1);
                    int startadd = Math.Min(line.Length, c);
                    span = new SnapshotSpan(line.Start + startadd, length);
                }
                catch (Exception)
                {
                }

                if (span != null)
                {
                    // if (ForceNewVersion)
                    //   TagsChanged(this, new SnapshotSpanEventArgs(span.Value));
                    yield return(new TagSpan <ErrorTag>(span.Value, new ErrorTag("Error", error.error)));
                }
            }
            ForceNewVersion = false;
        }
        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);
            }
        }
Example #6
0
        //int lastVersion = -1;
        public IEnumerable <ITagSpan <ClassificationTag> > GetTags(NormalizedSnapshotSpanCollection spans)
        {
            if (spans.Count == 0)
            {
                yield break;
            }

            ITextSnapshot currentSnapshot = _buffer.CurrentSnapshot;

            SQCompileError error = null;
            bool           newversion;

            _languangeService.Parse(_buffer, out newversion, ref error);
            var ts = _languangeService.GetClassificationInfo(filepath);

            // int currentVersion = _buffer.CurrentSnapshot.Version.VersionNumber;
            List <SnapshotSpan> keywordspans   = new List <SnapshotSpan>();
            List <SnapshotSpan> nokeywordspans = new List <SnapshotSpan>();
            List <TagSpan <ClassificationTag> > _currentTags = new List <TagSpan <ClassificationTag> >();
            var cachekeys = _languangeService.GetKeywordSpans(filepath);

            if (cachekeys == null || newversion)
            {
                //_currentTags.Clear();
                var      textstructnav = _textStructureNavigatorSelector.GetTextStructureNavigator(_buffer);
                FindData fd            = new FindData();
                fd.TextStructureNavigator = textstructnav;
                fd.FindOptions            = FindOptions.WholeWord | FindOptions.MatchCase;
                foreach (SnapshotSpan curSpan in spans)
                {
                    fd.TextSnapshotToSearch = curSpan.Snapshot;
                    foreach (string key in _sqTypes.Keys)
                    {
                        fd.SearchString = key;
                        var result = _textSearchService.FindAll(fd);
                        keywordspans.AddRange(result);
                    }
                }
                _languangeService.SetKeywordCache(filepath, keywordspans.ToArray());
            }
            else
            {
                keywordspans.AddRange(cachekeys);
            }



            foreach (var t in ts)
            {
                TextSpan scope = t.Item2;
                if (t.Item4 == SQDeclarationType.Class ||
                    t.Item4 == SQDeclarationType.Enum)
                {
                    scope = t.Item1;
                }
                if (scope.iEndLine == -1 || scope.iStartLine == -1 ||
                    scope.iEndLine >= currentSnapshot.LineCount || scope.iStartLine >= currentSnapshot.LineCount)
                {
                    continue;
                }

                int           length         = 0;
                string        collpasedlabel = t.Item3;
                SnapshotPoint?start          = null;
                try
                {
                    var startLine = currentSnapshot.GetLineFromLineNumber(scope.iStartLine);
                    var endLine   = currentSnapshot.GetLineFromLineNumber(scope.iEndLine);
                    start  = startLine.Start + scope.iStartIndex;
                    length = (endLine.Start - startLine.Start) + scope.iEndIndex - scope.iStartIndex;
                    if (start.Value.Position + length >= currentSnapshot.Length)
                    {
                        length = currentSnapshot.Length - start.Value.Position;
                    }
                }
                catch (Exception)
                {
                    length = 0;
                }
                if (length > 0 && start != null)
                {
                    SnapshotSpan snap = new SnapshotSpan(start.Value, length);
                    if (newversion)
                    {
                        TagsChanged(this, new SnapshotSpanEventArgs(snap));
                    }
                    switch (t.Item4)
                    {
                    case SQDeclarationType.AttributeScope:
                        nokeywordspans.Add(snap);
                        _currentTags.Add(new TagSpan <ClassificationTag>(snap, _attribtag));
                        break;

                    case SQDeclarationType.CommentScope:
                        nokeywordspans.Add(snap);
                        _currentTags.Add(new TagSpan <ClassificationTag>(snap, _commenttag));
                        break;

                    case SQDeclarationType.LiteralScope:
                        nokeywordspans.Add(snap);
                        _currentTags.Add(new TagSpan <ClassificationTag>(snap, _stringtag));
                        break;

                    case SQDeclarationType.Extend:
                    case SQDeclarationType.Class:
                        _currentTags.Add(new TagSpan <ClassificationTag>(snap, _classtag));
                        break;

                    case SQDeclarationType.Enum:
                        _currentTags.Add(new TagSpan <ClassificationTag>(snap, _enumtag));
                        break;

                    case SQDeclarationType.SubName:
                        _currentTags.Add(new TagSpan <ClassificationTag>(snap, _subnametag));
                        break;

                    case SQDeclarationType.Number:
                        _currentTags.Add(new TagSpan <ClassificationTag>(snap, _numberictag));
                        break;
                    }
                }
            }

            foreach (var kwspan in keywordspans)
            {
                bool cancel = false;
                foreach (var nokwspan in nokeywordspans)
                {
                    if (nokwspan.Contains(kwspan.Start.Position))//nokwspan.IntersectsWith(kwspan))
                    {
                        cancel = true;
                        break;
                    }
                }
                if (cancel)
                {
                    continue;
                }
                if (newversion)
                {
                    TagsChanged(this, new SnapshotSpanEventArgs(kwspan));
                }

                _currentTags.Add(new TagSpan <ClassificationTag>(kwspan, _keywordtag));
            }

            foreach (var t in _currentTags)
            {
                yield return(t);
            }
        }
 public bool Compile(string src, ref SQCompileError error)
 {
     return(_compiler.Compile(_version, src, ref error));
 }