]> O.S.I.I.S - jp/crowedit.git/commitdiff
XmlSyntax element name matching
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Thu, 27 Feb 2025 14:41:02 +0000 (15:41 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Thu, 27 Feb 2025 14:41:02 +0000 (15:41 +0100)
plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs
plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs

index 4083aa9d9ff80d7f02245e2f6ca497f9707b8584..a455fed9dec6a3a67b2809157d68005371181d1c 100644 (file)
@@ -53,12 +53,7 @@ namespace CrowEdit.Xml
                                                if (curTok.GetTokenType() == XmlTokenType.ElementOpen)
                                                        currentNode = currentNode.AddChild (new ElementStartTagSyntax (currentLine, tokIdx));
                                                else if (curTok.GetTokenType() == XmlTokenType.EndElementOpen) {
-                                                       elt.EndTag = new ElementEndTagSyntax (currentLine, tokIdx);
-                                                       currentNode = elt.AddChild (elt.EndTag);
-                                                       /*} else {
-                                                               finishCurrentNode(-1);
-                                                               addException ("Unmatching open/closing element name");
-                                                       }*/
+                                                       currentNode = elt.AddChild (new ElementEndTagSyntax (currentLine, tokIdx));
                                                }
                                        } else if (currentNode is AttributeSyntax attrib) {
                                                if (curTok.GetTokenType() == XmlTokenType.EqualSign)
@@ -83,8 +78,30 @@ namespace CrowEdit.Xml
                                                        eltEndTag.name = tokIdx - eltEndTag.TokenIndexBase;
                                                else if (curTok.GetTokenType() == XmlTokenType.ClosingSign) {
                                                        eltEndTag.close = tokIdx - eltEndTag.TokenIndexBase;
-                                                       //go up 2 times
-                                                       finishCurrentNode (); finishCurrentNode ();
+                                                       ElementSyntax es = eltEndTag.Parent as ElementSyntax;
+                                                       string eltEndTagName = eltEndTag.Name;
+                                                       if (string.Equals(es.StartTag.Name, eltEndTagName, StringComparison.Ordinal)) {
+                                                               es.EndTag = eltEndTag;
+                                                               //go up 2 times
+                                                               finishCurrentNode (); finishCurrentNode ();
+                                                       } else {
+                                                               addException ("Open/Close element name mismatch");
+                                                               finishCurrentNode (1);//finish eltEndTag->curNode is parent elt
+                                                               currentNode.RemoveChild(eltEndTag);
+                                                               finishCurrentNode (-eltEndTag.TokenCount.Value); //dont credit parent element with those tokens from the non matching end tag
+                                                                                                                                                                //curNode should be parent element of previous element
+                                                               while(currentNode is ElementSyntax esp) {
+                                                                       //eltEndTag is out of tree, so Name get threw exception
+                                                                       if (string.Equals(esp.StartTag.Name, eltEndTagName, StringComparison.Ordinal)) {
+                                                                               esp.EndTag = eltEndTag;
+                                                                               esp.AddChild (eltEndTag);
+                                                                               finishCurrentNode ();
+                                                                               break;
+                                                                       } else {
+                                                                               finishCurrentNode (-eltEndTag.TokenCount.Value);
+                                                                       }
+                                                               }
+                                                       }
                                                } else {
                                                        addException ("Unexpected Token");
                                                        finishCurrentNode (-1);
index 928b72202b359f71a618edcdb43015d61172fc85..dca4c1dd7dcc86dd49d9f529398ab2c43842319e 100644 (file)
@@ -23,7 +23,8 @@ namespace CrowEdit.Xml
        public abstract class ElementTagSyntax : SyntaxNode {
                public int? name, close;
                public override bool IsComplete => base.IsComplete & name.HasValue & close.HasValue;
-               public string Name => Root.GetTokenStringByIndex (TokenIndexBase + name.Value);
+               public string Name => name.HasValue ?
+                               Root.GetTokenStringByIndex (TokenIndexBase + name.Value) : null;
                protected ElementTagSyntax (int startLine, int tokenBase)
                        : base (startLine, tokenBase) {
                }