From d3d993d327b53d1b49f2683fa7764e3e847b6dec Mon Sep 17 00:00:00 2001 From: "waterson%netscape.com" Date: Wed, 10 Mar 1999 19:55:00 +0000 Subject: [PATCH] Support for xpidl keyword. git-svn-id: svn://10.0.0.236/trunk@23549 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/dom/tools/FileGen.cpp | 42 +++++++++++++++++++++++++----- mozilla/dom/tools/FileGen.h | 2 ++ mozilla/dom/tools/IdlAttribute.cpp | 1 - mozilla/dom/tools/IdlAttribute.h | 1 - mozilla/dom/tools/IdlParser.cpp | 33 +++++++++++++++++++---- mozilla/dom/tools/IdlScanner.cpp | 37 ++++++++++++++++++++++++++ mozilla/dom/tools/IdlScanner.h | 2 ++ mozilla/dom/tools/IdlVariable.h | 1 + mozilla/dom/tools/XPCOMGen.cpp | 16 +++++++++++- 9 files changed, 120 insertions(+), 15 deletions(-) diff --git a/mozilla/dom/tools/FileGen.cpp b/mozilla/dom/tools/FileGen.cpp index 6f16ac41926..161fccd28ac 100644 --- a/mozilla/dom/tools/FileGen.cpp +++ b/mozilla/dom/tools/FileGen.cpp @@ -52,6 +52,9 @@ static const char *kDisclaimerStr = "/* AUTO-GENERATED. DO NOT EDIT!!! */\n"; static const char *kObjTypeStr = "nsIDOM%s*"; static const char *kObjTypePtrStr = "nsIDOM%sPtr"; static const char *kUuidStr = "NS_IDOM%s_IID"; +static const char *kXPIDLObjTypeStr = "%s*"; +static const char *kXPIDLObjTypePtrStr = "%sPtr"; +static const char *kXPIDLUuidStr = "NS_I%s_IID"; FileGen::FileGen() { @@ -133,6 +136,8 @@ FileGen::GetVariableTypeForMethodLocal(char *aBuffer, IdlVariable &aVariable) case TYPE_OBJECT: sprintf(aBuffer, kObjTypePtrStr, aVariable.GetTypeName()); break; + case TYPE_XPIDL_OBJECT: + sprintf(aBuffer, kXPIDLObjTypePtrStr, aVariable.GetTypeName()); default: // XXX Fail for other cases break; @@ -173,6 +178,9 @@ FileGen::GetVariableTypeForLocal(char *aBuffer, IdlVariable &aVariable) case TYPE_OBJECT: sprintf(aBuffer, kObjTypeStr, aVariable.GetTypeName()); break; + case TYPE_XPIDL_OBJECT: + sprintf(aBuffer, kXPIDLObjTypeStr, aVariable.GetTypeName()); + break; default: // XXX Fail for other cases break; @@ -213,6 +221,9 @@ FileGen::GetVariableTypeForParameter(char *aBuffer, IdlVariable &aVariable) case TYPE_OBJECT: sprintf(aBuffer, kObjTypeStr, aVariable.GetTypeName()); break; + case TYPE_XPIDL_OBJECT: + sprintf(aBuffer, kXPIDLObjTypeStr, aVariable.GetTypeName()); + break; default: // XXX Fail for other cases break; @@ -260,6 +271,23 @@ FileGen::GetInterfaceIID(char *aBuffer, IdlInterface &aInterface) GetInterfaceIID(aBuffer, aInterface.GetName()); } +void +FileGen::GetXPIDLInterfaceIID(char* aBuffer, char* aInterfaceName) +{ + char buf[256]; + + strcpy(buf, aInterfaceName); + StrUpr(buf); + + sprintf(aBuffer, kXPIDLUuidStr, buf); +} + +void +FileGen::GetXPIDLInterfaceIID(char* aBuffer, IdlInterface &aInterface) +{ + GetInterfaceIID(aBuffer, aInterface.GetName()); +} + void FileGen::GetCapitalizedName(char *aBuffer, IdlObject &aObject) { @@ -290,9 +318,9 @@ FileGen::CollectAllInInterface(IdlInterface &aInterface, for (a = 0; a < acount; a++) { IdlAttribute *attr = aInterface.GetAttributeAt(a); - if ((attr->GetType() == TYPE_OBJECT) && + if (((attr->GetType() == TYPE_OBJECT) || (attr->GetType() == TYPE_XPIDL_OBJECT)) && !PL_HashTableLookup(aTable, attr->GetTypeName())) { - PL_HashTableAdd(aTable, attr->GetTypeName(), (void *)1); + PL_HashTableAdd(aTable, attr->GetTypeName(), (void *)(attr->GetType())); } } @@ -301,18 +329,18 @@ FileGen::CollectAllInInterface(IdlInterface &aInterface, IdlFunction *func = aInterface.GetFunctionAt(m); IdlVariable *rval = func->GetReturnValue(); - if ((rval->GetType() == TYPE_OBJECT) && + if (((rval->GetType() == TYPE_OBJECT) || (rval->GetType() == TYPE_XPIDL_OBJECT)) && !PL_HashTableLookup(aTable, rval->GetTypeName())) { - PL_HashTableAdd(aTable, rval->GetTypeName(), (void *)1); + PL_HashTableAdd(aTable, rval->GetTypeName(), (void *)(rval->GetType())); } int p, pcount = func->ParameterCount(); for (p = 0; p < pcount; p++) { IdlParameter *param = func->GetParameterAt(p); - if ((param->GetType() == TYPE_OBJECT) && + if (((param->GetType() == TYPE_OBJECT) || (param->GetType() == TYPE_XPIDL_OBJECT)) && !PL_HashTableLookup(aTable, param->GetTypeName())) { - PL_HashTableAdd(aTable, param->GetTypeName(), (void *)1); + PL_HashTableAdd(aTable, param->GetTypeName(), (void *)(param->GetType())); } } } @@ -351,7 +379,7 @@ FileGen::EnumerateAllObjects(IdlSpecification &aSpec, if (((i == 0) || !aOnlyPrimary) && !PL_HashTableLookup(htable, iface->GetName())) { - PL_HashTableAdd(htable, iface->GetName(), (void *)1); + PL_HashTableAdd(htable, iface->GetName(), (void *)(int)TYPE_OBJECT); } CollectAllInInterface(*iface, htable); diff --git a/mozilla/dom/tools/FileGen.h b/mozilla/dom/tools/FileGen.h index 48f0344e411..afaa9a62215 100644 --- a/mozilla/dom/tools/FileGen.h +++ b/mozilla/dom/tools/FileGen.h @@ -54,6 +54,8 @@ protected: void GetParameterType(char *aBuffer, IdlParameter &aParameter); void GetInterfaceIID(char *aBuffer, IdlInterface &aInterface); void GetInterfaceIID(char *aBuffer, char *aInterfaceName); + void GetXPIDLInterfaceIID(char *aBuffer, char *aInterfaceName); + void GetXPIDLInterfaceIID(char *aBuffer, IdlInterface &aInterface); void GetCapitalizedName(char *aBuffer, IdlObject &aObject); void EnumerateAllObjects(IdlSpecification &aSpec, PLHashEnumerator aEnumerator, diff --git a/mozilla/dom/tools/IdlAttribute.cpp b/mozilla/dom/tools/IdlAttribute.cpp index 98e3f5c4fb8..acde9f75380 100644 --- a/mozilla/dom/tools/IdlAttribute.cpp +++ b/mozilla/dom/tools/IdlAttribute.cpp @@ -49,4 +49,3 @@ int IdlAttribute::GetReadOnly() { return mReadOnly; } - diff --git a/mozilla/dom/tools/IdlAttribute.h b/mozilla/dom/tools/IdlAttribute.h index b7d3bc1cf05..ec928cf745e 100644 --- a/mozilla/dom/tools/IdlAttribute.h +++ b/mozilla/dom/tools/IdlAttribute.h @@ -32,7 +32,6 @@ public: void SetReadOnly(int aReadOnlyFlag); int GetReadOnly(); - }; #ifdef XP_MAC diff --git a/mozilla/dom/tools/IdlParser.cpp b/mozilla/dom/tools/IdlParser.cpp index c8fb62ac6f9..c224a4e8abd 100644 --- a/mozilla/dom/tools/IdlParser.cpp +++ b/mozilla/dom/tools/IdlParser.cpp @@ -239,7 +239,7 @@ IdlInterface* IdlParser::ParseInterface(IdlSpecification &aSpecification) * enum_type = "enum" identifier "{" enumerator < "," enumerator > "}" * const_dcl = "const" const_type identifier "=" const_exp * except_dcl = "exception" identifier "{" < member > "}" - * attr_dcl = [ "readonly" ] "attribute" param_type_spec identifier + * attr_dcl = [ "readonly" ] [ "xpidl" ] "attribute" param_type_spec identifier * op_dcl = [ op_attribute ] op_type_spec identifier parameter_dcls * [ raises_expr ] [ context_expr ] * op_attribute = "oneway" . @@ -545,9 +545,10 @@ IdlAttribute* IdlParser::ParseAttribute(IdlSpecification &aSpecification, int aT isReadOnly = 1; TrimComments(); token = mScanner->NextToken(); - if (ATTRIBUTE_TOKEN != token->id) { - throw AttributeParsingException("Missing attribute specifier."); - } + aTokenID = token->id; + } + if (ATTRIBUTE_TOKEN != aTokenID) { + throw AttributeParsingException("Missing attribute specifier."); } TrimComments(); @@ -601,6 +602,13 @@ IdlAttribute* IdlParser::ParseAttribute(IdlSpecification &aSpecification, int aT attrObj->SetTypeName(token->stringID); break; //} + case XPIDL_TOKEN: + token = mScanner->NextToken(); + if (IDENTIFIER_TOKEN == token->id) { + attrObj->SetType(TYPE_XPIDL_OBJECT); + attrObj->SetTypeName(token->stringID); + break; + } default: delete attrObj; throw AttributeParsingException("Unknow attribute type."); @@ -673,6 +681,14 @@ IdlFunction* IdlParser::ParseFunction(IdlSpecification &aSpecification, Token &a funcObj->SetReturnValue(TYPE_OBJECT, aToken.stringID); break; //} + case XPIDL_TOKEN: + { + Token* token = mScanner->NextToken(); + if (IDENTIFIER_TOKEN == token->id) { + funcObj->SetReturnValue(TYPE_XPIDL_OBJECT, token->stringID); + break; + } + } default: delete funcObj; throw AttributeParsingException("Unknown type."); @@ -830,7 +846,7 @@ IdlParameter* IdlParser::ParseFunctionParameter(IdlSpecification &aSpecification Token *token = mScanner->NextToken(); if (token->id == OPTIONAL_TOKEN) { argObj->SetIsOptional(1); - mScanner->NextToken(); + token = mScanner->NextToken(); } // the paramenter attribute (in, out, inout) @@ -909,6 +925,13 @@ IdlParameter* IdlParser::ParseFunctionParameter(IdlSpecification &aSpecification argObj->SetTypeName(token->stringID); break; //} + case XPIDL_TOKEN: + token = mScanner->NextToken(); + if (IDENTIFIER_TOKEN == token->id) { + argObj->SetType(TYPE_XPIDL_OBJECT); + argObj->SetTypeName(token->stringID); + break; + } default: delete argObj; throw ParameterParsingException("Unknow type in parameters list."); diff --git a/mozilla/dom/tools/IdlScanner.cpp b/mozilla/dom/tools/IdlScanner.cpp index 58f4724a663..4fe0241e8ee 100644 --- a/mozilla/dom/tools/IdlScanner.cpp +++ b/mozilla/dom/tools/IdlScanner.cpp @@ -205,6 +205,9 @@ Token* IdlScanner::NextToken() case 'w': WKeywords(mTokenName + 1, mCurrentToken); break; + case 'x': + XKeywords(mTokenName + 1, mCurrentToken); + break; case '"': String(c, mCurrentToken); // has to be a string break; @@ -1113,6 +1116,40 @@ void IdlScanner::WKeywords(char *aCurrentPos, Token *aToken) } } +// +// Either 'xpidl' or an identifier +// +void IdlScanner::XKeywords(char *aCurrentPos, Token *aToken) +{ + int c = mInputFile->get(); + if (c != EOF && c == 'p' && (*aCurrentPos++ = c) && (c = mInputFile->get()) && + c != EOF && c == 'i' && (*aCurrentPos++ = c) && (c = mInputFile->get()) && + c != EOF && c == 'd' && (*aCurrentPos++ = c) && (c = mInputFile->get()) && + c != EOF && c == 'l' && (*aCurrentPos++ = c)) { + // if terminated is a keyword + c = mInputFile->get(); + if (c != EOF) { + if (isalpha(c) || isdigit(c) || c == '_') { + // more characters, it must be an identifier + *aCurrentPos++ = c; + Identifier(aCurrentPos, aToken); + } + else { + // it is a keyword + aToken->SetToken(XPIDL_TOKEN); + mInputFile->putback(c); + } + } + else { + aToken->SetToken(XPIDL_TOKEN); + } + } + else { + // it must be an identifier + KeywordMismatch(c, aCurrentPos, aToken); + } +} + void IdlScanner::Identifier(char *aCurrentPos, Token *aToken) { int index = aCurrentPos - mTokenName; diff --git a/mozilla/dom/tools/IdlScanner.h b/mozilla/dom/tools/IdlScanner.h index 505a7721b57..a212f73e6fe 100644 --- a/mozilla/dom/tools/IdlScanner.h +++ b/mozilla/dom/tools/IdlScanner.h @@ -42,6 +42,7 @@ enum EIDLTokenType { EXCEPTION_TOKEN, READONLY_TOKEN, OPTIONAL_TOKEN, + XPIDL_TOKEN, ELLIPSIS_TOKEN, IID_TOKEN, ATTRIBUTE_TOKEN, @@ -196,6 +197,7 @@ protected: void UKeywords(char *aCurrentPos, Token *aToken); void VKeywords(char *aCurrentPos, Token *aToken); void WKeywords(char *aCurrentPos, Token *aToken); + void XKeywords(char *aCurrentPos, Token *aToken); void Identifier(char *aCurrentPos, Token *aToken); void Number(int aStartChar, Token *aToken); void String(int aStartChar, Token *aToken); diff --git a/mozilla/dom/tools/IdlVariable.h b/mozilla/dom/tools/IdlVariable.h index 2244be757dc..9cfb99b5fd3 100644 --- a/mozilla/dom/tools/IdlVariable.h +++ b/mozilla/dom/tools/IdlVariable.h @@ -38,6 +38,7 @@ enum Type { TYPE_UINT, TYPE_STRING, TYPE_OBJECT, + TYPE_XPIDL_OBJECT, TYPE_VOID }; diff --git a/mozilla/dom/tools/XPCOMGen.cpp b/mozilla/dom/tools/XPCOMGen.cpp index d09c253e88e..a0c490584b4 100644 --- a/mozilla/dom/tools/XPCOMGen.cpp +++ b/mozilla/dom/tools/XPCOMGen.cpp @@ -52,6 +52,7 @@ static const char *kIncludeDefaultsStr = static const char *kIncludeStr = "#include \"nsIDOM%s.h\"\n"; static const char *kIncludeJSStr = "#include \"jsapi.h\"\n"; static const char *kForwardClassStr = "class nsIDOM%s;\n"; +static const char *kForwardXPIDLClassStr = "class %s;\n"; static const char *kUuidStr = "#define %s \\\n" "%s\n\n"; @@ -191,7 +192,20 @@ ForwardDeclEnumerator(PLHashEntry *he, PRIntn i, void *arg) char buf[512]; ofstream *file = (ofstream *)arg; - sprintf(buf, kForwardClassStr, (char *)he->key); + switch ((Type)(int)(he->value)) { + case TYPE_OBJECT: + sprintf(buf, kForwardClassStr, (char *)he->key); + break; + + case TYPE_XPIDL_OBJECT: + sprintf(buf, kForwardXPIDLClassStr, (char *)he->key); + break; + + default: + // uh oh... + break; + } + *file << buf; return HT_ENUMERATE_NEXT;