Просмотр исходного кода

Extend C# frontend to support accessor token and differ between fields and local variables.

Timur Sağlam 4 лет назад
Родитель
Сommit
6e57e708ca

+ 47 - 15
jplag.frontend.csharp-6/src/main/java/de/jplag/csharp/CSharpListener.java

@@ -2,6 +2,8 @@ package de.jplag.csharp;
 
 import org.antlr.v4.runtime.Token;
 
+import de.jplag.csharp.grammar.CSharpParser.Accessor_bodyContext;
+import de.jplag.csharp.grammar.CSharpParser.Accessor_declarationsContext;
 import de.jplag.csharp.grammar.CSharpParser.Array_initializerContext;
 import de.jplag.csharp.grammar.CSharpParser.Assignment_operatorContext;
 import de.jplag.csharp.grammar.CSharpParser.AttributeContext;
@@ -10,7 +12,7 @@ import de.jplag.csharp.grammar.CSharpParser.Catch_clausesContext;
 import de.jplag.csharp.grammar.CSharpParser.CheckedStatementContext;
 import de.jplag.csharp.grammar.CSharpParser.Class_bodyContext;
 import de.jplag.csharp.grammar.CSharpParser.Class_definitionContext;
-import de.jplag.csharp.grammar.CSharpParser.Constant_declaratorContext;
+import de.jplag.csharp.grammar.CSharpParser.Constant_declarationContext;
 import de.jplag.csharp.grammar.CSharpParser.Constructor_declarationContext;
 import de.jplag.csharp.grammar.CSharpParser.ContinueStatementContext;
 import de.jplag.csharp.grammar.CSharpParser.Delegate_definitionContext;
@@ -20,6 +22,7 @@ import de.jplag.csharp.grammar.CSharpParser.Enum_bodyContext;
 import de.jplag.csharp.grammar.CSharpParser.Enum_definitionContext;
 import de.jplag.csharp.grammar.CSharpParser.Enum_member_declarationContext;
 import de.jplag.csharp.grammar.CSharpParser.Event_declarationContext;
+import de.jplag.csharp.grammar.CSharpParser.Field_declarationContext;
 import de.jplag.csharp.grammar.CSharpParser.Finally_clauseContext;
 import de.jplag.csharp.grammar.CSharpParser.FixedStatementContext;
 import de.jplag.csharp.grammar.CSharpParser.ForStatementContext;
@@ -30,6 +33,7 @@ import de.jplag.csharp.grammar.CSharpParser.If_bodyContext;
 import de.jplag.csharp.grammar.CSharpParser.Indexer_declarationContext;
 import de.jplag.csharp.grammar.CSharpParser.Interface_bodyContext;
 import de.jplag.csharp.grammar.CSharpParser.Interface_definitionContext;
+import de.jplag.csharp.grammar.CSharpParser.Local_variable_declarationContext;
 import de.jplag.csharp.grammar.CSharpParser.LockStatementContext;
 import de.jplag.csharp.grammar.CSharpParser.Method_bodyContext;
 import de.jplag.csharp.grammar.CSharpParser.Method_declarationContext;
@@ -49,7 +53,6 @@ import de.jplag.csharp.grammar.CSharpParser.UncheckedExpressionContext;
 import de.jplag.csharp.grammar.CSharpParser.UnsafeStatementContext;
 import de.jplag.csharp.grammar.CSharpParser.UsingStatementContext;
 import de.jplag.csharp.grammar.CSharpParser.Using_directivesContext;
-import de.jplag.csharp.grammar.CSharpParser.Variable_declaratorContext;
 import de.jplag.csharp.grammar.CSharpParser.WhileStatementContext;
 import de.jplag.csharp.grammar.CSharpParserBaseListener;
 
@@ -102,18 +105,6 @@ public class CSharpListener extends CSharpParserBaseListener implements CSharpTo
         super.enterAssignment_operator(context);
     }
 
-    @Override
-    public void enterVariable_declarator(Variable_declaratorContext context) {
-        transformToken(DECLARE_VAR, context.getStart());
-        super.enterVariable_declarator(context);
-    }
-
-    @Override
-    public void enterConstant_declarator(Constant_declaratorContext context) {
-        transformToken(DECLARE_CONST, context.getStart());
-        super.enterConstant_declarator(context);
-    }
-
     @Override
     public void enterIfStatement(IfStatementContext context) {
         transformToken(IF, context.getStart());
@@ -128,7 +119,7 @@ public class CSharpListener extends CSharpParserBaseListener implements CSharpTo
 
     @Override
     public void exitIf_body(If_bodyContext context) {
-        transformToken(END_IF, context.getStop());
+        transformToken(IF_END, context.getStop());
         super.exitIf_body(context);
     }
 
@@ -420,4 +411,45 @@ public class CSharpListener extends CSharpParserBaseListener implements CSharpTo
         super.enterFixedStatement(context);
     }
 
+    @Override
+    public void enterAccessor_declarations(Accessor_declarationsContext context) {
+        transformToken(ACCESSORS_BEGIN, context.getStart());
+        super.enterAccessor_declarations(context);
+    }
+
+    @Override
+    public void exitAccessor_declarations(Accessor_declarationsContext context) {
+        transformToken(ACCESSORS_END, context.getStart());
+        super.enterAccessor_declarations(context);
+    }
+
+    @Override
+    public void enterAccessor_body(Accessor_bodyContext context) {
+        transformToken(ACCESSOR_BEGIN, context.getStart());
+        super.enterAccessor_body(context);
+    }
+
+    @Override
+    public void exitAccessor_body(Accessor_bodyContext context) {
+        transformToken(ACCESSOR_END, context.getStart());
+        super.exitAccessor_body(context);
+    }
+
+    @Override
+    public void enterConstant_declaration(Constant_declarationContext context) {
+        transformToken(CONSTANT, context.getStart());
+        super.enterConstant_declaration(context);
+    }
+
+    @Override
+    public void enterField_declaration(Field_declarationContext context) {
+        transformToken(FIELD, context.getStart());
+        super.enterField_declaration(context);
+    }
+
+    @Override
+    public void enterLocal_variable_declaration(Local_variable_declarationContext context) {
+        transformToken(LOCAL_VARIABLE, context.getStart());
+        super.enterLocal_variable_declaration(context);
+    }
 }

+ 9 - 6
jplag.frontend.csharp-6/src/main/java/de/jplag/csharp/CSharpToken.java

@@ -29,11 +29,10 @@ public class CSharpToken extends Token implements CSharpTokenConstants {
             case OBJECT_CREATION -> "OBJECT";
             case ARRAY_CREATION -> "ARRAY";
             case ASSIGNMENT -> "ASSIGN";
-            case DECLARE_VAR -> "VAR";
-            case DECLARE_CONST -> "CONST";
+            case FIELD -> "FIELD";
+            case CONSTANT -> "CONST";
             case IF -> "IF";
-            case ELSE -> "ELSE";
-            case END_IF -> "}IF";
+            case IF_END -> "}IF";
             case SWITCH_BEGIN -> "SWITCH{";
             case SWITCH_END -> "}SWITCH";
             case CASE -> "CASE";
@@ -74,7 +73,6 @@ public class CSharpToken extends Token implements CSharpTokenConstants {
             case ATTRIBUTE -> "ATTRIBUTE";
             case UNSAFE -> "UNSAFE";
             case FIXED -> "FIXED";
-            // new:
             case METHOD_BEGIN -> "METHOD{";
             case METHOD_END -> "}METHOD";
             case STRUCT -> "STRUCT";
@@ -84,7 +82,12 @@ public class CSharpToken extends Token implements CSharpTokenConstants {
             case ENUM_BEGIN -> "ENUM{";
             case ENUM_END -> "}ENUM";
             case ENUMERAL -> "ENUMERAL";
-            default -> "<UNKNOWN>";
+            case LOCAL_VARIABLE -> "LOCAL_VAR";
+            case ACCESSORS_BEGIN -> "ACCESSORS{";
+            case ACCESSORS_END -> "}ACCESSORS";
+            case ACCESSOR_BEGIN -> "ACCESSORS{";
+            case ACCESSOR_END -> "}ACCESSORS";
+            default -> "<UNKNOWN" + type + ">";
         };
     }
 }

+ 11 - 9
jplag.frontend.csharp-6/src/main/java/de/jplag/csharp/CSharpTokenConstants.java

@@ -3,9 +3,7 @@ package de.jplag.csharp;
 import de.jplag.TokenConstants;
 
 /**
- * Based on the legacy CSharp-1.2 constants. The constants L_BRACE, R_BRACE, and STATIC_CONSTR were removed. Moreover,
- * the following constants were added: METHOD_BEGIN, METHOD_END, STRUCT, IF_BEGIN, CLASS, INTERFACE, ENUM_BEGIN,
- * ENUM_END and ENUMERAL.
+ * Based on the legacy CSharp-1.2 constants.
  * @author Timur Saglam
  */
 public interface CSharpTokenConstants extends TokenConstants {
@@ -16,10 +14,10 @@ public interface CSharpTokenConstants extends TokenConstants {
     int OBJECT_CREATION = 3;
     int ARRAY_CREATION = 4;
     int ASSIGNMENT = 5;
-    int DECLARE_VAR = 6;
-    int DECLARE_CONST = 7;
-    int IF = 8;
-    int ELSE = 9; // TODO TS does not exist
+    int FIELD = 6;
+    int CONSTANT = 7;
+    int LOCAL_VARIABLE = 8;
+    int IF = 9;
     int SWITCH_BEGIN = 10;
     int SWITCH_END = 11;
     int CASE = 12;
@@ -58,7 +56,7 @@ public interface CSharpTokenConstants extends TokenConstants {
     int ENUM = 45;
     int DELEGATE = 46;
     int ATTRIBUTE = 47;
-    int END_IF = 48;
+    int IF_END = 48;
     int UNSAFE = 49;
     int FIXED = 50;
     int METHOD_BEGIN = 51;
@@ -70,9 +68,13 @@ public interface CSharpTokenConstants extends TokenConstants {
     int ENUM_BEGIN = 57;
     int ENUM_END = 58;
     int ENUMERAL = 59;
+    int ACCESSORS_BEGIN = 60;
+    int ACCESSORS_END = 61;
+    int ACCESSOR_BEGIN = 62;
+    int ACCESSOR_END = 63;
 
     /*
      * Number of token constants:
      */
-    int NUM_DIFF_TOKENS = 61;
+    int NUM_DIFF_TOKENS = 64;
 }

+ 5 - 4
jplag.frontend.csharp-6/src/test/java/de/jplag/csharp/MinimalCSharpFrontendTest.java

@@ -25,7 +25,6 @@ import de.jplag.testutils.TestErrorConsumer;
 class MinimalCSharpFrontendTest {
     private final Logger logger = LoggerFactory.getLogger("JPlag-Test");
 
-    private static final int EXPEXTED_NUMBER_OF_TOKENS = 15;
     private static final Path BASE_PATH = Path.of("src", "test", "resources", "de", "jplag", "csharp");
     private static final String TEST_SUBJECT = "TestClass.cs";
 
@@ -42,8 +41,10 @@ class MinimalCSharpFrontendTest {
 
     @Test
     void testParsingTestClass() {
-        List<Integer> expectedToken = List.of(CLASS, CLASS_BEGIN, DECLARE_VAR, CONSTRUCTOR, METHOD, METHOD_BEGIN, INVOCATION, METHOD_END, PROPERTY,
-                DECLARE_VAR, PROPERTY, RETURN, ASSIGNMENT, CLASS_END, TokenConstants.FILE_END);
+        List<Integer> expectedToken = List.of(CLASS, CLASS_BEGIN, FIELD, CONSTRUCTOR, LOCAL_VARIABLE, METHOD, METHOD_BEGIN, IF, IF_BEGIN, INVOCATION,
+                IF_END, IF_BEGIN, INVOCATION, IF_END, METHOD_END, PROPERTY, ACCESSORS_BEGIN, ACCESSOR_BEGIN, ACCESSOR_END, ACCESSOR_BEGIN,
+                ACCESSOR_END, ACCESSORS_END, FIELD, PROPERTY, ACCESSORS_BEGIN, ACCESSOR_BEGIN, RETURN, ACCESSOR_END, ACCESSOR_BEGIN, ASSIGNMENT,
+                ACCESSOR_END, ACCESSORS_END, CLASS_END, TokenConstants.FILE_END);
 
         // Parse test input
         String[] input = new String[] {TEST_SUBJECT};
@@ -51,7 +52,7 @@ class MinimalCSharpFrontendTest {
         logger.info(TokenPrinter.printTokens(result, baseDirectory, Arrays.asList(input)));
 
         // Compare parsed tokens:
-        assertEquals(EXPEXTED_NUMBER_OF_TOKENS, result.size());
+        assertEquals(expectedToken.size(), result.size());
         List<Integer> actualToken = StreamSupport.stream(result.allTokens().spliterator(), false).map(Token::getType).collect(toList());
         assertEquals(expectedToken, actualToken);
     }

+ 7 - 1
jplag.frontend.csharp-6/src/test/resources/de/jplag/csharp/TestClass.cs

@@ -7,12 +7,18 @@ public class MyClass
 
     public MyClass()
     {
+        int i = -1;
     }
 
     public void MyMethod(int parameter1, string parameter2)
     {
-        Console.WriteLine("First Parameter {0}, second parameter {1}", 
+        if(parameter1 == 0) {
+            Console.WriteLine("Second parameter {0}", parameter2);
+        } else {
+            Console.WriteLine("First Parameter {0}, second parameter {1}", 
                                                     parameter1, parameter2);
+        }
+        
     }
 
     public int MyAutoImplementedProperty { get; set; }