diff libinterp/octave-value/ov-classdef.cc @ 18520:932aca9a7c57

Allow multi-level classdef package. * lex.h (octave_base_lexer::fq_identifier_contains_keyword, octave_base_lexer::handle_fq_identifier, octave_base_lexer::enable_fq_identifier): New methods. * lex.ll (octave_base_lexer::fq_identifier_contains_keyword, octave_base_lexer::handle_fq_identifier, octave_base_lexer::enable_fq_identifier): Likewise. (FQ_IDENT_START, FQIDENT): New exclusive start condition and regex to handle fully-qualified identifier. (superclass reference rule, metaclass query rule): Use FQIDENT. (octave_base_lexer::handle_superclass_identifier, octave_base_lexer::handle_meta_identifier): Don't split package name. * parse.h (octave_base_parser::make_superclass_ref, octave_base_parser::make_meta_class_query): Remove package_nm argument. * pt-classdef.h (tree_classdef_superclass::id, tree_classdef_superclass::pkg): Removed members, replaced by cls_name. (tree_classdef_superclass::~tree_classdef_superclass): Remove deletion of removed members. (tree_classdef_superclass::cls_name): New member. (tree_classdef_superclass::tree_classdef_superclass): Initialize it. (tree_classdef_superclass::ident, tree_classdef_superclass::package): Removed methods. (tree_classdef_superclass::class_name): New method. * token.h (token::meta_name_token): Remove enum value. (token(int, std::string, std::string, std::string, int, int)): Remove constructor. (token::superclass_package_name, token::meta_package_name, token::meta_class_name): Remove methods. (token::sc::package_nm, token::mc): Remove union members. * token.cc (token(int, std::string, std::string, std::string, int, int)): Remove constructor. (token::~token): Remove case of meta_name_token. (token::superclass_package_name, token::meta_package_name, token::meta_class_name): Remove methods. * oct-parse.in.yy (FQ_IDENT): New terminal. (superclass_identifier): Adapt to changes in class token and class octave_base_parser. (meta_identifier): Likewise. (superclass_list): Add mid-rule to enable fully-qualified identifier. (superclass): Use FQ_IDENT. (octave_base_parser::make_superclass_ref, octave_base_parser::make_meta_class_query): Remove package_nm argument. * ov-classdef.cc (octave_classdef_superclass_ref::do_multi_index_op): Adapt to removal of package_nm argument. (F__meta_class_query__): Likewise. (cdef_class::make_meta_class): Adapt to changes in class tree_classdef_superclass.
author Michael Goffioul <michael.goffioul@gmail.com>
date Sat, 22 Feb 2014 19:56:17 -0500
parents 00ba456b9aa8
children fe0e34be5576
line wrap: on
line diff
--- a/libinterp/octave-value/ov-classdef.cc	Sat Feb 22 08:23:26 2014 -0800
+++ b/libinterp/octave-value/ov-classdef.cc	Sat Feb 22 19:56:17 2014 -0500
@@ -1221,12 +1221,9 @@
       if (! error_state && ctx.ok ())
         {
           std::string mname = args(0).string_value ();
-          std::string pname = args(1).string_value ();
-          std::string cname = args(2).string_value ();
-
-          std::string cls_name = (pname.empty () ?
-                                  cname : pname + "." + cname);
-          cdef_class cls = lookup_class (cls_name);
+          std::string cname = args(1).string_value ();
+
+          cdef_class cls = lookup_class (cname);
 
           if (! error_state)
             {
@@ -1248,7 +1245,7 @@
                     }
                   else
                     ::error ("`%s' is not a direct superclass of `%s'",
-                             cls_name.c_str (), ctx.get_name ().c_str ());
+                             cname.c_str (), ctx.get_name ().c_str ());
                 }
               else
                 {
@@ -1274,11 +1271,11 @@
                                                    meth_name);
                           else
                             ::error ("no method `%s' found in superclass `%s'",
-                                     meth_name.c_str (), cls_name.c_str ());
+                                     meth_name.c_str (), cname.c_str ());
                         }
                       else
                         ::error ("`%s' is not a superclass of `%s'",
-                                 cls_name.c_str (), ctx.get_name ().c_str ());
+                                 cname.c_str (), ctx.get_name ().c_str ());
                     }
                   else
                     ::error ("method name mismatch (`%s' != `%s')",
@@ -1969,14 +1966,9 @@
 
                   if (args(0).string_value () == obj_name)
                     {
-                      std::string package_name = args(1).string_value ();
-                      std::string class_name = args(2).string_value ();
-
-                      std::string ctor_name = (package_name.empty ()
-                                               ? class_name
-                                               : package_name + "." + class_name);
-
-                      cdef_class cls = lookup_class (ctor_name, false);
+                      std::string class_name = args(1).string_value ();
+
+                      cdef_class cls = lookup_class (class_name, false);
 
                       if (cls.ok ())
                         ctor_list.push_back (cls);
@@ -2702,9 +2694,7 @@
       for (tree_classdef_superclass_list::iterator it = t->superclass_list ()->begin ();
            ! error_state && it != t->superclass_list ()->end (); ++it)
         {
-          std::string sclass_name =
-            ((*it)->package () ? (*it)->package ()->name () + "." : std::string ())
-            + (*it)->ident ()->name ();
+          std::string sclass_name = (*it)->class_name ();
 
           gnulib::printf ("superclass: %s\n", sclass_name.c_str ());
 
@@ -3872,17 +3862,12 @@
   octave_value retval;
 
   std::cerr << "__meta_class_query__ ("
-            << args(0).string_value () << ", "
-            << args(1).string_value () << ")"
+            << args(0).string_value () << ")"
             << std::endl;
 
-  if (args.length () == 2)
+  if (args.length () == 1)
     {
-      std::string pkg = args(0).string_value ();
-      std::string cls = args(1).string_value ();
-
-      if (! pkg.empty ())
-        cls = pkg + "." + cls;
+      std::string cls = args(0).string_value ();
 
       if (! error_state)
 	retval = to_ov (lookup_class (cls));