Browse Source

cppparser: Parse parenthesised noexcept() and explicit()

rdb 4 years ago
parent
commit
807be99f10

File diff suppressed because it is too large
+ 495 - 489
dtool/src/cppparser/cppBison.cxx.prebuilt


+ 150 - 146
dtool/src/cppparser/cppBison.h.prebuilt

@@ -129,79 +129,81 @@ extern int cppyydebug;
     KW_EXTENSION = 330,            /* KW_EXTENSION  */
     KW_EXTERN = 331,               /* KW_EXTERN  */
     KW_EXPLICIT = 332,             /* KW_EXPLICIT  */
-    KW_PUBLISHED = 333,            /* KW_PUBLISHED  */
-    KW_FALSE = 334,                /* KW_FALSE  */
-    KW_FINAL = 335,                /* KW_FINAL  */
-    KW_FLOAT = 336,                /* KW_FLOAT  */
-    KW_FRIEND = 337,               /* KW_FRIEND  */
-    KW_FOR = 338,                  /* KW_FOR  */
-    KW_GOTO = 339,                 /* KW_GOTO  */
-    KW_HAS_VIRTUAL_DESTRUCTOR = 340, /* KW_HAS_VIRTUAL_DESTRUCTOR  */
-    KW_IF = 341,                   /* KW_IF  */
-    KW_INLINE = 342,               /* KW_INLINE  */
-    KW_INT = 343,                  /* KW_INT  */
-    KW_IS_ABSTRACT = 344,          /* KW_IS_ABSTRACT  */
-    KW_IS_BASE_OF = 345,           /* KW_IS_BASE_OF  */
-    KW_IS_CLASS = 346,             /* KW_IS_CLASS  */
-    KW_IS_CONSTRUCTIBLE = 347,     /* KW_IS_CONSTRUCTIBLE  */
-    KW_IS_CONVERTIBLE_TO = 348,    /* KW_IS_CONVERTIBLE_TO  */
-    KW_IS_DESTRUCTIBLE = 349,      /* KW_IS_DESTRUCTIBLE  */
-    KW_IS_EMPTY = 350,             /* KW_IS_EMPTY  */
-    KW_IS_ENUM = 351,              /* KW_IS_ENUM  */
-    KW_IS_FINAL = 352,             /* KW_IS_FINAL  */
-    KW_IS_FUNDAMENTAL = 353,       /* KW_IS_FUNDAMENTAL  */
-    KW_IS_POD = 354,               /* KW_IS_POD  */
-    KW_IS_POLYMORPHIC = 355,       /* KW_IS_POLYMORPHIC  */
-    KW_IS_STANDARD_LAYOUT = 356,   /* KW_IS_STANDARD_LAYOUT  */
-    KW_IS_TRIVIAL = 357,           /* KW_IS_TRIVIAL  */
-    KW_IS_UNION = 358,             /* KW_IS_UNION  */
-    KW_LONG = 359,                 /* KW_LONG  */
-    KW_MAKE_MAP_KEYS_SEQ = 360,    /* KW_MAKE_MAP_KEYS_SEQ  */
-    KW_MAKE_MAP_PROPERTY = 361,    /* KW_MAKE_MAP_PROPERTY  */
-    KW_MAKE_PROPERTY = 362,        /* KW_MAKE_PROPERTY  */
-    KW_MAKE_PROPERTY2 = 363,       /* KW_MAKE_PROPERTY2  */
-    KW_MAKE_SEQ = 364,             /* KW_MAKE_SEQ  */
-    KW_MAKE_SEQ_PROPERTY = 365,    /* KW_MAKE_SEQ_PROPERTY  */
-    KW_MUTABLE = 366,              /* KW_MUTABLE  */
-    KW_NAMESPACE = 367,            /* KW_NAMESPACE  */
-    KW_NEW = 368,                  /* KW_NEW  */
-    KW_NOEXCEPT = 369,             /* KW_NOEXCEPT  */
-    KW_NULLPTR = 370,              /* KW_NULLPTR  */
-    KW_OPERATOR = 371,             /* KW_OPERATOR  */
-    KW_OVERRIDE = 372,             /* KW_OVERRIDE  */
-    KW_PRIVATE = 373,              /* KW_PRIVATE  */
-    KW_PROTECTED = 374,            /* KW_PROTECTED  */
-    KW_PUBLIC = 375,               /* KW_PUBLIC  */
-    KW_REGISTER = 376,             /* KW_REGISTER  */
-    KW_REINTERPRET_CAST = 377,     /* KW_REINTERPRET_CAST  */
-    KW_RETURN = 378,               /* KW_RETURN  */
-    KW_SHORT = 379,                /* KW_SHORT  */
-    KW_SIGNED = 380,               /* KW_SIGNED  */
-    KW_SIZEOF = 381,               /* KW_SIZEOF  */
-    KW_STATIC = 382,               /* KW_STATIC  */
-    KW_STATIC_ASSERT = 383,        /* KW_STATIC_ASSERT  */
-    KW_STATIC_CAST = 384,          /* KW_STATIC_CAST  */
-    KW_STRUCT = 385,               /* KW_STRUCT  */
-    KW_TEMPLATE = 386,             /* KW_TEMPLATE  */
-    KW_THREAD_LOCAL = 387,         /* KW_THREAD_LOCAL  */
-    KW_THROW = 388,                /* KW_THROW  */
-    KW_TRUE = 389,                 /* KW_TRUE  */
-    KW_TRY = 390,                  /* KW_TRY  */
-    KW_TYPEDEF = 391,              /* KW_TYPEDEF  */
-    KW_TYPEID = 392,               /* KW_TYPEID  */
-    KW_TYPENAME = 393,             /* KW_TYPENAME  */
-    KW_UNDERLYING_TYPE = 394,      /* KW_UNDERLYING_TYPE  */
-    KW_UNION = 395,                /* KW_UNION  */
-    KW_UNSIGNED = 396,             /* KW_UNSIGNED  */
-    KW_USING = 397,                /* KW_USING  */
-    KW_VIRTUAL = 398,              /* KW_VIRTUAL  */
-    KW_VOID = 399,                 /* KW_VOID  */
-    KW_VOLATILE = 400,             /* KW_VOLATILE  */
-    KW_WCHAR_T = 401,              /* KW_WCHAR_T  */
-    KW_WHILE = 402,                /* KW_WHILE  */
-    START_CPP = 403,               /* START_CPP  */
-    START_CONST_EXPR = 404,        /* START_CONST_EXPR  */
-    START_TYPE = 405               /* START_TYPE  */
+    KW_EXPLICIT_LPAREN = 333,      /* KW_EXPLICIT_LPAREN  */
+    KW_PUBLISHED = 334,            /* KW_PUBLISHED  */
+    KW_FALSE = 335,                /* KW_FALSE  */
+    KW_FINAL = 336,                /* KW_FINAL  */
+    KW_FLOAT = 337,                /* KW_FLOAT  */
+    KW_FRIEND = 338,               /* KW_FRIEND  */
+    KW_FOR = 339,                  /* KW_FOR  */
+    KW_GOTO = 340,                 /* KW_GOTO  */
+    KW_HAS_VIRTUAL_DESTRUCTOR = 341, /* KW_HAS_VIRTUAL_DESTRUCTOR  */
+    KW_IF = 342,                   /* KW_IF  */
+    KW_INLINE = 343,               /* KW_INLINE  */
+    KW_INT = 344,                  /* KW_INT  */
+    KW_IS_ABSTRACT = 345,          /* KW_IS_ABSTRACT  */
+    KW_IS_BASE_OF = 346,           /* KW_IS_BASE_OF  */
+    KW_IS_CLASS = 347,             /* KW_IS_CLASS  */
+    KW_IS_CONSTRUCTIBLE = 348,     /* KW_IS_CONSTRUCTIBLE  */
+    KW_IS_CONVERTIBLE_TO = 349,    /* KW_IS_CONVERTIBLE_TO  */
+    KW_IS_DESTRUCTIBLE = 350,      /* KW_IS_DESTRUCTIBLE  */
+    KW_IS_EMPTY = 351,             /* KW_IS_EMPTY  */
+    KW_IS_ENUM = 352,              /* KW_IS_ENUM  */
+    KW_IS_FINAL = 353,             /* KW_IS_FINAL  */
+    KW_IS_FUNDAMENTAL = 354,       /* KW_IS_FUNDAMENTAL  */
+    KW_IS_POD = 355,               /* KW_IS_POD  */
+    KW_IS_POLYMORPHIC = 356,       /* KW_IS_POLYMORPHIC  */
+    KW_IS_STANDARD_LAYOUT = 357,   /* KW_IS_STANDARD_LAYOUT  */
+    KW_IS_TRIVIAL = 358,           /* KW_IS_TRIVIAL  */
+    KW_IS_UNION = 359,             /* KW_IS_UNION  */
+    KW_LONG = 360,                 /* KW_LONG  */
+    KW_MAKE_MAP_KEYS_SEQ = 361,    /* KW_MAKE_MAP_KEYS_SEQ  */
+    KW_MAKE_MAP_PROPERTY = 362,    /* KW_MAKE_MAP_PROPERTY  */
+    KW_MAKE_PROPERTY = 363,        /* KW_MAKE_PROPERTY  */
+    KW_MAKE_PROPERTY2 = 364,       /* KW_MAKE_PROPERTY2  */
+    KW_MAKE_SEQ = 365,             /* KW_MAKE_SEQ  */
+    KW_MAKE_SEQ_PROPERTY = 366,    /* KW_MAKE_SEQ_PROPERTY  */
+    KW_MUTABLE = 367,              /* KW_MUTABLE  */
+    KW_NAMESPACE = 368,            /* KW_NAMESPACE  */
+    KW_NEW = 369,                  /* KW_NEW  */
+    KW_NOEXCEPT = 370,             /* KW_NOEXCEPT  */
+    KW_NOEXCEPT_LPAREN = 371,      /* KW_NOEXCEPT_LPAREN  */
+    KW_NULLPTR = 372,              /* KW_NULLPTR  */
+    KW_OPERATOR = 373,             /* KW_OPERATOR  */
+    KW_OVERRIDE = 374,             /* KW_OVERRIDE  */
+    KW_PRIVATE = 375,              /* KW_PRIVATE  */
+    KW_PROTECTED = 376,            /* KW_PROTECTED  */
+    KW_PUBLIC = 377,               /* KW_PUBLIC  */
+    KW_REGISTER = 378,             /* KW_REGISTER  */
+    KW_REINTERPRET_CAST = 379,     /* KW_REINTERPRET_CAST  */
+    KW_RETURN = 380,               /* KW_RETURN  */
+    KW_SHORT = 381,                /* KW_SHORT  */
+    KW_SIGNED = 382,               /* KW_SIGNED  */
+    KW_SIZEOF = 383,               /* KW_SIZEOF  */
+    KW_STATIC = 384,               /* KW_STATIC  */
+    KW_STATIC_ASSERT = 385,        /* KW_STATIC_ASSERT  */
+    KW_STATIC_CAST = 386,          /* KW_STATIC_CAST  */
+    KW_STRUCT = 387,               /* KW_STRUCT  */
+    KW_TEMPLATE = 388,             /* KW_TEMPLATE  */
+    KW_THREAD_LOCAL = 389,         /* KW_THREAD_LOCAL  */
+    KW_THROW = 390,                /* KW_THROW  */
+    KW_TRUE = 391,                 /* KW_TRUE  */
+    KW_TRY = 392,                  /* KW_TRY  */
+    KW_TYPEDEF = 393,              /* KW_TYPEDEF  */
+    KW_TYPEID = 394,               /* KW_TYPEID  */
+    KW_TYPENAME = 395,             /* KW_TYPENAME  */
+    KW_UNDERLYING_TYPE = 396,      /* KW_UNDERLYING_TYPE  */
+    KW_UNION = 397,                /* KW_UNION  */
+    KW_UNSIGNED = 398,             /* KW_UNSIGNED  */
+    KW_USING = 399,                /* KW_USING  */
+    KW_VIRTUAL = 400,              /* KW_VIRTUAL  */
+    KW_VOID = 401,                 /* KW_VOID  */
+    KW_VOLATILE = 402,             /* KW_VOLATILE  */
+    KW_WCHAR_T = 403,              /* KW_WCHAR_T  */
+    KW_WHILE = 404,                /* KW_WHILE  */
+    START_CPP = 405,               /* START_CPP  */
+    START_CONST_EXPR = 406,        /* START_CONST_EXPR  */
+    START_TYPE = 407               /* START_TYPE  */
   };
   typedef enum yytokentype yytoken_kind_t;
 #endif
@@ -284,79 +286,81 @@ extern int cppyydebug;
 #define KW_EXTENSION 330
 #define KW_EXTERN 331
 #define KW_EXPLICIT 332
-#define KW_PUBLISHED 333
-#define KW_FALSE 334
-#define KW_FINAL 335
-#define KW_FLOAT 336
-#define KW_FRIEND 337
-#define KW_FOR 338
-#define KW_GOTO 339
-#define KW_HAS_VIRTUAL_DESTRUCTOR 340
-#define KW_IF 341
-#define KW_INLINE 342
-#define KW_INT 343
-#define KW_IS_ABSTRACT 344
-#define KW_IS_BASE_OF 345
-#define KW_IS_CLASS 346
-#define KW_IS_CONSTRUCTIBLE 347
-#define KW_IS_CONVERTIBLE_TO 348
-#define KW_IS_DESTRUCTIBLE 349
-#define KW_IS_EMPTY 350
-#define KW_IS_ENUM 351
-#define KW_IS_FINAL 352
-#define KW_IS_FUNDAMENTAL 353
-#define KW_IS_POD 354
-#define KW_IS_POLYMORPHIC 355
-#define KW_IS_STANDARD_LAYOUT 356
-#define KW_IS_TRIVIAL 357
-#define KW_IS_UNION 358
-#define KW_LONG 359
-#define KW_MAKE_MAP_KEYS_SEQ 360
-#define KW_MAKE_MAP_PROPERTY 361
-#define KW_MAKE_PROPERTY 362
-#define KW_MAKE_PROPERTY2 363
-#define KW_MAKE_SEQ 364
-#define KW_MAKE_SEQ_PROPERTY 365
-#define KW_MUTABLE 366
-#define KW_NAMESPACE 367
-#define KW_NEW 368
-#define KW_NOEXCEPT 369
-#define KW_NULLPTR 370
-#define KW_OPERATOR 371
-#define KW_OVERRIDE 372
-#define KW_PRIVATE 373
-#define KW_PROTECTED 374
-#define KW_PUBLIC 375
-#define KW_REGISTER 376
-#define KW_REINTERPRET_CAST 377
-#define KW_RETURN 378
-#define KW_SHORT 379
-#define KW_SIGNED 380
-#define KW_SIZEOF 381
-#define KW_STATIC 382
-#define KW_STATIC_ASSERT 383
-#define KW_STATIC_CAST 384
-#define KW_STRUCT 385
-#define KW_TEMPLATE 386
-#define KW_THREAD_LOCAL 387
-#define KW_THROW 388
-#define KW_TRUE 389
-#define KW_TRY 390
-#define KW_TYPEDEF 391
-#define KW_TYPEID 392
-#define KW_TYPENAME 393
-#define KW_UNDERLYING_TYPE 394
-#define KW_UNION 395
-#define KW_UNSIGNED 396
-#define KW_USING 397
-#define KW_VIRTUAL 398
-#define KW_VOID 399
-#define KW_VOLATILE 400
-#define KW_WCHAR_T 401
-#define KW_WHILE 402
-#define START_CPP 403
-#define START_CONST_EXPR 404
-#define START_TYPE 405
+#define KW_EXPLICIT_LPAREN 333
+#define KW_PUBLISHED 334
+#define KW_FALSE 335
+#define KW_FINAL 336
+#define KW_FLOAT 337
+#define KW_FRIEND 338
+#define KW_FOR 339
+#define KW_GOTO 340
+#define KW_HAS_VIRTUAL_DESTRUCTOR 341
+#define KW_IF 342
+#define KW_INLINE 343
+#define KW_INT 344
+#define KW_IS_ABSTRACT 345
+#define KW_IS_BASE_OF 346
+#define KW_IS_CLASS 347
+#define KW_IS_CONSTRUCTIBLE 348
+#define KW_IS_CONVERTIBLE_TO 349
+#define KW_IS_DESTRUCTIBLE 350
+#define KW_IS_EMPTY 351
+#define KW_IS_ENUM 352
+#define KW_IS_FINAL 353
+#define KW_IS_FUNDAMENTAL 354
+#define KW_IS_POD 355
+#define KW_IS_POLYMORPHIC 356
+#define KW_IS_STANDARD_LAYOUT 357
+#define KW_IS_TRIVIAL 358
+#define KW_IS_UNION 359
+#define KW_LONG 360
+#define KW_MAKE_MAP_KEYS_SEQ 361
+#define KW_MAKE_MAP_PROPERTY 362
+#define KW_MAKE_PROPERTY 363
+#define KW_MAKE_PROPERTY2 364
+#define KW_MAKE_SEQ 365
+#define KW_MAKE_SEQ_PROPERTY 366
+#define KW_MUTABLE 367
+#define KW_NAMESPACE 368
+#define KW_NEW 369
+#define KW_NOEXCEPT 370
+#define KW_NOEXCEPT_LPAREN 371
+#define KW_NULLPTR 372
+#define KW_OPERATOR 373
+#define KW_OVERRIDE 374
+#define KW_PRIVATE 375
+#define KW_PROTECTED 376
+#define KW_PUBLIC 377
+#define KW_REGISTER 378
+#define KW_REINTERPRET_CAST 379
+#define KW_RETURN 380
+#define KW_SHORT 381
+#define KW_SIGNED 382
+#define KW_SIZEOF 383
+#define KW_STATIC 384
+#define KW_STATIC_ASSERT 385
+#define KW_STATIC_CAST 386
+#define KW_STRUCT 387
+#define KW_TEMPLATE 388
+#define KW_THREAD_LOCAL 389
+#define KW_THROW 390
+#define KW_TRUE 391
+#define KW_TRY 392
+#define KW_TYPEDEF 393
+#define KW_TYPEID 394
+#define KW_TYPENAME 395
+#define KW_UNDERLYING_TYPE 396
+#define KW_UNION 397
+#define KW_UNSIGNED 398
+#define KW_USING 399
+#define KW_VIRTUAL 400
+#define KW_VOID 401
+#define KW_VOLATILE 402
+#define KW_WCHAR_T 403
+#define KW_WHILE 404
+#define START_CPP 405
+#define START_CONST_EXPR 406
+#define START_TYPE 407
 
 /* Value type.  */
 

+ 28 - 7
dtool/src/cppparser/cppBison.yxx

@@ -283,6 +283,7 @@ pop_struct() {
 %token KW_EXTENSION
 %token KW_EXTERN
 %token KW_EXPLICIT
+%token KW_EXPLICIT_LPAREN
 %token KW_PUBLISHED
 %token KW_FALSE
 %token KW_FINAL
@@ -320,6 +321,7 @@ pop_struct() {
 %token KW_NAMESPACE
 %token KW_NEW
 %token KW_NOEXCEPT
+%token KW_NOEXCEPT_LPAREN
 %token KW_NULLPTR
 %token KW_OPERATOR
 %token KW_OVERRIDE
@@ -995,6 +997,15 @@ storage_class:
         | KW_EXPLICIT storage_class
 {
   $$ = $2 | (int)CPPInstance::SC_explicit;
+}
+        | KW_EXPLICIT_LPAREN const_expr ')' storage_class
+{
+  CPPExpression::Result result = $2->evaluate();
+  if (result._type == CPPExpression::RT_error) {
+    yywarning("explicit() requires a constant expression", @2);
+  } else if (result.as_boolean()) {
+    $$ = $4 | (int)CPPInstance::SC_explicit;
+  }
 }
         | KW_REGISTER storage_class
 {
@@ -1452,15 +1463,15 @@ function_post:
 {
   $$ = $1 | (int)CPPFunctionType::F_noexcept;
 }
-/*        | function_post KW_NOEXCEPT '(' const_expr ')'
+        | function_post KW_NOEXCEPT_LPAREN const_expr ')'
 {
-  CPPExpression::Result result = $4->evaluate();
+  CPPExpression::Result result = $3->evaluate();
   if (result._type == CPPExpression::RT_error) {
-    yywarning("noexcept requires a constant expression", @4);
+    yywarning("noexcept() requires a constant expression", @3);
   } else if (result.as_boolean()) {
     $$ = $1 | (int)CPPFunctionType::F_noexcept;
   }
-}*/
+}
         | function_post KW_FINAL
 {
   $$ = $1 | (int)CPPFunctionType::F_final;
@@ -3071,6 +3082,12 @@ using_declaration:
   CPPUsing *using_decl = new CPPUsing($3, true, @1.file);
   current_scope->add_declaration(using_decl, global_scope, current_lexer, @1);
   current_scope->add_using(using_decl, global_scope, current_lexer);
+}
+        | KW_USING KW_ENUM name ';'
+{
+  CPPUsing *using_decl = new CPPUsing($3, false, @1.file);
+  current_scope->add_declaration(using_decl, global_scope, current_lexer, @1);
+  current_scope->add_using(using_decl, global_scope, current_lexer);
 }
         ;
 
@@ -3219,10 +3236,10 @@ element:
         | KW_CHAR | KW_CHAR8_T | KW_CHAR16_T | KW_CHAR32_T | KW_CLASS
         | KW_CONST | KW_CONSTEVAL | KW_CONSTEXPR | KW_CONSTINIT | KW_CONST_CAST
         | KW_DECLTYPE | KW_DEFAULT | KW_DELETE | KW_DOUBLE | KW_DYNAMIC_CAST
-        | KW_ELSE | KW_ENUM | KW_EXTERN | KW_EXPLICIT
+        | KW_ELSE | KW_ENUM | KW_EXTERN | KW_EXPLICIT | KW_EXPLICIT_LPAREN
         | KW_FALSE | KW_FINAL | KW_FLOAT | KW_FRIEND | KW_FOR
-        | KW_GOTO | KW_IF | KW_INLINE | KW_INT
-        | KW_LONG | KW_MUTABLE | KW_NAMESPACE | KW_NEW | KW_NULLPTR
+        | KW_GOTO | KW_IF | KW_INLINE | KW_INT | KW_LONG | KW_MUTABLE
+        | KW_NAMESPACE | KW_NEW | KW_NOEXCEPT | KW_NOEXCEPT_LPAREN | KW_NULLPTR
         | KW_OPERATOR | KW_OVERRIDE | KW_PRIVATE | KW_PROTECTED
         | KW_PUBLIC | KW_PUBLISHED | KW_REGISTER | KW_REINTERPRET_CAST
         | KW_RETURN | KW_SHORT | KW_SIGNED | KW_SIZEOF | KW_STATIC
@@ -3723,6 +3740,10 @@ const_expr:
         | const_expr '(' ')'
 {
   $$ = new CPPExpression('f', $1);
+}
+        | KW_NOEXCEPT_LPAREN const_expr ')'
+{
+  $$ = new CPPExpression(KW_NOEXCEPT, $2);
 }
         | const_expr '.' name
 {

+ 10 - 0
dtool/src/cppparser/cppExpression.cxx

@@ -860,6 +860,9 @@ evaluate() const {
     case ',':
       return r2;
 
+    case KW_NOEXCEPT:
+      return Result();
+
     default:
       cerr << "**unexpected operator**\n";
       abort();
@@ -1180,6 +1183,7 @@ determine_type() const {
     case GECOMPARE:
     case '<':
     case '>':
+    case KW_NOEXCEPT:
       return bool_type;
 
     case SPACESHIP:
@@ -1908,6 +1912,12 @@ output(std::ostream &out, int indent_level, CPPScope *scope, bool) const {
       out << "()";
       break;
 
+    case KW_NOEXCEPT:
+      out << "noexcept(";
+      _u._op._op1->output(out, indent_level, scope, false);
+      out << ")";
+      break;
+
     default:
       out << "(" << (char)_u._op._operator << " ";
       _u._op._op1->output(out, indent_level, scope, false);

+ 18 - 0
dtool/src/cppparser/cppPreprocessor.cxx

@@ -1987,6 +1987,24 @@ get_identifier(int c) {
   }
 
   if (kw != 0) {
+    if (kw == KW_EXPLICIT || kw == KW_NOEXCEPT) {
+      // These can be followed by a left-paren.  Doing this helps to avoid
+      // shift/reduce conflicts in the parser.
+      while (c != EOF && isspace(c)) {
+        get();
+        c = peek();
+      }
+      if (c == '(') {
+        if (kw == KW_EXPLICIT) {
+          kw = KW_EXPLICIT_LPAREN;
+        }
+        else if (kw == KW_NOEXCEPT) {
+          kw = KW_NOEXCEPT_LPAREN;
+        }
+        get();
+      }
+    }
+
     YYSTYPE result;
     result.u.identifier = nullptr;
     return CPPToken(kw, loc, name, result);

Some files were not shown because too many files changed in this diff