From 3344ce9197926f262fa4eed30f085d72b08af744 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 29 Apr 2008 14:17:42 -0400 Subject: ENH: In cmSourceFile::GetLanguage use the file extension (if not ambiguous) to determine the language without requiring the source file to exist. --- Source/cmSourceFile.cxx | 37 +++++++++++++++++++++++++++++++++---- Source/cmSourceFile.h | 1 + 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Source/cmSourceFile.cxx b/Source/cmSourceFile.cxx index 7b32235..0a848f6 100644 --- a/Source/cmSourceFile.cxx +++ b/Source/cmSourceFile.cxx @@ -46,10 +46,28 @@ std::string const& cmSourceFile::GetExtension() const //---------------------------------------------------------------------------- const char* cmSourceFile::GetLanguage() { - // Compute the final location of the file if necessary. - if(this->FullPath.empty()) + // If the language was set explicitly by the user then use it. + if(const char* lang = this->GetProperty("LANGUAGE")) { - this->GetFullPath(); + return lang; + } + + // Perform computation needed to get the language if necessary. + if(this->FullPath.empty() && this->Language.empty()) + { + if(this->Location.ExtensionIsAmbiguous()) + { + // Finalize the file location to get the extension and set the + // language. + this->GetFullPath(); + } + else + { + // Use the known extension to get the language if possible. + std::string ext = + cmSystemTools::GetFilenameLastExtension(this->Location.GetName()); + this->CheckLanguage(ext); + } } // Now try to determine the language. @@ -252,8 +270,19 @@ void cmSourceFile::CheckExtension() } // Try to identify the source file language from the extension. + if(this->Language.empty()) + { + this->CheckLanguage(this->Extension); + } +} + +//---------------------------------------------------------------------------- +void cmSourceFile::CheckLanguage(std::string const& ext) +{ + // Try to identify the source file language from the extension. + cmMakefile* mf = this->Location.GetMakefile(); cmGlobalGenerator* gg = mf->GetLocalGenerator()->GetGlobalGenerator(); - if(const char* l = gg->GetLanguageFromExtension(this->Extension.c_str())) + if(const char* l = gg->GetLanguageFromExtension(ext.c_str())) { this->Language = l; } diff --git a/Source/cmSourceFile.h b/Source/cmSourceFile.h index 1eca56e..59cb7db 100644 --- a/Source/cmSourceFile.h +++ b/Source/cmSourceFile.h @@ -116,6 +116,7 @@ private: bool FindFullPath(); bool TryFullPath(const char* tryPath, const char* ext); void CheckExtension(); + void CheckLanguage(std::string const& ext); std::vector Depends; }; -- cgit v0.12