diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Freeze/EvictorI.cpp | 12 | ||||
-rw-r--r-- | cpp/src/Freeze/EvictorI.h | 4 | ||||
-rw-r--r-- | cpp/src/Ice/Object.cpp | 14 | ||||
-rw-r--r-- | cpp/src/Slice/Grammer.y | 130 | ||||
-rw-r--r-- | cpp/src/Slice/GrammerUtil.h | 14 | ||||
-rw-r--r-- | cpp/src/Slice/Parser.cpp | 43 | ||||
-rw-r--r-- | cpp/src/Slice/Scanner.l | 137 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 14 | ||||
-rw-r--r-- | cpp/src/slice2docbook/Gen.cpp | 92 | ||||
-rw-r--r-- | cpp/src/slice2docbook/Gen.h | 1 |
10 files changed, 352 insertions, 109 deletions
diff --git a/cpp/src/Freeze/EvictorI.cpp b/cpp/src/Freeze/EvictorI.cpp index dc402c0bf89..c3c8404a54b 100644 --- a/cpp/src/Freeze/EvictorI.cpp +++ b/cpp/src/Freeze/EvictorI.cpp @@ -33,6 +33,16 @@ Freeze::EvictorI::EvictorI(const DBPtr& db, const CommunicatorPtr& communicator) } } +DBPtr +Freeze::EvictorI::getDB() +{ + // + // No synchronizaton necessary, _db is immutable once the Evictor + // has been created + // + return _db; +} + void Freeze::EvictorI::setSize(Int evictorSize) { @@ -234,7 +244,7 @@ Freeze::EvictorI::finished(const ObjectAdapterPtr&, const string& identity, cons // if (_persistenceMode == SaveAfterMutatingOperation) { - if (servant->_isMutating(operation)) + if (servant->__isMutating(operation)) { _db->put(identity, servant); } diff --git a/cpp/src/Freeze/EvictorI.h b/cpp/src/Freeze/EvictorI.h index 89164c8d17e..7252dd2db32 100644 --- a/cpp/src/Freeze/EvictorI.h +++ b/cpp/src/Freeze/EvictorI.h @@ -24,7 +24,9 @@ class EvictorI : public Evictor, public JTCMutex public: EvictorI(const Freeze::DBPtr&, const Ice::CommunicatorPtr&); - + + virtual DBPtr getDB(); + virtual void setSize(Ice::Int); virtual Ice::Int getSize(); diff --git a/cpp/src/Ice/Object.cpp b/cpp/src/Ice/Object.cpp index a97fc148d9c..4c005c6df60 100644 --- a/cpp/src/Ice/Object.cpp +++ b/cpp/src/Ice/Object.cpp @@ -104,12 +104,16 @@ string Ice::Object::__names[] = "_ping" }; +string Ice::Object::__mutating[] = +{ +}; + DispatchStatus -Ice::Object::__dispatch(Incoming& in, const string& name) +Ice::Object::__dispatch(Incoming& in, const string& s) { string* b = __names; string* e = __names + sizeof(__names) / sizeof(string); - pair<string*, string*> r = equal_range(b, e, name); + pair<string*, string*> r = equal_range(b, e, s); if (r.first == r.second) { return DispatchOperationNotExist; @@ -132,7 +136,9 @@ Ice::Object::__dispatch(Incoming& in, const string& name) } bool -Ice::Object::_isMutating(const std::string&) +Ice::Object::__isMutating(const std::string& s) { - return false; + string* b = __mutating; + string* e = __mutating + sizeof(__mutating) / sizeof(string); + return ::std::binary_search(b, e, s); } diff --git a/cpp/src/Slice/Grammer.y b/cpp/src/Slice/Grammer.y index ad41425efcf..3d01167da24 100644 --- a/cpp/src/Slice/Grammer.y +++ b/cpp/src/Slice/Grammer.y @@ -61,6 +61,7 @@ yyerror(const char* s) %token ICE_SCOPE_DELIMITOR %token ICE_IDENTIFIER %token ICE_OP_IDENTIFIER +%token ICE_OP_KEYWORD %% @@ -191,6 +192,10 @@ struct_decl { unit->error("structs can not be forward declared"); } +| ICE_STRUCT keyword +{ + unit->error("keyword can not be used as struct name"); +} ; // ---------------------------------------------------------------------- @@ -211,6 +216,13 @@ struct_def { unit->popContainer(); } +| ICE_STRUCT keyword +{ + unit->error("keyword can not be used as struct name"); +} +'{' struct_exports '}' +{ +} ; // ---------------------------------------------------------------------- @@ -286,6 +298,10 @@ class_decl ContainerPtr cont = unit->currentContainer(); ClassDeclPtr cl = cont->createClassDecl(ident->v, local->v, false); } +| local ICE_CLASS keyword +{ + unit->error("keyword can not be used as class name"); +} ; // ---------------------------------------------------------------------- @@ -313,6 +329,13 @@ class_def { unit->popContainer(); } +| local ICE_CLASS keyword class_extends implements +{ + unit->error("keyword can not be used as class name"); +} +'{' class_exports '}' +{ +} ; // ---------------------------------------------------------------------- @@ -380,6 +403,10 @@ interface_decl ContainerPtr cont = unit->currentContainer(); ClassDeclPtr cl = cont->createClassDecl(ident->v, local->v, true); } +| local ICE_INTERFACE keyword +{ + unit->error("keyword can not be used as interface name"); +} ; // ---------------------------------------------------------------------- @@ -402,6 +429,13 @@ interface_def { unit->popContainer(); } +| local ICE_INTERFACE keyword interface_extends +{ + unit->error("keyword can not be used as interface name"); +} +'{' interface_exports '}' +{ +} ; // ---------------------------------------------------------------------- @@ -501,7 +535,10 @@ operation TypeStringListTokPtr outParms = TypeStringListTokPtr::dynamicCast($4); TypeListTokPtr throws = TypeListTokPtr::dynamicCast($6); ClassDefPtr cl = ClassDefPtr::dynamicCast(unit->currentContainer()); - cl->createOperation(name->v, returnType, inParms->v, outParms->v, throws->v, false); + if (cl) + { + cl->createOperation(name->v, returnType, inParms->v, outParms->v, throws->v, false); + } } | ICE_NONMUTATING return_type ICE_OP_IDENTIFIER parameters output_parameters ')' throws { @@ -511,8 +548,20 @@ operation TypeStringListTokPtr outParms = TypeStringListTokPtr::dynamicCast($5); TypeListTokPtr throws = TypeListTokPtr::dynamicCast($7); ClassDefPtr cl = ClassDefPtr::dynamicCast(unit->currentContainer()); - cl->createOperation(name->v, returnType, inParms->v, outParms->v, throws->v, true); + if (cl) + { + cl->createOperation(name->v, returnType, inParms->v, outParms->v, throws->v, true); + } +} +| return_type ICE_OP_KEYWORD parameters output_parameters ')' throws +{ + unit->error("keyword can not be used as operation name"); } +| ICE_NONMUTATING return_type ICE_OP_KEYWORD parameters output_parameters ')' throws +{ + unit->error("keyword can not be used as operation name"); +} +; // ---------------------------------------------------------------------- parameters @@ -594,16 +643,18 @@ data_member ClassDefPtr cl = ClassDefPtr::dynamicCast(unit->currentContainer()); if (cl) { - assert(!cl->isInterface()); cl->createDataMember(ident->v, type); } - else + StructPtr st = StructPtr::dynamicCast(unit->currentContainer()); + if (st) { - StructPtr st = StructPtr::dynamicCast(unit->currentContainer()); - assert(st); st->createDataMember(ident->v, type); } } +| type keyword +{ + unit->error("keyword can not be used as data member name"); +} ; // ---------------------------------------------------------------------- @@ -735,6 +786,10 @@ native_def ContainerPtr cont = unit->currentContainer(); cont->createNative(ident->v); } +| ICE_NATIVE keyword +{ + unit->error("keyword can not be used as native name"); +} ; // ---------------------------------------------------------------------- @@ -747,6 +802,10 @@ sequence_def ContainerPtr cont = unit->currentContainer(); cont->createSequence(ident->v, type); } +| ICE_SEQUENCE '<' type '>' keyword +{ + unit->error("keyword can not be used as sequence name"); +} ; // ---------------------------------------------------------------------- @@ -760,47 +819,73 @@ dictionary_def ContainerPtr cont = unit->currentContainer(); cont->createDictionary(ident->v, keyType, valueType); } +| ICE_DICTIONARY '<' type ',' type '>' keyword +{ + unit->error("keyword can not be used as dictionary name"); +} ; // ---------------------------------------------------------------------- enum_def // ---------------------------------------------------------------------- -: ICE_ENUM ICE_IDENTIFIER '{' identifier_list '}' +: ICE_ENUM ICE_IDENTIFIER { StringTokPtr ident = StringTokPtr::dynamicCast($2); - StringListTokPtr enumerators = StringListTokPtr::dynamicCast($4); ContainerPtr cont = unit->currentContainer(); - EnumPtr en = cont->createEnum(ident->v, enumerators->v); + EnumPtr en = cont->createEnum(ident->v); + $$ = en; +} +'{' enumerator_list '}' +{ + EnumPtr en = EnumPtr::dynamicCast($3); + EnumeratorListTokPtr enumerators = EnumeratorListTokPtr::dynamicCast($5); + en->setEnumerators(enumerators->v); +} +| ICE_ENUM keyword +{ + unit->error("keyword can not be used as enum name"); +} +'{' enumerator_list '}' +{ } ; // ---------------------------------------------------------------------- -identifier_list +enumerator_list // ---------------------------------------------------------------------- -: ICE_IDENTIFIER ',' identifier_list +: enumerator ',' enumerator_list { - StringTokPtr ident = StringTokPtr::dynamicCast($1); - StringListTokPtr ens = StringListTokPtr::dynamicCast($3); + EnumeratorListTokPtr ens = EnumeratorListTokPtr::dynamicCast($1); + ens->v.splice(ens->v.end(), EnumeratorListTokPtr::dynamicCast($3)->v); $$ = ens; - ContainerPtr cont = unit->currentContainer(); - EnumeratorPtr en = cont->createEnumerator(ident->v); - if (en) - { - ens->v.push_front(ident->v); - } } -| ICE_IDENTIFIER +| enumerator +{ + $$ = $1; +} +; + +// ---------------------------------------------------------------------- +enumerator +// ---------------------------------------------------------------------- +: ICE_IDENTIFIER { StringTokPtr ident = StringTokPtr::dynamicCast($1); - StringListTokPtr ens = new StringListTok; + EnumeratorListTokPtr ens = new EnumeratorListTok; $$ = ens; ContainerPtr cont = unit->currentContainer(); EnumeratorPtr en = cont->createEnumerator(ident->v); if (en) { - ens->v.push_front(ident->v); + ens->v.push_front(en); } } +| keyword +{ + unit->error("keyword can not be used as enumerator"); + EnumeratorListTokPtr ens = new EnumeratorListTok; + $$ = ens; +} ; // ---------------------------------------------------------------------- @@ -904,5 +989,6 @@ keyword | ICE_NONMUTATING { } +; %% diff --git a/cpp/src/Slice/GrammerUtil.h b/cpp/src/Slice/GrammerUtil.h index e8a354f4541..4641c6d49fc 100644 --- a/cpp/src/Slice/GrammerUtil.h +++ b/cpp/src/Slice/GrammerUtil.h @@ -22,6 +22,7 @@ class StringListTok; class BoolTok; class TypeListTok; class ClassListTok; +class EnumeratorListTok; typedef ::IceUtil::Handle<StringTok> StringTokPtr; typedef ::IceUtil::Handle<TypeStringListTok> TypeStringListTokPtr; @@ -29,6 +30,7 @@ typedef ::IceUtil::Handle<StringListTok> StringListTokPtr; typedef ::IceUtil::Handle<BoolTok> BoolTokPtr; typedef ::IceUtil::Handle<TypeListTok> TypeListTokPtr; typedef ::IceUtil::Handle<ClassListTok> ClassListTokPtr; +typedef ::IceUtil::Handle<EnumeratorListTok> EnumeratorListTokPtr; } @@ -107,6 +109,18 @@ public: ClassList v; }; +// ---------------------------------------------------------------------- +// EnumeratorListTok +// ---------------------------------------------------------------------- + +class SLICE_API EnumeratorListTok : public GrammerBase +{ +public: + + EnumeratorListTok() { } + EnumeratorList v; +}; + } #endif diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp index 3aa831637bb..d2aa25f17f7 100644 --- a/cpp/src/Slice/Parser.cpp +++ b/cpp/src/Slice/Parser.cpp @@ -60,7 +60,7 @@ Slice::Type::Type(const UnitPtr& unit) : // Builtin // ---------------------------------------------------------------------- -Slice::Builtin::Kind +Builtin::Kind Slice::Builtin::kind() { return _kind; @@ -484,7 +484,7 @@ Slice::Container::createDictionary(const string& name, const TypePtr& keyType, c } EnumPtr -Slice::Container::createEnum(const string& name, const StringList& enumerators) +Slice::Container::createEnum(const string& name) { ContainedList matches = _unit->findContents(thisScope() + name); if (!matches.empty()) @@ -511,7 +511,7 @@ Slice::Container::createEnum(const string& name, const StringList& enumerators) return 0; } - EnumPtr p = new Enum(this, name, enumerators); + EnumPtr p = new Enum(this, name); _contents.push_back(p); return p; } @@ -1071,7 +1071,7 @@ Slice::Container::checkInterfaceAndLocal(const string& name, bool defined, // Module // ---------------------------------------------------------------------- -Slice::Contained::ContainedType +Contained::ContainedType Slice::Module::containedType() { return ContainedTypeModule; @@ -1132,7 +1132,7 @@ Slice::ClassDecl::isInterface() return _interface; } -Slice::Contained::ContainedType +Contained::ContainedType Slice::ClassDecl::containedType() { return ContainedTypeClass; @@ -1400,7 +1400,7 @@ Slice::ClassDef::hasDataMembers() return _hasDataMembers; } -Slice::Contained::ContainedType +Contained::ContainedType Slice::ClassDef::containedType() { return ContainedTypeClass; @@ -1530,7 +1530,7 @@ Slice::Struct::dataMembers() return result; } -Slice::Contained::ContainedType +Contained::ContainedType Slice::Struct::containedType() { return ContainedTypeStruct; @@ -1594,7 +1594,7 @@ Slice::Operation::nonmutating() return _nonmutating; } -Slice::Contained::ContainedType +Contained::ContainedType Slice::Operation::containedType() { return ContainedTypeOperation; @@ -1629,7 +1629,7 @@ Slice::DataMember::type() return _type; } -Slice::Contained::ContainedType +Contained::ContainedType Slice::DataMember::containedType() { return ContainedTypeDataMember; @@ -1652,7 +1652,7 @@ Slice::DataMember::DataMember(const ContainerPtr& container, const string& name, // Native // ---------------------------------------------------------------------- -Slice::Contained::ContainedType +Contained::ContainedType Slice::Native::containedType() { return ContainedTypeNative; @@ -1682,7 +1682,7 @@ Slice::Sequence::type() return _type; } -Slice::Contained::ContainedType +Contained::ContainedType Slice::Sequence::containedType() { return ContainedTypeSequence; @@ -1719,7 +1719,7 @@ Slice::Dictionary::valueType() return _valueType; } -Slice::Contained::ContainedType +Contained::ContainedType Slice::Dictionary::containedType() { return ContainedTypeDictionary; @@ -1746,13 +1746,19 @@ Slice::Dictionary::Dictionary(const ContainerPtr& container, const string& name, // Enum // ---------------------------------------------------------------------- -Slice::StringList -Slice::Enum::enumerators() +EnumeratorList +Slice::Enum::getEnumerators() { return _enumerators; } -Slice::Contained::ContainedType +void +Slice::Enum::setEnumerators(const EnumeratorList& ens) +{ + _enumerators = ens; +} + +Contained::ContainedType Slice::Enum::containedType() { return ContainedTypeEnum; @@ -1764,12 +1770,11 @@ Slice::Enum::visit(ParserVisitor* visitor) visitor->visitEnum(this); } -Slice::Enum::Enum(const ContainerPtr& container, const string& name, const StringList& enumerators) : +Slice::Enum::Enum(const ContainerPtr& container, const string& name) : Constructed(container, name), Type(container->unit()), Contained(container, name), - SyntaxTreeBase(container->unit()), - _enumerators(enumerators) + SyntaxTreeBase(container->unit()) { } @@ -1777,7 +1782,7 @@ Slice::Enum::Enum(const ContainerPtr& container, const string& name, const Strin // Enumerator // ---------------------------------------------------------------------- -Slice::Contained::ContainedType +Contained::ContainedType Slice::Enumerator::containedType() { return ContainedTypeEnumerator; diff --git a/cpp/src/Slice/Scanner.l b/cpp/src/Slice/Scanner.l index 5956871df0e..916b7b6935d 100644 --- a/cpp/src/Slice/Scanner.l +++ b/cpp/src/Slice/Scanner.l @@ -21,26 +21,21 @@ using namespace Slice; %option noyywrap %option never-interactive -WS [ \t\v\n\r\f] -S [ \t] -D [0-9] -L [a-zA-Z_] - %% -^"#"{S}*{D}+{S}*$ { +^"#"[[:blank:]]*[[:digit:]]+[[:blank:]]*$ { unit->scanPosition(yytext); } -^"#"{S}*{D}+{S}+"\""[^\"]*"\"".*$ { +^"#"[[:blank:]]*[[:digit:]]+[[:blank:]]+"\""[^\"]*"\"".*$ { unit->scanPosition(yytext); } -^"#"{S}*"line"{S}+{D}+{S}*$ { +^"#"[[:blank:]]*"line"[[:blank:]]+[[:digit:]]+[[:blank:]]*$ { unit->scanPosition(yytext); } -^"#"{S}*"line"{S}+{D}+{S}+"\""[^\"]*"\"".*$ { +^"#"[[:blank:]]*"line"[[:blank:]]+[[:digit:]]+[[:blank:]]+"\""[^\"]*"\"".*$ { unit->scanPosition(yytext); } @@ -101,132 +96,218 @@ L [a-zA-Z_] return ICE_MODULE; } +"module"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "class" { return ICE_CLASS; } +"class"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "interface" { return ICE_INTERFACE; } +"interface"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "struct" { return ICE_STRUCT; } +"struct"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "local" { return ICE_LOCAL; } +"local"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "extends" { return ICE_EXTENDS; } +"extends"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "implements" { return ICE_IMPLEMENTS; } +"implements"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "throws" { return ICE_THROWS; } +"throws"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "void" { return ICE_VOID; } +"void"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "byte" { return ICE_BYTE; } +"byte"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "bool" { return ICE_BOOL; } +"bool"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "short" { return ICE_SHORT; } +"short"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "int" { return ICE_INT; } +"int"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "long" { return ICE_LONG; } +"long"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "float" { return ICE_FLOAT; } +"float"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "double" { return ICE_DOUBLE; } +"double"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "string" { return ICE_STRING; } +"string"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "wstring" { return ICE_WSTRING; } +"wstring"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "Object" { return ICE_OBJECT; } +"Object"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "LocalObject" { return ICE_LOCAL_OBJECT; } +"LocalObject"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "native" { return ICE_NATIVE; } +"native"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "sequence" { return ICE_SEQUENCE; } +"sequence"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "dictionary" { return ICE_DICTIONARY; } +"dictionary"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "enum" { return ICE_ENUM; } +"enum"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + "nonmutating" { return ICE_NONMUTATING; } -"\\"?{L}({L}|{D})* { - char* s = yytext; - - if (s[0] == '\\') // Strip leading backslash - { - ++s; - } - +"nonmutating"[[:space:]]*"(" { + return ICE_OP_KEYWORD; +} + +[[:alpha:]_][[:alnum:]_]* { StringTokPtr ident = new StringTok; - ident->v = s; + ident->v = yytext; *yylvalp = ident; return ICE_IDENTIFIER; } -"\\"?{L}({L}|{D})*{WS}*"(" { - char* s = yytext; - - if (s[0] == '\\') // Strip leading backslash - { - ++s; - } - +[[:alpha:]_][[:alnum:]_]*[[:space:]]*"(" { StringTokPtr ident = new StringTok; - ident->v = s; + ident->v = yytext; ident->v.erase(ident->v.find_first_of(" \t\v\n\r\f(")); *yylvalp = ident; return ICE_OP_IDENTIFIER; } -{WS} { +[[:space:]] { // Igore white-space if (yytext[0] == '\n') diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp index 93b0172359e..95ff7ec2e49 100644 --- a/cpp/src/slice2cpp/Gen.cpp +++ b/cpp/src/slice2cpp/Gen.cpp @@ -437,14 +437,14 @@ void Slice::Gen::TypesVisitor::visitEnum(const EnumPtr& p) { string name = p->name(); - StringList enumerators = p->enumerators(); + EnumeratorList enumerators = p->getEnumerators(); H << sp; H << nl << "enum " << name; H << sb; - StringList::iterator en = enumerators.begin(); + EnumeratorList::iterator en = enumerators.begin(); while (en != enumerators.end()) { - H << nl << *en; + H << nl << (*en)->name(); if (++en != enumerators.end()) { H << ','; @@ -1545,9 +1545,9 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p) H << nl << exp2 << "static ::std::string __mutating[" << allMutatingOpNames.size() << "];"; H << nl << exp2 << "virtual ::IceInternal::DispatchStatus " << "__dispatch(::IceInternal::Incoming&, const ::std::string&);"; - H << nl << exp2 << "virtual bool _isMutating(const ::std::string&);"; + H << nl << exp2 << "virtual bool __isMutating(const ::std::string&);"; C << sp; - C << nl << "::std::string " << scoped.substr(2) << "::__all[" << allOpNames.size() << "] ="; + C << nl << "::std::string " << scoped.substr(2) << "::__all[] ="; C << sb; q = allOpNames.begin(); while (q != allOpNames.end()) @@ -1560,7 +1560,7 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p) } C << eb << ';'; C << sp; - C << nl << "::std::string " << scoped.substr(2) << "::__mutating[" << allMutatingOpNames.size() << "] ="; + C << nl << "::std::string " << scoped.substr(2) << "::__mutating[] ="; C << sb; q = allMutatingOpNames.begin(); while (q != allMutatingOpNames.end()) @@ -1601,7 +1601,7 @@ Slice::Gen::ObjectVisitor::visitClassDefEnd(const ClassDefPtr& p) C << eb; C << sp; C << nl << "bool" << nl << scoped.substr(2) - << "::_isMutating(const ::std::string& s)"; + << "::__isMutating(const ::std::string& s)"; C << sb; C << nl << "::std::string* b = __mutating;"; C << nl << "::std::string* e = __mutating + " << allMutatingOpNames.size() << ';'; diff --git a/cpp/src/slice2docbook/Gen.cpp b/cpp/src/slice2docbook/Gen.cpp index c3d16d4d726..ee3e6b952b3 100644 --- a/cpp/src/slice2docbook/Gen.cpp +++ b/cpp/src/slice2docbook/Gen.cpp @@ -322,33 +322,6 @@ Slice::Gen::visitContainer(const ContainerPtr& p) end(); } } - - { - for (EnumList::iterator q = enums.begin(); q != enums.end(); ++q) - { - start("section id=" + containedToId(*q), (*q)->name()); - - O.zeroIndent(); - O << nl << "<synopsis>enum <type>" << (*q)->name() << "</type>"; - O << sb; - StringList enumerators = (*q)->enumerators(); - StringList::iterator r = enumerators.begin(); - while (r != enumerators.end()) - { - O << nl << "<structfield>" << *r << "</structfield>"; - if (++r != enumerators.end()) - { - O << ','; - } - } - O << eb << ";</synopsis>"; - O.restoreIndent(); - - printComment(*q); - - end(); - } - } { for (NativeList::iterator q = natives.begin(); q != natives.end(); ++q) @@ -629,6 +602,63 @@ Slice::Gen::visitStructStart(const StructPtr& p) } void +Slice::Gen::visitEnum(const EnumPtr& p) +{ + start(_chapter + " id=" + containedToId(p), p->scoped().substr(2)); + + start("section", "Overview"); + O.zeroIndent(); + O << nl << "<synopsis>"; + O << "enum <type>" << p->name() << "</type>"; + O << "</synopsis>"; + O.restoreIndent(); + + printComment(p); + + EnumeratorList enumerators = p->getEnumerators(); + enumerators.sort(); + if (!enumerators.empty()) + { + start("section", "Enumerator Index"); + start("variablelist"); + + for (EnumeratorList::iterator q = enumerators.begin(); q != enumerators.end(); ++q) + { + start("varlistentry"); + start("term"); + O << nl << toString(*q, p->container()); + end(); + start("listitem"); + printSummary(*q); + end(); + end(); + } + + end(); + end(); + } + + end(); + + { + for (EnumeratorList::iterator q = enumerators.begin(); q != enumerators.end(); ++q) + { + start("section id=" + containedToId(*q), (*q)->name()); + + O.zeroIndent(); + O << nl << "<synopsis><constant>" << (*q)->name() << "</constant></synopsis>"; + O.restoreIndent(); + + printComment(*q); + + end(); + } + } + + end(); +} + +void Slice::Gen::printHeader() { static const char* header = @@ -994,6 +1024,14 @@ Slice::Gen::toString(const SyntaxTreeBasePtr& p, const ContainerPtr& container) tag = "structname"; } + EnumeratorPtr en = EnumeratorPtr::dynamicCast(p); + if (en) + { + linkend = containedToId(en); + s = getScopedMinimized(en, container); + tag = "constant"; + } + if (s.empty()) { ContainedPtr contained = ContainedPtr::dynamicCast(p); diff --git a/cpp/src/slice2docbook/Gen.h b/cpp/src/slice2docbook/Gen.h index 3d005d1f6c7..ed2bde5dbb3 100644 --- a/cpp/src/slice2docbook/Gen.h +++ b/cpp/src/slice2docbook/Gen.h @@ -35,6 +35,7 @@ public: virtual void visitContainer(const ContainerPtr&); virtual bool visitClassDefStart(const ClassDefPtr&); virtual bool visitStructStart(const StructPtr&); + virtual void visitEnum(const EnumPtr&); private: |