Browse Source

Fix various cppparser issues parsing the VRPN headers

rdb 10 years ago
parent
commit
df4c4bc250
3 changed files with 688 additions and 683 deletions
  1. 657 651
      dtool/src/cppparser/cppBison.cxx.prebuilt
  2. 10 26
      dtool/src/cppparser/cppBison.yxx
  3. 21 6
      dtool/src/cppparser/cppScope.cxx

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


+ 10 - 26
dtool/src/cppparser/cppBison.yxx

@@ -2134,48 +2134,32 @@ code_block:
 
 element:
         REAL
-{
-}
         | INTEGER
-{
-}
         | STRING
-{
-}
         | CHAR_TOK
-{
-}
         | IDENTIFIER
-{
-}
         | TYPENAME_IDENTIFIER
-{
-}
         | SCOPING
-{
-}
         | SIMPLE_IDENTIFIER
-{
-}
         | ELLIPSIS | OROR | ANDAND
         | EQCOMPARE | NECOMPARE | LECOMPARE | GECOMPARE
         | LSHIFT | RSHIFT | POINTSAT_STAR | DOT_STAR | POINTSAT
         | SCOPE | PLUSPLUS | MINUSMINUS
         | TIMESEQUAL | DIVIDEEQUAL | MODEQUAL | PLUSEQUAL | MINUSEQUAL
         | OREQUAL | ANDEQUAL | XOREQUAL | LSHIFTEQUAL | RSHIFTEQUAL
-        | KW_BOOL | KW_CATCH | KW_CHAR | KW_CHAR16_T | KW_CHAR32_T
-        | KW_WCHAR_T | KW_CLASS | KW_CONST
+        | KW_BOOL | KW_CATCH
+        | KW_CHAR | KW_CHAR16_T | KW_CHAR32_T
+        | KW_CLASS | KW_CONST
         | KW_DELETE | KW_DOUBLE | KW_DYNAMIC_CAST | KW_ELSE | KW_ENUM
         | KW_EXTERN | KW_EXPLICIT | KW_FALSE
-        | KW_FLOAT | KW_FRIEND | KW_FOR | KW_GOTO
-        | KW_IF | KW_INLINE | KW_INT
-        | KW_LONG | KW_MUTABLE | KW_NEW | KW_PRIVATE | KW_PROTECTED
+        | KW_FLOAT | KW_FRIEND | KW_FOR | KW_GOTO | KW_IF | KW_INLINE
+        | KW_INT | KW_LONG | KW_MUTABLE | KW_NAMESPACE
+        | KW_NEW | KW_OPERATOR | KW_PRIVATE | KW_PROTECTED
         | KW_PUBLIC | KW_PUBLISHED | KW_REGISTER | KW_RETURN
-        | KW_SHORT | KW_SIGNED | KW_SIZEOF | KW_STATIC | KW_STATIC_CAST
-        | KW_STRUCT | KW_THROW | KW_TRUE | KW_TRY | KW_TYPEDEF | KW_TYPENAME
-        | KW_UNION | KW_UNSIGNED | KW_VIRTUAL | KW_VOID | KW_VOLATILE
-        | KW_WHILE
-        | KW_OPERATOR
+        | KW_SHORT | KW_SIGNED | KW_SIZEOF | KW_STATIC
+        | KW_STATIC_CAST | KW_STRUCT | KW_THROW | KW_TRUE | KW_TRY
+        | KW_TYPEDEF | KW_TYPENAME | KW_UNION | KW_UNSIGNED | KW_USING
+        | KW_VIRTUAL | KW_VOID | KW_VOLATILE | KW_WCHAR_T | KW_WHILE
 {
 }
         | '+' | '-' | '*' | '/' | '&' | '|' | '^' | '!' | '~' | '=' | '%'

+ 21 - 6
dtool/src/cppparser/cppScope.cxx

@@ -252,6 +252,11 @@ define_extension_type(CPPExtensionType *type, CPPPreprocessor *error_sink) {
   }
 
   if (type->is_template()) {
+    CPPTemplateScope *scope = type->get_template_scope();
+    if (scope->_parameters._parameters.size() == 0) {
+      return;
+    }
+
     string simple_name = type->get_simple_name();
 
     pair<Templates::iterator, bool> result =
@@ -596,9 +601,14 @@ find_scope(const string &name, bool recurse) const {
   ti = _types.find(name);
   if (ti != _types.end()) {
     type = (*ti).second;
-    // Resolve if this is a typedef.
-    while (type->as_typedef_type() != (CPPTypedefType *)NULL) {
-      type = type->as_typedef_type()->_type;
+    // Resolve if this is a typedef or const.
+    while (type->get_subtype() == CPPDeclaration::ST_const ||
+           type->get_subtype() == CPPDeclaration::ST_typedef) {
+      if (type->as_typedef_type() != (CPPType *)NULL) {
+        type = type->as_typedef_type()->_type;
+      } else {
+        type = type->as_const_type()->_wrapped_around;
+      }
     }
 
   } else if (_struct_type != NULL) {
@@ -648,9 +658,14 @@ find_scope(const string &name, CPPDeclaration::SubstDecl &subst,
     return NULL;
   }
 
-  // Resolve this if it is a typedef.
-  while (type->get_subtype() == CPPDeclaration::ST_typedef) {
-    type = type->as_typedef_type()->_type;
+  // Resolve if this is a typedef or const.
+  while (type->get_subtype() == CPPDeclaration::ST_const ||
+         type->get_subtype() == CPPDeclaration::ST_typedef) {
+    if (type->as_typedef_type() != (CPPType *)NULL) {
+      type = type->as_typedef_type()->_type;
+    } else {
+      type = type->as_const_type()->_wrapped_around;
+    }
   }
 
   CPPStructType *st = type->as_struct_type();

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