Stabilize Foldingmanager for antlr

- in error situations tokens are only partially defined, thus need to
  be null checked
- antlr seems to be able to return contexts with start tokens with a
  higher position than the end token
- it can happen, that identical folds will be generated - this must be
  filtered before passed on to CSL
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java
index 576e917..138f37d 100644
--- a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java
@@ -81,25 +81,39 @@
     protected ParseTreeListener createFoldListener() {
         return new ANTLRv3ParserBaseListener() {
 
-            private void addFold(Token start, Token stop) {
-                OffsetRange range = new OffsetRange(start.getStopIndex() + 1, stop.getStartIndex());
-                folds.add(range);
+            private void addFold(Token startToken, Token stopToken) {
+                int start = startToken.getStopIndex() + 1;
+                int stop = stopToken.getStartIndex();
+                if(start >= stop) {
+                    return;
+                }
+                OffsetRange range = new OffsetRange(start, stop);
+                if(! folds.contains(range)) {
+                    folds.add(range);
+                }
             }
 
 
             @Override
             public void exitActionBlock(ANTLRv3Parser.ActionBlockContext ctx) {
-                addFold(ctx.BEGIN_ACTION().getSymbol(), ctx.END_ACTION().getSymbol());
+                if(ctx.BEGIN_ACTION() != null && ctx.BEGIN_ACTION().getSymbol() != null
+                        && ctx.END_ACTION() != null && ctx.END_ACTION().getSymbol() != null) {
+                    addFold(ctx.BEGIN_ACTION().getSymbol(), ctx.END_ACTION().getSymbol());
+                }
             }
 
             @Override
             public void exitRule_(ANTLRv3Parser.Rule_Context ctx) {
-                addFold(ctx.getStart(), ctx.getStop());
+                if(ctx.getStart() != null && ctx.getStop() != null) {
+                    addFold(ctx.getStart(), ctx.getStop());
+                }
             }
 
             @Override
             public void exitTokenSpec(ANTLRv3Parser.TokenSpecContext ctx) {
-                addFold(ctx.getStart(), ctx.getStop());
+                if (ctx.getStart() != null && ctx.getStop() != null) {
+                    addFold(ctx.getStart(), ctx.getStop());
+                }
             }
 
         };
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java
index 41b0a18..c8d927f 100644
--- a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java
@@ -110,34 +110,55 @@
     protected ParseTreeListener createFoldListener() {
         return new ANTLRv4ParserBaseListener() {
 
-            private void addFold(Token start, Token stop) {
-                OffsetRange range = new OffsetRange(start.getStopIndex() + 1, stop.getStartIndex());
-                folds.add(range);
+            private void addFold(Token startToken, Token stopToken) {
+                int start = startToken.getStopIndex() + 1;
+                int stop = stopToken.getStartIndex();
+                if(start >= stop) {
+                    return;
+                }
+                OffsetRange range = new OffsetRange(start, stop);
+                if(! folds.contains(range)) {
+                    folds.add(range);
+                }
             }
 
             @Override
             public void exitLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx) {
-                addFold(ctx.TOKEN_REF().getSymbol(), ctx.SEMI().getSymbol());
+                if(ctx.TOKEN_REF() != null && ctx.TOKEN_REF().getSymbol() != null
+                        && ctx.SEMI() != null && ctx.SEMI().getSymbol() != null) {
+                    addFold(ctx.TOKEN_REF().getSymbol(), ctx.SEMI().getSymbol());
+                }
             }
 
             @Override
             public void exitActionBlock(ANTLRv4Parser.ActionBlockContext ctx) {
-                addFold(ctx.BEGIN_ACTION().getSymbol(), ctx.END_ACTION().getSymbol());
+                if(ctx.BEGIN_ACTION() != null && ctx.BEGIN_ACTION().getSymbol() != null
+                        && ctx.END_ACTION() != null && ctx.END_ACTION().getSymbol() != null) {
+                    addFold(ctx.BEGIN_ACTION().getSymbol(), ctx.END_ACTION().getSymbol());
+                }
             }
 
             @Override
             public void exitParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx) {
-                addFold(ctx.RULE_REF().getSymbol(), ctx.SEMI().getSymbol());
+                if (ctx.RULE_REF() != null && ctx.RULE_REF().getSymbol() != null
+                        && ctx.SEMI() != null && ctx.SEMI().getSymbol() != null) {
+                    addFold(ctx.RULE_REF().getSymbol(), ctx.SEMI().getSymbol());
+                }
             }
 
             @Override
             public void exitRules(ANTLRv4Parser.RulesContext ctx) {
-                addFold(ctx.getStart(), ctx.getStop());
+                if(ctx.getStart() != null && ctx.getStop() != null) {
+                    addFold(ctx.getStart(), ctx.getStop());
+                }
             }
 
             @Override
             public void exitModeSpec(ANTLRv4Parser.ModeSpecContext ctx) {
-                addFold(ctx.identifier().getStop(), ctx.getStop());
+                if (ctx.identifier() != null && ctx.identifier().getStop() != null
+                        && ctx.getStop() != null) {
+                    addFold(ctx.identifier().getStop(), ctx.getStop());
+                }
             }
 
         };