예제 #1
0
        public ParseInformation Parse(FileName fileName, ITextSource fileContent, bool fullParseInformationRequested,
                                      IProject parentProject, CancellationToken cancellationToken)
        {
            AXmlParser             parser = new AXmlParser();
            AXmlDocument           document;
            IncrementalParserState newParserState;

            if (fileContent.Version is OnDiskTextSourceVersion)
            {
                document       = parser.Parse(fileContent, cancellationToken);
                newParserState = null;
            }
            else
            {
                document = parser.ParseIncremental(parserState, fileContent, out newParserState, cancellationToken);
            }
            parserState = newParserState;
            XamlUnresolvedFile unresolvedFile = XamlUnresolvedFile.Create(fileName, fileContent, document);
            ParseInformation   parseInfo;

            if (fullParseInformationRequested)
            {
                parseInfo = new XamlFullParseInformation(unresolvedFile, document, fileContent.CreateSnapshot());
            }
            else
            {
                parseInfo = new ParseInformation(unresolvedFile, fileContent.Version, false);
            }
            AddTagComments(document, parseInfo, fileContent);
            return(parseInfo);
        }
        public static void Run(string fileName)
        {
            var textSource = new StringTextSource(File.ReadAllText(fileName));

            using (var textReader = textSource.CreateReader())
            {
                using (var xmlReader = new XmlTextReader(textReader))
                {
                    Run(xmlReader);
                }
            }
            var doc = new AXmlParser().Parse(textSource);

            using (var xmlReader = doc.CreateReader())
            {
                Run(xmlReader);
            }
            var xmlDocument = new XmlDocument();

            xmlDocument.Load(doc.CreateReader());
            xmlDocument.Save(Path.Combine(Program.TempPath, "savedXmlDocument.xml"));
            var xDocument = XDocument.Load(doc.CreateReader());

            xDocument.Save(Path.Combine(Program.TempPath, "savedXDocument.xml"));
        }
예제 #3
0
        public static Context CreateContext(AbsoluteFilePath filePath, string code, int offset, SourcePackage package)
        {
            var parser = new AXmlParser();
            var result = parser.Parse(new StringTextSource(code));
            var file   = new SourceFile(package, filePath.NativePath, code);

            return(new Context(file, result, offset));
        }
예제 #4
0
        static int TryGetElementIndex(string xml, TextPosition caretPosition)
        {
            try
            {
                var normalizedXml = xml.NormalizeLineEndings();
                var offset        = caretPosition.ToOffset(normalizedXml);
                var parser        = new AXmlParser();
                var tagsoup       = parser.ParseTagSoup(new StringTextSource(normalizedXml));
                var elements      = RemoveJavaScript(tagsoup.OfType <AXmlTag>());

                return(elements
                       .Where(e => !e.IsEndTag && !e.IsComment && e.ClosingBracket != "")
                       .IndexOfFirst(obj => obj.StartOffset <= offset && offset < obj.EndOffset));
            }
            catch (Exception)
            {
                return(-1);
            }
        }
예제 #5
0
        protected override void OnInitialized(EventArgs e)
        {
            markerService = new TextMarkerService(editor.TextArea);

            editor.TextArea.TextView.MouseMove += new MouseEventHandler(editor_TextArea_TextView_MouseMove);

            editor.Document.Changed += delegate(object sender, DocumentChangeEventArgs e2) {
                textDirty = true;
                changes.Add(e2);
            };
            parser = new AXmlParser();

            DispatcherTimer timer = new DispatcherTimer();

            timer.Interval = TimeSpan.FromSeconds(0.5);
            timer.Tick    += delegate { Button_Click(null, null); };
            timer.Start();

            base.OnInitialized(e);
        }
예제 #6
0
        public static void Run(string fileName)
        {
            bool includeAttributes = true;
            var  textSource        = new StringTextSource(File.ReadAllText(fileName));

            using (var textReader = textSource.CreateReader()) {
                using (var xmlReader = new XmlTextReader(textReader)) {
                    Run(xmlReader, includeAttributes);
                }
            }
            var doc = new AXmlParser().Parse(textSource);

            using (var xmlReader = doc.CreateReader()) {
                Run(xmlReader, includeAttributes);
            }
            var xmlDocument = new XmlDocument();

            xmlDocument.Load(doc.CreateReader());
            xmlDocument.Save(Path.Combine(Program.TempPath, "savedXmlDocument.xml"));
            var xDocument = XDocument.Load(doc.CreateReader());

            xDocument.Save(Path.Combine(Program.TempPath, "savedXDocument.xml"));
            File.WriteAllText(Path.Combine(Program.TempPath, "inputDocument.xml"), textSource.Text);
        }
            void CheckXmlDocForErrors(SyntaxNode node, ISymbol member)
            {
                context.CancellationToken.ThrowIfCancellationRequested();

                foreach (var triva in node.GetLeadingTrivia())
                {
                    if (triva.IsKind(SyntaxKind.SingleLineDocumentationCommentTrivia))
                    {
                        storedXmlComment.Add((DocumentationCommentTriviaSyntax)triva.GetStructure());
                        new CRefVisistor(this).Visit(triva.GetStructure());
                    }
                }

                if (storedXmlComment.Count == 0)
                {
                    return;
                }

                xml.Clear();
                xml.Append(firstline);
                var OffsetTable = new List <int>();

                foreach (var cmt in storedXmlComment)
                {
                    OffsetTable.Add(xml.Length - firstline.Length);
                    xml.Append(cmt.Content + "\n");
                }
                xml.Append("</root>\n");

                var doc = new AXmlParser().Parse(SourceText.From(xml.ToString()));

                var stack = new Stack <AXmlObject>();

                stack.Push(doc);
                foreach (var err in doc.SyntaxErrors)
                {
                    AddXmlIssue(CalculateRealStartOffset(OffsetTable, err.StartOffset), err.EndOffset - err.StartOffset, err.Description);
                }

                while (stack.Count > 0)
                {
                    var cur = stack.Pop();
                    var el  = cur as AXmlElement;
                    if (el != null)
                    {
                        switch (el.Name)
                        {
                        case "typeparam":
                        case "typeparamref":
                            var name = el.Attributes.FirstOrDefault(attr => attr.Name == "name");
                            if (name == null || name.ValueSegment.Length < 2)
                            {
                                break;
                            }
                            if (member != null && member.IsKind(SymbolKind.NamedType))
                            {
                                var type = (INamedTypeSymbol)member;
                                if (!type.TypeArguments.Any(arg => arg.Name == name.Value))
                                {
                                    AddXmlIssue(CalculateRealStartOffset(OffsetTable, name.ValueSegment.Start + 1), name.ValueSegment.Length - 2, string.Format(GettextCatalog.GetString("Type parameter '{0}' not found"), name.Value));
                                }
                            }
                            break;

                        case "param":
                        case "paramref":
                            name = el.Attributes.FirstOrDefault(attr => attr.Name == "name");
                            if (name == null || name.ValueSegment.Length < 2)
                            {
                                break;
                            }
                            var m = member as IMethodSymbol;
                            if (m != null)
                            {
                                if (m.Parameters.Any(p => p.Name == name.Value))
                                {
                                    break;
                                }
                                AddXmlIssue(CalculateRealStartOffset(OffsetTable, name.ValueSegment.Start + 1), name.ValueSegment.Length - 2, string.Format(GettextCatalog.GetString("Parameter '{0}' not found"), name.Value));
                                break;
                            }
                            var prop = member as IPropertySymbol;
                            if (prop != null)
                            {
                                if (prop.Parameters.Any(p => p.Name == name.Value))
                                {
                                    break;
                                }
                                if (name.Value == "value")
                                {
                                    break;
                                }
                                AddXmlIssue(CalculateRealStartOffset(OffsetTable, name.ValueSegment.Start + 1), name.ValueSegment.Length - 2, string.Format(GettextCatalog.GetString("Parameter '{0}' not found"), name.Value));
                                break;
                            }
                            var evt = member as IEventSymbol;
                            if (evt != null)
                            {
                                if (name.Value == "value")
                                {
                                    break;
                                }
                                AddXmlIssue(CalculateRealStartOffset(OffsetTable, name.ValueSegment.Start + 1), name.ValueSegment.Length - 2, string.Format(GettextCatalog.GetString("Parameter '{0}' not found"), name.Value));
                                break;
                            }
                            var named = member as INamedTypeSymbol;
                            if (named != null)
                            {
                                if (named.DelegateInvokeMethod == null)
                                {
                                    break;
                                }
                                if (named.DelegateInvokeMethod.Parameters.Any(p => p.Name == name.Value))
                                {
                                    break;
                                }
                                AddXmlIssue(CalculateRealStartOffset(OffsetTable, name.ValueSegment.Start + 1), name.ValueSegment.Length - 2, string.Format(GettextCatalog.GetString("Parameter '{0}' not found"), name.Value));
                                break;
                            }
                            AddXmlIssue(CalculateRealStartOffset(OffsetTable, name.ValueSegment.Start + 1), name.ValueSegment.Length - 2, string.Format(GettextCatalog.GetString("Parameter '{0}' not found"), name.Value));
                            break;
                        }
                    }
                    foreach (var child in cur.Children)
                    {
                        stack.Push(child);
                    }
                }


                storedXmlComment.Clear();
            }
예제 #8
0
            void CheckXmlDoc(AstNode node)
            {
                ResolveResult resolveResult = ctx.Resolve(node);
                IEntity       member        = null;

                if (resolveResult is TypeResolveResult)
                {
                    member = resolveResult.Type.GetDefinition();
                }
                if (resolveResult is MemberResolveResult)
                {
                    member = ((MemberResolveResult)resolveResult).Member;
                }
                var xml       = new StringBuilder();
                var firstline = "<root>\n";

                xml.Append(firstline);
                foreach (var cmt in storedXmlComment)
                {
                    xml.Append(cmt.Content + "\n");
                }
                xml.Append("</root>\n");

                var doc = new AXmlParser().Parse(new StringTextSource(xml.ToString()));

                var stack = new Stack <AXmlObject>();

                stack.Push(doc);
                foreach (var err in doc.SyntaxErrors)
                {
                    AddXmlIssue(err.StartOffset - firstline.Length, err.EndOffset - err.StartOffset, err.Description);
                }

                while (stack.Count > 0)
                {
                    var cur = stack.Pop();
                    var el  = cur as AXmlElement;
                    if (el != null)
                    {
                        switch (el.Name)
                        {
                        case "typeparam":
                        case "typeparamref":
                            var name = el.Attributes.FirstOrDefault(attr => attr.Name == "name");
                            if (name == null)
                            {
                                break;
                            }
                            if (member.SymbolKind == SymbolKind.TypeDefinition)
                            {
                                var type = (ITypeDefinition)member;
                                if (!type.TypeArguments.Any(arg => arg.Name == name.Value))
                                {
                                    AddXmlIssue(name.ValueSegment.Offset - firstline.Length + 1, name.ValueSegment.Length - 2, string.Format(ctx.TranslateString("Type parameter '{0}' not found"), name.Value));
                                }
                            }
                            break;

                        case "param":
                        case "paramref":
                            name = el.Attributes.FirstOrDefault(attr => attr.Name == "name");
                            if (name == null)
                            {
                                break;
                            }
                            var m = member as IParameterizedMember;
                            if (m != null && m.Parameters.Any(p => p.Name == name.Value))
                            {
                                break;
                            }
                            if (name.Value == "value" && (member.SymbolKind == SymbolKind.Property || member.SymbolKind == SymbolKind.Indexer || member.SymbolKind == SymbolKind.Event) && el.Name == "paramref")
                            {
                                break;
                            }
                            AddXmlIssue(name.ValueSegment.Offset - firstline.Length + 1, name.ValueSegment.Length - 2, string.Format(ctx.TranslateString("Parameter '{0}' not found"), name.Value));
                            break;

                        case "exception":
                        case "seealso":
                        case "see":
                            var cref = el.Attributes.FirstOrDefault(attr => attr.Name == "cref");
                            if (cref == null)
                            {
                                break;
                            }

                            try {
                                var trctx = ctx.Resolver.TypeResolveContext;
                                if (member is IMember)
                                {
                                    trctx = trctx.WithCurrentTypeDefinition(member.DeclaringTypeDefinition).WithCurrentMember((IMember)member);
                                }
                                if (member is ITypeDefinition)
                                {
                                    trctx = trctx.WithCurrentTypeDefinition((ITypeDefinition)member);
                                }

                                var state = ctx.Resolver.GetResolverStateBefore(node);
                                if (state.CurrentUsingScope != null)
                                {
                                    trctx = trctx.WithUsingScope(state.CurrentUsingScope);
                                }

                                var cdc    = new CSharpDocumentationComment(emptySource, trctx);
                                var entity = cdc.ResolveCref(cref.Value);

                                if (entity == null)
                                {
                                    AddXmlIssue(cref.ValueSegment.Offset - firstline.Length + 1, cref.ValueSegment.Length - 2, string.Format(ctx.TranslateString("Cannot find reference '{0}'"), cref.Value));
                                }
                            } catch (Exception e) {
                                AddXmlIssue(cref.ValueSegment.Offset - firstline.Length + 1, cref.ValueSegment.Length - 2, string.Format(ctx.TranslateString("Reference parsing error '{0}'."), e.Message));
                            }
                            break;
                        }
                    }
                    foreach (var child in cur.Children)
                    {
                        stack.Push(child);
                    }
                }
                storedXmlComment.Clear();
            }
예제 #9
0
        public static void Run(ITextSource originalXmlFile)
        {
            int seed;

            lock (sharedRnd) {
                seed = sharedRnd.Next();
            }
            Console.WriteLine(seed);
            Random rnd = new Random(seed);

            AXmlParser             parser      = new AXmlParser();
            StringBuilder          b           = new StringBuilder(originalXmlFile.Text);
            IncrementalParserState parserState = null;
            var       versionProvider          = new TextSourceVersionProvider();
            int       totalCharactersParsed    = 0;
            int       totalCharactersChanged   = originalXmlFile.TextLength;
            TimeSpan  incrementalParseTime     = TimeSpan.Zero;
            TimeSpan  nonIncrementalParseTime  = TimeSpan.Zero;
            Stopwatch w = new Stopwatch();

            for (int iteration = 0; iteration < 100; iteration++)
            {
                totalCharactersParsed += b.Length;
                var textSource = new StringTextSource(b.ToString(), versionProvider.CurrentVersion);
                w.Restart();
                var incrementalResult = parser.ParseIncremental(parserState, textSource, out parserState);
                w.Stop();
                incrementalParseTime += w.Elapsed;
                w.Restart();
                var nonIncrementalResult = parser.Parse(textSource);
                w.Stop();
                nonIncrementalParseTime += w.Elapsed;
                CompareResults(incrementalResult, nonIncrementalResult);

                incrementalResult.AcceptVisitor(new ValidationVisitor(textSource));

                // Randomly mutate the file:

                List <TextChangeEventArgs> changes = new List <TextChangeEventArgs>();
                int modifications = rnd.Next(0, 25);
                int offset        = 0;
                for (int i = 0; i < modifications; i++)
                {
                    if (i == 0 || rnd.Next(0, 10) == 0)
                    {
                        offset = rnd.Next(0, b.Length);
                    }
                    else
                    {
                        offset += rnd.Next(0, Math.Min(10, b.Length - offset));
                    }
                    int originalOffset = rnd.Next(0, originalXmlFile.TextLength);
                    int insertionLength;
                    int removalLength;
                    switch (rnd.Next(0, 21) / 10)
                    {
                    case 0:
                        removalLength   = 0;
                        insertionLength = rnd.Next(0, Math.Min(50, originalXmlFile.TextLength - originalOffset));
                        break;

                    case 1:
                        removalLength   = rnd.Next(0, Math.Min(20, b.Length - offset));
                        insertionLength = rnd.Next(0, Math.Min(20, originalXmlFile.TextLength - originalOffset));
                        break;

                    default:
                        removalLength   = rnd.Next(0, b.Length - offset);
                        insertionLength = rnd.Next(0, originalXmlFile.TextLength - originalOffset);
                        break;
                    }
                    string removedText = b.ToString(offset, removalLength);
                    b.Remove(offset, removalLength);
                    string insertedText = originalXmlFile.GetText(originalOffset, insertionLength);
                    b.Insert(offset, insertedText);
                    versionProvider.AppendChange(new TextChangeEventArgs(offset, removedText, insertedText));
                    totalCharactersChanged += insertionLength;
                }
            }
            Console.WriteLine("Incremental parse time:     " + incrementalParseTime + " for " + totalCharactersChanged + " characters changed");
            Console.WriteLine("Non-Incremental parse time: " + nonIncrementalParseTime + " for " + totalCharactersParsed + " characters");
        }