find a workaround to hanging on unclosed last XML tag

Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/2a78c286
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/2a78c286
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/2a78c286

Branch: refs/heads/develop
Commit: 2a78c286aa9d3a8228340bbde21e3bacb1397dbc
Parents: e409441
Author: Alex Harui <aha...@apache.org>
Authored: Tue Jul 11 14:08:50 2017 -0700
Committer: Alex Harui <aha...@apache.org>
Committed: Wed Jul 12 16:08:42 2017 -0700

----------------------------------------------------------------------
 .../internal/parsing/mxml/MXMLTokenizer.java    | 46 ++++++++++++--------
 1 file changed, 27 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/2a78c286/compiler/src/main/java/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizer.java
----------------------------------------------------------------------
diff --git 
a/compiler/src/main/java/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizer.java
 
b/compiler/src/main/java/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizer.java
index 51718ca..c476566 100644
--- 
a/compiler/src/main/java/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizer.java
+++ 
b/compiler/src/main/java/org/apache/flex/compiler/internal/parsing/mxml/MXMLTokenizer.java
@@ -39,6 +39,8 @@ import org.apache.flex.compiler.parsing.IMXMLTokenizer;
 import org.apache.flex.compiler.parsing.MXMLTokenTypes;
 import org.apache.flex.compiler.problems.ICompilerProblem;
 import org.apache.flex.compiler.problems.InternalCompilerProblem2;
+import org.apache.flex.compiler.problems.MXMLUnclosedTagProblem;
+import org.apache.flex.compiler.problems.UnexpectedTokenProblem;
 import org.apache.flex.utils.NonLockingStringReader;
 
 /**
@@ -201,26 +203,18 @@ public class MXMLTokenizer implements IMXMLTokenizer, 
Closeable
      * @return an {@link MXMLToken} or null when no more tokens can be produced
      */
        private final MXMLToken nextTokenInternal() {
-           MXMLToken retVal = null;
-        boolean cont = true;
-        while(cont) {
-            try
-            {
-                MXMLToken token = tokenizer.hasBufferToken() ? 
(MXMLToken)tokenizer.getBufferToken() : (MXMLToken)tokenizer.nextToken();
-                if(token == null)
-                    return null;
-                MXMLToken mxmlToken = processToken(token);
-                if(mxmlToken != null) {
-                    retVal = mxmlToken;
-                    return retVal;
-                }
-            }
-            catch (Exception e)
-            {
-                ICompilerProblem problem = new InternalCompilerProblem2(path, 
e, SUB_SYSTEM); 
-                problems.add(problem);
+        try
+        {
+            MXMLToken token = tokenizer.hasBufferToken() ? 
(MXMLToken)tokenizer.getBufferToken() : (MXMLToken)tokenizer.nextToken();
+            if(token == null)
                 return null;
-            }
+            MXMLToken mxmlToken = processToken(token);
+            return mxmlToken;
+        }
+        catch (Exception e)
+        {
+            ICompilerProblem problem = new InternalCompilerProblem2(path, e, 
SUB_SYSTEM); 
+            problems.add(problem);
         }
         return null;
        }
@@ -339,6 +333,20 @@ public class MXMLTokenizer implements IMXMLTokenizer, 
Closeable
         * @return an {@link MXMLToken} or null if it was not accepted
         */
        private MXMLToken processToken(final MXMLToken token) {
+               
+               if (lastToken != null && lastToken.getType() == 
MXMLTokenTypes.TOKEN_CLOSE_TAG_START &&
+                       token.getType() != MXMLTokenTypes.TOKEN_TAG_END)
+               {
+                       // once we hit this condition, we currently stop 
parsing.  
+                       // There is a condition where the last closing tag of 
the file in unclosed
+                       // as in "<js:Application" (no closing ">") and the 
lexer
+                       // can't seem to detect that and stop lexing.  Yes, 
this means that
+                       // if a bad closing tag occurs higher up in the file 
we'll bail
+                       // and not report errors later in the file, but that's 
better than
+                       // hanging, IMO.
+                       problems.add(new MXMLUnclosedTagProblem(token, 
lastToken.getText()));
+                       return null;
+               }
            //TODO find xmlns uri values in the lexer instead of here
            switch (token.getType())
         {

Reply via email to