Mercurial > octave-nkf
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));