version 1.3, 2012/06/25 19:51:01
|
version 1.5, 2015/04/20 18:19:52
|
|
|
| |
#include "QualifierDecls.h" | #include "QualifierDecls.h" |
| |
#include <base/strings.h> |
#include <pal/strings.h> |
#include <base/types.h> | #include <base/types.h> |
#include <base/io.h> |
#include <pal/format.h> |
#include <base/dir.h> |
#include <pal/file.h> |
|
#include <pal/dir.h> |
#include <base/env.h> | #include <base/env.h> |
#include <base/paths.h> | #include <base/paths.h> |
| |
#if defined(CONFIG_OS_WINDOWS) |
#if defined(_MSC_VER) |
# include <time.h> | # include <time.h> |
#else | #else |
# include <unistd.h> | # include <unistd.h> |
|
|
/* xlc doesn't want to use static inline funciotns inside temaplate functions */ | /* xlc doesn't want to use static inline funciotns inside temaplate functions */ |
int _Scasecmp(const MI_Char* s1, const MI_Char* s2) | int _Scasecmp(const MI_Char* s1, const MI_Char* s2) |
{ | { |
return Zcasecmp(s1, s2); |
return Strcasecmp(s1, s2); |
} | } |
| |
//============================================================================== | //============================================================================== |
|
|
association = false; | association = false; |
extraClasses.clear(); | extraClasses.clear(); |
entryPoint.clear(); | entryPoint.clear(); |
warnings = false; |
no_warnings = false; |
|
modelCorrespondence = false; |
} | } |
| |
//============================================================================== | //============================================================================== |
|
|
| |
//============================================================================== | //============================================================================== |
// | // |
// err() |
// Fprintf() |
// | // |
// Writes a formatted error message to standard error (preceded by argv[0]) |
// Formats and writes a message to FILE. |
// and then exists. |
|
// | // |
//============================================================================== | //============================================================================== |
| |
|
|
if (wformat) | if (wformat) |
{ | { |
vfwprintf(os, wformat, ap); | vfwprintf(os, wformat, ap); |
free(wformat); |
PAL_Free(wformat); |
} | } |
else | else |
#endif | #endif |
|
|
// err() | // err() |
// | // |
// Writes a formatted error message to standard error (preceded by argv[0]) | // Writes a formatted error message to standard error (preceded by argv[0]) |
// and then exists. |
// and then exits. |
// | // |
//============================================================================== | //============================================================================== |
| |
|
|
if (wformat) | if (wformat) |
{ | { |
vfwprintf(stderr, wformat, ap); | vfwprintf(stderr, wformat, ap); |
free(wformat); |
PAL_Free(wformat); |
} | } |
else | else |
#endif | #endif |
|
|
| |
//============================================================================== | //============================================================================== |
// | // |
|
// errRefPropCount() |
|
// |
|
// For assocation class, it must have 2 reference properties count. |
|
// Otherwise, call this function to write error message and exits. |
|
// |
|
//============================================================================== |
|
void errRefPropCount(const MI_Char* classname) |
|
{ |
|
err(ID_INSUFFICIENT_REFERENCES, "incorrect references properties count: " |
|
"assocation class %s shall have two references properties", classname); |
|
} |
|
|
|
//============================================================================== |
|
// |
// put() | // put() |
// | // |
// Write formatted output to the given stream (similar to fprintf). | // Write formatted output to the given stream (similar to fprintf). |
|
|
| |
static bool Inhale(const char* path, vector<char>& data) | static bool Inhale(const char* path, vector<char>& data) |
{ | { |
FILE* is = Fopen(path, "r"); |
FILE* is = File_Open(path, "r"); |
| |
if (!is) | if (!is) |
return false; | return false; |
|
|
"{\n" | "{\n" |
" return MI_Instance_Delete(&self->__instance);\n" | " return MI_Instance_Delete(&self->__instance);\n" |
"}\n" | "}\n" |
"\n" |
"\n"; |
"MI_INLINE MI_Result MI_CALL <ALIAS>_Post(\n" |
|
|
string r = T; |
|
if (cd->flags & MI_FLAG_INDICATION) |
|
{ |
|
r += "MI_INLINE MI_Result MI_CALL <ALIAS>_Post(\n" |
|
" const <ALIAS>* self,\n" |
|
" MI_Context* context,\n" |
|
" MI_Uint32 subscriptionIDCount,\n" |
|
" const MI_Char* bookmark)\n" |
|
"{\n" |
|
" return MI_Context_PostIndication(context, &self->__instance, subscriptionIDCount, bookmark);\n" |
|
"}\n" |
|
"\n"; |
|
} |
|
else |
|
{ |
|
r += "MI_INLINE MI_Result MI_CALL <ALIAS>_Post(\n" |
" const <ALIAS>* self,\n" | " const <ALIAS>* self,\n" |
" MI_Context* context)\n" | " MI_Context* context)\n" |
"{\n" | "{\n" |
" return MI_PostInstance(context, &self->__instance);\n" | " return MI_PostInstance(context, &self->__instance);\n" |
"}\n" | "}\n" |
"\n"; | "\n"; |
|
} |
string r = T; |
|
r = sub(r, "<ALIAS>", alias); | r = sub(r, "<ALIAS>", alias); |
puts(os, r); | puts(os, r); |
} | } |
|
|
{ | { |
string r; | string r; |
| |
if (!s_options.association && CanGenerateAssocRoles(cd)) |
if (CanGenerateAssocRoles(cd)) |
|
{ |
|
if (!s_options.association) |
{ | { |
r = ASSOCIATION_PROVIDER_CLASS_DECLARATION_ROLES; | r = ASSOCIATION_PROVIDER_CLASS_DECLARATION_ROLES; |
SubRoles(cd, r); | SubRoles(cd, r); |
} | } |
else | else |
r = ASSOCIATION_PROVIDER_CLASS_DECLARATION; | r = ASSOCIATION_PROVIDER_CLASS_DECLARATION; |
|
} |
|
else |
|
errRefPropCount(cd->name); |
| |
r = sub(r, "<ALIAS>", alias); | r = sub(r, "<ALIAS>", alias); |
r = sub(r, "<DATA_MEMBERS>", extraDataMemebers); | r = sub(r, "<DATA_MEMBERS>", extraDataMemebers); |
|
|
} | } |
else | else |
{ | { |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
{ | { |
|
|
else | else |
{ | { |
// Rewrite the file. | // Rewrite the file. |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s",path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s",path.c_str()); |
|
|
| |
// Rewrite the file. | // Rewrite the file. |
{ | { |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
{ | { |
|
|
| |
// Rewrite the file. | // Rewrite the file. |
{ | { |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
{ | { |
|
|
| |
_PatchLoadUnloadCPP(alias, path, data); | _PatchLoadUnloadCPP(alias, path, data); |
| |
os = Fopen(path.c_str(), "a"); |
os = File_Open(path.c_str(), "a"); |
| |
if (!os) | if (!os) |
{ | { |
|
|
} | } |
else | else |
{ | { |
os = Fopen(path.c_str(), "w"); |
os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
{ | { |
|
|
| |
if (cd->flags & MI_FLAG_ASSOCIATION) | if (cd->flags & MI_FLAG_ASSOCIATION) |
{ | { |
if (!s_options.association && CanGenerateAssocRoles(cd)) |
if (CanGenerateAssocRoles(cd)) |
|
{ |
|
if (!s_options.association) |
{ | { |
r = ASSOCIATION_PROVIDER_CLASS_STUBS_CPP_ROLES; | r = ASSOCIATION_PROVIDER_CLASS_STUBS_CPP_ROLES; |
SubRoles(cd, r); | SubRoles(cd, r); |
|
|
else | else |
r = ASSOCIATION_PROVIDER_CLASS_STUBS_CPP; | r = ASSOCIATION_PROVIDER_CLASS_STUBS_CPP; |
} | } |
|
else |
|
errRefPropCount(cd->name); |
|
} |
else if (cd->flags & MI_FLAG_INDICATION) | else if (cd->flags & MI_FLAG_INDICATION) |
r = INDICATION_PROVIDER_CLASS_STUBS_CPP; | r = INDICATION_PROVIDER_CLASS_STUBS_CPP; |
else | else |
|
|
{ | { |
string r; | string r; |
| |
if (!s_options.association && CanGenerateAssocRoles(cd)) |
if (CanGenerateAssocRoles(cd)) |
|
{ |
|
if (!s_options.association) |
{ | { |
r = ASSOCIATION_PROVIDER_STUBS_CPP_ROLES; | r = ASSOCIATION_PROVIDER_STUBS_CPP_ROLES; |
SubRoles(cd, r); | SubRoles(cd, r); |
} | } |
else | else |
r = ASSOCIATION_PROVIDER_STUBS_CPP; | r = ASSOCIATION_PROVIDER_STUBS_CPP; |
|
} |
|
else |
|
errRefPropCount(cd->name); |
| |
r = sub(r, "<ALIAS>", alias); | r = sub(r, "<ALIAS>", alias); |
puts(os, r); | puts(os, r); |
|
|
string path = ExpandPath(alias + ".h"); | string path = ExpandPath(alias + ".h"); |
Fprintf(s_stdout, ID_CREATING, "Creating %s\n", path.c_str()); | Fprintf(s_stdout, ID_CREATING, "Creating %s\n", path.c_str()); |
| |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); |
|
|
GenInstanceFunctions(os,cd); | GenInstanceFunctions(os,cd); |
| |
// Gen setters. | // Gen setters. |
if (!s_options.noProviders) |
|
{ | { |
for (size_t i = 0; i < cd->numProperties; i++) | for (size_t i = 0; i < cd->numProperties; i++) |
GenSetter(os, cd, NULL, (MI_ParameterDecl*)cd->properties[i]); | GenSetter(os, cd, NULL, (MI_ParameterDecl*)cd->properties[i]); |
|
|
{ | { |
string r; | string r; |
| |
if (s_options.association || !CanGenerateAssocRoles(cd)) |
if (CanGenerateAssocRoles(cd)) |
|
{ |
|
if (s_options.association) |
r = ASSOCIATION_PROVIDER_PROTOTYPES; | r = ASSOCIATION_PROVIDER_PROTOTYPES; |
else | else |
{ | { |
r = ROLE_PROVIDER_PROTOTYPES; | r = ROLE_PROVIDER_PROTOTYPES; |
SubRoles(cd, r); | SubRoles(cd, r); |
} | } |
|
} |
|
else |
|
errRefPropCount(cd->name); |
| |
r = sub(r, "<ALIAS>", alias); | r = sub(r, "<ALIAS>", alias); |
puts(os, r); | puts(os, r); |
|
|
| |
_PatchLoadSignature(alias, path, data); | _PatchLoadSignature(alias, path, data); |
| |
os = Fopen(path.c_str(), "a"); |
os = File_Open(path.c_str(), "a"); |
| |
if (!os) | if (!os) |
{ | { |
|
|
} | } |
else | else |
{ | { |
os = Fopen(path.c_str(), "w"); |
os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
{ | { |
|
|
if (cd->flags & MI_FLAG_ASSOCIATION) | if (cd->flags & MI_FLAG_ASSOCIATION) |
{ | { |
string r; | string r; |
if (s_options.association || !CanGenerateAssocRoles(cd)) |
if (CanGenerateAssocRoles(cd)) |
|
{ |
|
if (s_options.association) |
r = ASSOCIATION_PROVIDER_STUBS; | r = ASSOCIATION_PROVIDER_STUBS; |
else | else |
{ | { |
r = ROLE_PROVIDER_STUBS; | r = ROLE_PROVIDER_STUBS; |
SubRoles(cd, r); | SubRoles(cd, r); |
} | } |
|
} |
|
else |
|
errRefPropCount(cd->name); |
| |
r = sub(r, "<ALIAS>", alias); | r = sub(r, "<ALIAS>", alias); |
puts(os, r); | puts(os, r); |
|
|
if (eqi(q->name, "ValueMap") && !s_options.values) | if (eqi(q->name, "ValueMap") && !s_options.values) |
continue; | continue; |
| |
// Skip Values qualifier if -M option was given. |
// Skip MappingStrings qualifier if -M option was given. |
if (eqi(q->name, "MappingStrings") && !s_options.mappingStrings) | if (eqi(q->name, "MappingStrings") && !s_options.mappingStrings) |
continue; | continue; |
| |
|
// Skip ModelCorrespondence qualifiers? |
|
if (eqi(q->name, "ModelCorrespondence") && !s_options.modelCorrespondence) |
|
continue; |
|
|
GenQualifier(parser, os, q, stem); | GenQualifier(parser, os, q, stem); |
count++; | count++; |
} | } |
|
|
if (eqi(q->name, "MappingStrings") && !s_options.mappingStrings) | if (eqi(q->name, "MappingStrings") && !s_options.mappingStrings) |
continue; | continue; |
| |
|
// Skip ModelCorrespondence qualifiers? |
|
if (eqi(q->name, "ModelCorrespondence") && !s_options.modelCorrespondence) |
|
continue; |
|
|
putl(os, " &%s_%s_qual,", stem.c_str(), q->name); | putl(os, " &%s_%s_qual,", stem.c_str(), q->name); |
} | } |
| |
|
|
" }\n" | " }\n" |
" }\n" | " }\n" |
"\n" | "\n" |
" MI_PostResult(context, MI_RESULT_OK);\n" |
" MI_Context_PostResult(context, MI_RESULT_OK);\n" |
"}\n" | "}\n" |
"\n" | "\n" |
"static void MI_CALL <ALIAS>_ReferenceInstances(\n" | "static void MI_CALL <ALIAS>_ReferenceInstances(\n" |
|
|
" }\n" | " }\n" |
" }\n" | " }\n" |
"\n" | "\n" |
" MI_PostResult(context, MI_RESULT_OK);\n" |
" MI_Context_PostResult(context, MI_RESULT_OK);\n" |
"}\n" | "}\n" |
"\n"; | "\n"; |
| |
|
|
| |
if (cd->flags & MI_FLAG_ASSOCIATION) | if (cd->flags & MI_FLAG_ASSOCIATION) |
{ | { |
if (!s_options.association && CanGenerateAssocRoles(cd)) |
if (CanGenerateAssocRoles(cd)) |
|
{ |
|
if (!s_options.association) |
{ | { |
string r = ROLES; | string r = ROLES; |
r = sub(r, "<ALIAS>", alias); | r = sub(r, "<ALIAS>", alias); |
SubRoles(cd, r); | SubRoles(cd, r); |
puts(os, r); | puts(os, r); |
} | } |
|
} |
|
else |
|
errRefPropCount(cd->name); |
| |
const char T[] = | const char T[] = |
"static MI_CONST MI_ProviderFT <ALIAS>_funcs =\n" | "static MI_CONST MI_ProviderFT <ALIAS>_funcs =\n" |
|
|
else | else |
r = sub(r, "<SCHEMA>", "schemaDecl"); | r = sub(r, "<SCHEMA>", "schemaDecl"); |
| |
if (s_options.cpp || !s_options.noProviders) |
|
r = sub(r, "<STATIC>", ""); | r = sub(r, "<STATIC>", ""); |
else |
|
r = sub(r, "<STATIC>", "static "); |
|
| |
if (cd->numProperties) | if (cd->numProperties) |
{ | { |
|
|
// Open the file. | // Open the file. |
string path = ExpandPath("schema.c"); | string path = ExpandPath("schema.c"); |
| |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); |
|
|
if (!cd) | if (!cd) |
err(ID_UNKNOWN_CLASS, "unknown class: %s", classNames[i].c_str()); | err(ID_UNKNOWN_CLASS, "unknown class: %s", classNames[i].c_str()); |
| |
if (!s_options.association && (cd->flags & MI_FLAG_ASSOCIATION) && |
if (cd->flags & MI_FLAG_ASSOCIATION) |
CanGenerateAssocRoles(cd)) |
{ |
|
if (CanGenerateAssocRoles(cd)) |
{ | { |
|
if (!s_options.association) |
generateMatch = true; | generateMatch = true; |
} | } |
|
else |
|
errRefPropCount(cd->name); |
|
} |
| |
// Include the class header. | // Include the class header. |
const string alias = AliasOf(cd->name); | const string alias = AliasOf(cd->name); |
|
|
} | } |
| |
// Generate MI_Server methods. | // Generate MI_Server methods. |
|
if (!s_options.noProviders) |
{ | { |
const char T[] = | const char T[] = |
"MI_Result MI_CALL MI_Server_GetVersion(\n" | "MI_Result MI_CALL MI_Server_GetVersion(\n" |
|
|
{ | { |
char buf[64]; | char buf[64]; |
Snprintf(buf, MI_COUNT(buf), "MI_MAKE_VERSION(%u,%u,%u)", | Snprintf(buf, MI_COUNT(buf), "MI_MAKE_VERSION(%u,%u,%u)", |
MI_MAJOR, MI_MINOR, MI_REVISON); |
MI_MAJOR, MI_MINOR, MI_REVISION); |
r = sub(r, "<VERSION>", buf); | r = sub(r, "<VERSION>", buf); |
} | } |
| |
|
|
| |
// Rewrite the file. | // Rewrite the file. |
{ | { |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
{ | { |
|
|
return; | return; |
} | } |
| |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); |
|
|
return; | return; |
} | } |
| |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); |
|
|
return; | return; |
} | } |
| |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); |
|
|
// Open the file. | // Open the file. |
string path = ExpandPath("stubs.cpp"); | string path = ExpandPath("stubs.cpp"); |
| |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); |
|
|
{ | { |
// Open the file. | // Open the file. |
const string path = ExpandPath("strings.rc"); | const string path = ExpandPath("strings.rc"); |
FILE* os = Fopen(path.c_str(), "w"); |
FILE* os = File_Open(path.c_str(), "w"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); |
|
|
} | } |
| |
if (!cd_right) | if (!cd_right) |
{ |
errRefPropCount(cd->name); |
err(ID_INSUFFICIENT_REFERENCES, "insufficient references: " |
|
"class must have 2 or more: %s", cd->name); |
|
} |
|
| |
res = _GetClassInheritanceRegistrationEntry(cd_left) + | res = _GetClassInheritanceRegistrationEntry(cd_left) + |
"+" + | "+" + |
|
|
{ | { |
// Open the file. | // Open the file. |
const string path = ExpandPath(s_options.providerRegistryPath); | const string path = ExpandPath(s_options.providerRegistryPath); |
FILE* os = Fopen(path.c_str(), "a"); |
FILE* os = File_Open(path.c_str(), "a"); |
| |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", path.c_str()); |
|
|
} | } |
| |
// Open Makefile: | // Open Makefile: |
FILE* os = Fopen(MAKEFILE, "w"); |
FILE* os = File_Open(MAKEFILE, "w"); |
if (!os) | if (!os) |
err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", MAKEFILE); | err(ID_FAILED_TO_OPEN_FILE, "failed to open file: %s", MAKEFILE); |
| |
{ | { |
// 'OMIMAK' variable. | // 'OMIMAK' variable. |
string OMIMAK = string(GetPath(ID_DATADIR)) + "/omi.mak"; |
string OMIMAK = string(OMI_GetPath(ID_DATADIR)) + "/omi.mak"; |
| |
// 'PROVIDER' variable. | // 'PROVIDER' variable. |
string PROVIDER = s_options.providerName; | string PROVIDER = s_options.providerName; |
|
|
r = sub(r, "<SOURCES>", SOURCES); | r = sub(r, "<SOURCES>", SOURCES); |
r = sub(r, "<CLASSES>", CLASSES); | r = sub(r, "<CLASSES>", CLASSES); |
r = sub(r, "<CMDLINE>", cmdLine); | r = sub(r, "<CMDLINE>", cmdLine); |
|
r = subu(r, "<MIAPIVERSION>", _MIAPIVERSION); |
puts(os, r); | puts(os, r); |
} | } |
| |
|
|
localClassNamesArg.push_back(classNamesArg[i].c_str()); | localClassNamesArg.push_back(classNamesArg[i].c_str()); |
} | } |
| |
// WIndows trick to get compatible float format |
|
#ifdef WIN32 | #ifdef WIN32 |
|
// Platform-specific trick to get compatible float format |
_set_output_format(_TWO_DIGIT_EXPONENT); | _set_output_format(_TWO_DIGIT_EXPONENT); |
#endif | #endif |
| |
|
|
| |
if ( s_options.quiet ) | if ( s_options.quiet ) |
{ | { |
s_stdout = Fopen(NULL_FILE, "a"); |
s_stdout = File_Open(NULL_FILE, "a"); |
} | } |
else | else |
{ | { |
|
|
} | } |
| |
// Create the parser. | // Create the parser. |
Parser parser(s_options.paths, s_options.warnings); |
Parser parser(s_options.paths, !s_options.no_warnings); |
| |
// Parse all the MOF files. | // Parse all the MOF files. |
for (size_t i = 0; i < mofFilesArg.size(); i++) | for (size_t i = 0; i < mofFilesArg.size(); i++) |
|
|
classNames.push_back(cd->name); | classNames.push_back(cd->name); |
| |
// Reject classes that are abstract. | // Reject classes that are abstract. |
if (cd->flags & MI_FLAG_ABSTRACT) |
if (cd->flags & MI_FLAG_ABSTRACT && !s_options.noProviders) |
{ | { |
err(ID_REFUSED_TO_GENERATE_PROVIDER_FOR_ABSTRACT_CLASS, | err(ID_REFUSED_TO_GENERATE_PROVIDER_FOR_ABSTRACT_CLASS, |
"refused to generated provider for abstract class: %s", | "refused to generated provider for abstract class: %s", |