Ranides Atterwim преди 2 години
родител
ревизия
b47558382c

+ 12 - 10
assira.commons/src/main/java/net/ranides/assira/grammar/impl/G4ParserGenerated.java

@@ -141,7 +141,9 @@ class G4ParserGenerated implements G4Parser {
                 rules.get(branch.rule()).branches().add(branch);
                 rules.get(branch.rule()).branches().add(branch);
             });
             });
 
 
-            for(String token : lexerRules) {
+            String[] symbols = (String[]) lexer.field("_SYMBOLIC_NAMES").get().accessible().getStatic();
+            for(int i=1, n=symbols.length; i<n; i++) {
+                String token = symbols[i];
                 rules.put(token, new SimpleRuleCoverage(token, Ref.empty()));
                 rules.put(token, new SimpleRuleCoverage(token, Ref.empty()));
             }
             }
         }
         }
@@ -157,32 +159,32 @@ class G4ParserGenerated implements G4Parser {
                 return Ref.empty();
                 return Ref.empty();
             }
             }
 
 
-            Ref<IMethod> aliasRule = type
+            List<IMethod> aliasRule = type
                 .methods()
                 .methods()
                 .require(IAttribute.DECLARED)
                 .require(IAttribute.DECLARED)
                 .require(0)
                 .require(0)
                 .require(m -> m.returns().isSubclass(ParserRuleContext.class))
                 .require(m -> m.returns().isSubclass(ParserRuleContext.class))
-                .single();
+                .list();
 
 
-            Ref<IMethod> aliasToken = type
+            List<IMethod> aliasToken = type
                 .methods()
                 .methods()
                 .require(IAttribute.DECLARED)
                 .require(IAttribute.DECLARED)
                 .require(0)
                 .require(0)
                 .require(m -> m.returns().isSubclass(TerminalNode.class))
                 .require(m -> m.returns().isSubclass(TerminalNode.class))
-                .single();
+                .list();
 
 
 
 
-            if(aliasRule.isPresent() && aliasToken.isPresent()) {
+            if(!aliasRule.isEmpty() && !aliasToken.isEmpty()) {
                 return Ref.empty();
                 return Ref.empty();
             }
             }
 
 
-            if(aliasToken.isPresent()) {
-                String name = aliasToken.get().name();
+            if(aliasToken.size() == 1) {
+                String name = aliasToken.iterator().next().name();
                 return Ref.of(name);
                 return Ref.of(name);
             }
             }
 
 
-            if(aliasRule.isPresent()) {
-                String name = ruleName(aliasRule.get().returns().raw());
+            if(aliasRule.size() == 1) {
+                String name = ruleName(aliasRule.iterator().next().returns().raw());
                 return Ref.of(name);
                 return Ref.of(name);
             }
             }
 
 

+ 1 - 5
assira.g4interpreter/src/main/java/net/ranides/assira/grammar/impl/G4ParserInterpreter.java

@@ -303,10 +303,6 @@ public class G4ParserInterpreter implements G4Parser {
         private final Map<String, String> aliases;
         private final Map<String, String> aliases;
 
 
         public MyCoverage() {
         public MyCoverage() {
-            // @todo fix coverage: borderSize#borderSize2 <= borderSizeComponent
-            // this alternative links to only one grammar rule, granted, BUT:
-            // this rule is repeated, it is not "simple alias". we should ignore that.
-
             rules = new TreeMap<>();
             rules = new TreeMap<>();
             branches = new TreeMap<>();
             branches = new TreeMap<>();
             aliases = new TreeMap<>();
             aliases = new TreeMap<>();
@@ -351,7 +347,7 @@ public class G4ParserInterpreter implements G4Parser {
                         if(alt.ruleRefs.size() == 1 && alt.tokenRefs.size() == 0) {
                         if(alt.ruleRefs.size() == 1 && alt.tokenRefs.size() == 0) {
                             alias = alt.ruleRefs.keySet().iterator().next();
                             alias = alt.ruleRefs.keySet().iterator().next();
                         }
                         }
-                        if(alias != null) {
+                        if(alias != null && alt.ast.getChildren().size() == 1) {
                             int ri = rule.index;
                             int ri = rule.index;
                             int ai = alt.altNum;
                             int ai = alt.altNum;
                             String altName = branchLabels.get(ri, ai);
                             String altName = branchLabels.get(ri, ai);

+ 38 - 22
assira.ui/src/test/java/net/ranides/assira/ui/primitives/CssParserTest.java

@@ -1,17 +1,15 @@
 package net.ranides.assira.ui.primitives;
 package net.ranides.assira.ui.primitives;
 
 
-import net.ranides.assira.grammar.G4ErrorHandler;
 import net.ranides.assira.grammar.G4Node;
 import net.ranides.assira.grammar.G4Node;
 import net.ranides.assira.grammar.G4Parser;
 import net.ranides.assira.grammar.G4Parser;
 import net.ranides.assira.grammar.G4ParserCoverage;
 import net.ranides.assira.grammar.G4ParserCoverage;
 import net.ranides.assira.grammar.G4Selector;
 import net.ranides.assira.grammar.G4Selector;
 import net.ranides.assira.grammar.G4SelectorBuilder;
 import net.ranides.assira.grammar.G4SelectorBuilder;
 import net.ranides.assira.grammar.G4Support;
 import net.ranides.assira.grammar.G4Support;
-import net.ranides.assira.grammar.impl.G4ParserInterpreter;
-import net.ranides.assira.io.IOStreams;
 import net.ranides.assira.io.ResourceUtils;
 import net.ranides.assira.io.ResourceUtils;
 import net.ranides.assira.junit.NewAssert;
 import net.ranides.assira.junit.NewAssert;
-import net.ranides.assira.text.IOStrings;
+import net.ranides.assira.system.HostSystem;
+import net.ranides.assira.text.StrAppender;
 import net.ranides.assira.ui.helpers.ColorUtils;
 import net.ranides.assira.ui.helpers.ColorUtils;
 import net.ranides.grammars.generated.CssGrammarLexer;
 import net.ranides.grammars.generated.CssGrammarLexer;
 import net.ranides.grammars.generated.CssGrammarParser;
 import net.ranides.grammars.generated.CssGrammarParser;
@@ -19,10 +17,8 @@ import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.Test;
 
 
 import java.awt.*;
 import java.awt.*;
-import java.io.File;
 import java.io.IOException;
 import java.io.IOException;
-import java.io.PrintStream;
-import java.nio.charset.StandardCharsets;
+import java.io.StringWriter;
 import java.util.Arrays;
 import java.util.Arrays;
 
 
 import static net.ranides.assira.junit.NewAssert.assertThrows;
 import static net.ranides.assira.junit.NewAssert.assertThrows;
@@ -38,14 +34,8 @@ public class CssParserTest {
 
 
     G4Selector<Boolean> IGNORE = new G4SelectorBuilder<Boolean>()
     G4Selector<Boolean> IGNORE = new G4SelectorBuilder<Boolean>()
         .withParser(CSS_PARSER)
         .withParser(CSS_PARSER)
-        .valueForToken("CHAR_HEX", true)
-        .valueForToken("CHAR_WS", true)
         .valueForToken("WS", true)
         .valueForToken("WS", true)
         .valueForToken("CS", true)
         .valueForToken("CS", true)
-        .valueForToken("DIGIT", true)
-        .valueForToken("DIGIT_HEX", true)
-        .valueForToken("DIGIT_NZ", true)
-        .valueForToken("DIGIT_Z", true)
         .valueForToken("DOT", true)
         .valueForToken("DOT", true)
         .valueForToken("LB", true)
         .valueForToken("LB", true)
         .valueForToken("RB", true)
         .valueForToken("RB", true)
@@ -85,7 +75,6 @@ public class CssParserTest {
         });
         });
     }
     }
 
 
-    @Ignore("manual")
     @Test
     @Test
     public void grammarInterpretedCoverage() throws IOException {
     public void grammarInterpretedCoverage() throws IOException {
         G4ParserCoverage info = G4Parser.builder()
         G4ParserCoverage info = G4Parser.builder()
@@ -105,12 +94,17 @@ public class CssParserTest {
         info.use(CssParser.BORDER_SIZE_COMPONENT);
         info.use(CssParser.BORDER_SIZE_COMPONENT);
         info.use(CssParser.BORDER);
         info.use(CssParser.BORDER);
 
 
-        printCoverage(info);
+        StringWriter sw = new StringWriter();
+        printCoverage(info, new StrAppender(sw));
+        if(HostSystem.JUNIT.detected()) {
+            printCoverage(info);
+        }
+
+        assertEquals(ResourceUtils.text("grammars/CssCoverage.txt"), sw.toString());
     }
     }
 
 
-    @Ignore("manual")
     @Test
     @Test
-    public void grammarGeneratedCoverage() {
+    public void grammarGeneratedCoverage() throws IOException {
         G4ParserCoverage info = G4Parser.builder()
         G4ParserCoverage info = G4Parser.builder()
             .lexer(CssGrammarLexer.class)
             .lexer(CssGrammarLexer.class)
             .parser(CssGrammarParser.class)
             .parser(CssGrammarParser.class)
@@ -127,24 +121,46 @@ public class CssParserTest {
         info.use(CssParser.BORDER_SIZE_COMPONENT);
         info.use(CssParser.BORDER_SIZE_COMPONENT);
         info.use(CssParser.BORDER);
         info.use(CssParser.BORDER);
 
 
-        printCoverage(info);
+        StringWriter sw = new StringWriter();
+        printCoverage(info, new StrAppender(sw));
+        if(HostSystem.JUNIT.detected()) {
+            printCoverage(info);
+        }
+
+        assertEquals(ResourceUtils.text("grammars/CssCoverage.txt"), sw.toString());
+    }
 
 
+    private void printCoverage(G4ParserCoverage info, StrAppender output) {
+        info.rules().forEach(rule -> {
+            if(rule.inner().isPresent()) {
+                output.printf("%d: %s <= %s%n", rule.used(), rule.name(), rule.inner().get());
+            } else {
+                output.printf("%d: %s%n", rule.used(), rule.name());
+            }
+            for(G4ParserCoverage.BranchCoverage branch : rule.branches()) {
+                if(branch.inner().isPresent()) {
+                    output.printf("   %d: %s%s <= %s%n", branch.used(), branch.rule(), branch.qualifier(), branch.inner().get());
+                } else {
+                    output.printf("   %d: %s%s%n", branch.used(), branch.rule(), branch.qualifier());
+                }
+            }
+        });
     }
     }
 
 
     private void printCoverage(G4ParserCoverage info) {
     private void printCoverage(G4ParserCoverage info) {
         info.rules().forEach(rule -> {
         info.rules().forEach(rule -> {
             int c = rule.used()>0 ? 32 : 33;
             int c = rule.used()>0 ? 32 : 33;
             if(rule.inner().isPresent()) {
             if(rule.inner().isPresent()) {
-                System.out.println("\033["+c+"m" + rule.used() +": " + rule.name() + " <= " + rule.inner().get());
+                System.out.printf("\u001B[%dm%d: %s <= %s%n", c, rule.used(), rule.name(), rule.inner().get());
             } else {
             } else {
-                System.out.println("\033["+c+"m" + rule.used() +": " + rule.name());
+                System.out.printf("\u001B[%dm%d: %s%n", c, rule.used(), rule.name());
             }
             }
             for(G4ParserCoverage.BranchCoverage branch : rule.branches()) {
             for(G4ParserCoverage.BranchCoverage branch : rule.branches()) {
                 int g = rule.used()>0 ? 32 : 33;
                 int g = rule.used()>0 ? 32 : 33;
                 if(branch.inner().isPresent()) {
                 if(branch.inner().isPresent()) {
-                    System.out.println("\033["+g+"m" + "   " + branch.used() +": " + branch.rule() + branch.qualifier() + " <= " + branch.inner().get());
+                    System.out.printf("\u001B[%dm   %d: %s%s <= %s%n", g, branch.used(), branch.rule(), branch.qualifier(), branch.inner().get());
                 } else {
                 } else {
-                    System.out.println("\033["+g+"m" + "   " + branch.used() +": " + branch.rule() + branch.qualifier());
+                    System.out.printf("\u001B[%dm   %d: %s%s%n", g, branch.used(), branch.rule(), branch.qualifier());
                 }
                 }
             }
             }
         });
         });

+ 102 - 0
assira.ui/src/test/resources/grammars/CssCoverage.txt

@@ -0,0 +1,102 @@
+1: CODE_HEX3
+1: CODE_HEX4
+1: CODE_HEX6
+1: CODE_HEX8
+1: CS
+1: CSS2_BORDER_dashed
+1: CSS2_BORDER_dotted
+1: CSS2_BORDER_double
+1: CSS2_BORDER_groove
+1: CSS2_BORDER_inset
+1: CSS2_BORDER_medium
+1: CSS2_BORDER_outset
+1: CSS2_BORDER_ridge
+1: CSS2_BORDER_solid
+1: CSS2_BORDER_thick
+1: CSS2_BORDER_thin
+1: CSS2_UNIT_BVH
+1: CSS2_UNIT_BVW
+1: CSS2_UNIT_CM
+1: CSS2_UNIT_EM
+1: CSS2_UNIT_EX
+1: CSS2_UNIT_IN
+1: CSS2_UNIT_LH
+1: CSS2_UNIT_LVH
+1: CSS2_UNIT_LVW
+1: CSS2_UNIT_MM
+1: CSS2_UNIT_PC
+1: CSS2_UNIT_PT
+1: CSS2_UNIT_PX
+1: CSS2_UNIT_Q
+1: CSS2_UNIT_REM
+1: CSS2_UNIT_RLH
+1: CSS2_UNIT_SVH
+1: CSS2_UNIT_SVW
+1: CSS2_UNIT_VB
+1: CSS2_UNIT_VH
+1: CSS2_UNIT_VI
+1: CSS2_UNIT_VW
+1: CSS2_none
+1: DOT
+1: GT
+1: LB
+1: LP
+1: LT
+0: NUMBER_HEX
+0: NUMBER_INT
+0: NUMBER_PCT
+0: NUMBER_REAL
+1: PREFIX_HSL
+1: PREFIX_HSLA
+1: PREFIX_RGB
+1: PREFIX_RGBA
+1: RB
+1: RP
+1: SWING_BORDER_bevel
+1: SWING_BORDER_bevel_soft
+1: SWING_BORDER_etched
+1: WS
+0: border
+1: borderCSS
+0: borderCSS_Style
+1: borderSize
+   1: borderSize#borderSize1 <= borderSizeComponent
+   1: borderSize#borderSize2
+   1: borderSize#borderSize4
+0: borderSizeComponent
+0: borderSwingSimple
+0: borderSwingSimple_Style
+1: codeHex
+   1: codeHex#codeHex3 <= CODE_HEX3
+   1: codeHex#codeHex4 <= CODE_HEX4
+   1: codeHex#codeHex6 <= CODE_HEX6
+   1: codeHex#codeHex8 <= CODE_HEX8
+1: color
+   1: color#color_hex <= colorHEX
+   1: color#color_hsl <= colorHSL
+   1: color#color_hsla <= colorHSLA
+   1: color#color_rgb <= colorRGB
+   1: color#color_rgba <= colorRGBA
+1: colorHEX <= codeHex
+1: colorHSL
+1: colorHSLA
+1: colorRGB
+1: colorRGBA
+0: componentAlpha
+1: componentHue <= numberInt
+1: componentLightness <= numberPct
+1: componentRGB <= numberInt
+1: componentSaturation <= numberPct
+0: number
+1: numberHex <= NUMBER_HEX
+1: numberInt <= NUMBER_INT
+1: numberPct <= NUMBER_PCT
+1: numberReal <= NUMBER_REAL
+1: numberUnit
+0: root_border
+0: root_color
+0: root_colors
+   0: root_colors#color_list
+0: unit
+0: unitAbs
+0: unitRel