2012-11-30 17:26:26 +00:00
//------------------------------------------------------------------------------
// CLING - the C++ LLVM-based InterpreterG :)
// version: $Id$
// author: Vassil Vassilev <vvasilev@cern.ch>
//------------------------------------------------------------------------------
# include "MetaSema.h"
2012-12-01 13:46:50 +00:00
# include "Display.h"
2012-11-30 17:26:26 +00:00
# include "cling/Interpreter/Interpreter.h"
# include "cling/MetaProcessor/MetaProcessor.h"
# include "clang/Basic/SourceManager.h"
# include "clang/Frontend/CompilerInstance.h"
2013-01-08 15:34:40 +00:00
# include "clang/Serialization/ASTReader.h"
2012-11-30 17:26:26 +00:00
2013-02-25 15:54:36 +00:00
# include "llvm/ADT/SmallVector.h"
2012-11-30 17:26:26 +00:00
# include "llvm/ADT/StringRef.h"
# include "llvm/Support/Path.h"
2012-12-11 09:19:50 +00:00
# include <cstdlib>
2012-11-30 17:26:26 +00:00
namespace cling {
2013-01-17 15:27:14 +00:00
MetaSema : : MetaSema ( Interpreter & interp , MetaProcessor & meta )
: m_Interpreter ( interp ) , m_MetaProcessor ( meta ) , m_IsQuitRequested ( false ) ,
m_Outs ( m_MetaProcessor . getOuts ( ) ) {
m_LastResultedValue = StoredValueRef : : invalidValue ( ) ;
}
2012-12-01 14:30:31 +00:00
void MetaSema : : actOnLCommand ( llvm : : sys : : Path file ) const {
m_Interpreter . loadFile ( file . str ( ) ) ;
2012-11-30 17:26:26 +00:00
// TODO: extra checks. Eg if the path is readable, if the file exists...
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnComment ( llvm : : StringRef comment ) const {
2012-11-30 17:26:26 +00:00
// Some of the comments are meaningful for the cling::Interpreter
m_Interpreter . declare ( comment ) ;
}
2012-12-07 13:02:06 +00:00
void MetaSema : : actOnxCommand ( llvm : : sys : : Path file , llvm : : StringRef args )
2012-11-30 17:26:26 +00:00
{
// Fall back to the meta processor for now.
2012-12-07 13:02:06 +00:00
m_LastResultedValue = StoredValueRef : : invalidValue ( ) ;
m_MetaProcessor . executeFile ( file . str ( ) , args . str ( ) , & m_LastResultedValue ) ;
2012-11-30 17:26:26 +00:00
//m_Interpreter.loadFile(path.str());
// TODO: extra checks. Eg if the path is readable, if the file exists...
}
2012-12-06 11:47:24 +00:00
void MetaSema : : actOnqCommand ( ) {
m_IsQuitRequested = true ;
2012-11-30 17:26:26 +00:00
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnUCommand ( ) const {
2012-11-30 17:26:26 +00:00
m_Interpreter . unload ( ) ;
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnICommand ( llvm : : sys : : Path path ) const {
2012-11-30 17:26:26 +00:00
if ( path . isEmpty ( ) )
m_Interpreter . DumpIncludePath ( ) ;
else
m_Interpreter . AddIncludePath ( path . str ( ) ) ;
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnrawInputCommand ( SwitchMode mode /* = kToggle*/ ) const {
2012-11-30 17:26:26 +00:00
if ( mode = = kToggle ) {
2012-12-06 10:52:01 +00:00
bool flag = ! m_Interpreter . isRawInputEnabled ( ) ;
m_Interpreter . enableRawInput ( flag ) ;
2012-11-30 17:26:26 +00:00
// FIXME:
2013-01-17 15:27:14 +00:00
m_Outs < < ( flag ? " U " : " Not u " ) < < " sing raw input \n " ;
2012-11-30 17:26:26 +00:00
}
else
2012-12-06 10:52:01 +00:00
m_Interpreter . enableRawInput ( mode ) ;
2012-11-30 17:26:26 +00:00
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnprintASTCommand ( SwitchMode mode /* = kToggle*/ ) const {
2012-11-30 17:26:26 +00:00
if ( mode = = kToggle ) {
bool flag = ! m_Interpreter . isPrintingAST ( ) ;
m_Interpreter . enablePrintAST ( flag ) ;
// FIXME:
2013-01-17 15:27:14 +00:00
m_Outs < < ( flag ? " P " : " Not p " ) < < " rinting AST \n " ;
2012-11-30 17:26:26 +00:00
}
else
m_Interpreter . enablePrintAST ( mode ) ;
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOndynamicExtensionsCommand ( SwitchMode mode /* = kToggle*/ )
2012-11-30 17:26:26 +00:00
const {
if ( mode = = kToggle ) {
bool flag = ! m_Interpreter . isDynamicLookupEnabled ( ) ;
m_Interpreter . enableDynamicLookup ( flag ) ;
// FIXME:
2013-01-17 15:27:14 +00:00
m_Outs < < ( flag ? " U " : " Not u " ) < < " sing dynamic extensions \n " ;
2012-11-30 17:26:26 +00:00
}
else
m_Interpreter . enableDynamicLookup ( mode ) ;
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnhelpCommand ( ) const {
2012-11-30 17:26:26 +00:00
std : : string & metaString = m_Interpreter . getOptions ( ) . MetaString ;
2013-01-17 15:27:14 +00:00
m_Outs < < " Cling meta commands usage \n " ;
m_Outs < < " Syntax: .Command [arg0 arg1 ... argN] \n " ;
m_Outs < < " \n " ;
m_Outs < < metaString < < " q \t \t \t \t - Exit the program \n " ;
m_Outs < < metaString < < " L <filename> \t \t \t - Load file or library \n " ;
m_Outs < < metaString < < " (x|X) <filename>[args] \t \t - Same as .L and runs a " ;
m_Outs < < " function with signature " ;
m_Outs < < " \t \t \t \t ret_type filename(args) \n " ;
m_Outs < < metaString < < " I [path] \t \t \t - Shows the include path. If a path is " ;
m_Outs < < " given - \n \t \t \t \t adds the path to the include paths \n " ;
m_Outs < < metaString < < " @ \t \t \t \t - Cancels and ignores the multiline input \n " ;
m_Outs < < metaString < < " rawInput [0|1] \t \t \t - Toggle wrapping and printing " ;
m_Outs < < " the execution \n \t \t \t \t results of the input \n " ;
m_Outs < < metaString < < " dynamicExtensions [0|1] \t - Toggles the use of the " ;
m_Outs < < " dynamic scopes and the \t \t \t \t late binding \n " ;
m_Outs < < metaString < < " printAST [0|1] \t \t \t - Toggles the printing of input's " ;
m_Outs < < " corresponding \t \t \t \t AST nodes \n " ;
m_Outs < < metaString < < " help \t \t \t \t - Shows this information \n " ;
2012-11-30 17:26:26 +00:00
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnfileExCommand ( ) const {
2012-11-30 17:26:26 +00:00
const clang : : SourceManager & SM = m_Interpreter . getCI ( ) - > getSourceManager ( ) ;
SM . getFileManager ( ) . PrintStats ( ) ;
2013-01-17 15:27:14 +00:00
m_Outs < < " \n *** \n \n " ;
2012-11-30 17:26:26 +00:00
for ( clang : : SourceManager : : fileinfo_iterator I = SM . fileinfo_begin ( ) ,
E = SM . fileinfo_end ( ) ; I ! = E ; + + I ) {
2013-01-17 15:27:14 +00:00
m_Outs < < ( * I ) . first - > getName ( ) ;
m_Outs < < " \n " ;
2012-11-30 17:26:26 +00:00
}
2013-01-08 15:34:40 +00:00
/* Only available in clang's trunk:
clang : : ASTReader * Reader = m_Interpreter . getCI ( ) - > getModuleManager ( ) ;
const clang : : serialization : : ModuleManager & ModMan
= Reader - > getModuleManager ( ) ;
for ( clang : : serialization : : ModuleManager : : ModuleConstIterator I
= ModMan . begin ( ) , E = ModMan . end ( ) ; I ! = E ; + + I ) {
typedef
std : : vector < llvm : : PointerIntPair < const clang : : FileEntry * , 1 , bool > >
InputFiles_t ;
const InputFiles_t & InputFiles = ( * I ) - > InputFilesLoaded ;
for ( InputFiles_t : : const_iterator IFI = InputFiles . begin ( ) ,
IFE = InputFiles . end ( ) ; IFI ! = IFE ; + + IFI ) {
2013-01-17 15:27:14 +00:00
m_Outs < < IFI - > getPointer ( ) - > getName ( ) ;
m_Outs < < " \n " ;
2013-01-08 15:34:40 +00:00
}
}
*/
2012-11-30 17:26:26 +00:00
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnfilesCommand ( ) const {
2013-02-25 15:54:36 +00:00
typedef std : : vector < Interpreter : : LoadedFileInfo * > LoadedFiles_t ;
2012-11-30 17:26:26 +00:00
const LoadedFiles_t & LoadedFiles = m_Interpreter . getLoadedFiles ( ) ;
for ( LoadedFiles_t : : const_iterator I = LoadedFiles . begin ( ) ,
E = LoadedFiles . end ( ) ; I ! = E ; + + I ) {
char cType [ ] = { ' S ' , ' D ' , ' B ' } ;
2013-01-17 15:27:14 +00:00
m_Outs < < ' [ ' < < cType [ ( * I ) - > getType ( ) ] < < " ] " < < ( * I ) - > getName ( ) < < ' \n ' ;
2012-11-30 17:26:26 +00:00
}
}
2012-12-01 13:46:50 +00:00
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnclassCommand ( llvm : : StringRef className ) const {
2012-12-01 13:46:50 +00:00
if ( ! className . empty ( ) )
2013-01-17 15:27:14 +00:00
DisplayClass ( m_Outs , & m_Interpreter , className . str ( ) . c_str ( ) , true ) ;
2012-12-01 13:46:50 +00:00
else
2013-01-17 15:27:14 +00:00
DisplayClasses ( m_Outs , & m_Interpreter , false ) ;
2012-12-01 13:46:50 +00:00
}
2012-12-01 14:07:57 +00:00
void MetaSema : : actOnClassCommand ( ) const {
2013-01-17 15:27:14 +00:00
DisplayClasses ( m_Outs , & m_Interpreter , true ) ;
2012-12-01 13:46:50 +00:00
}
2012-12-02 20:14:02 +00:00
void MetaSema : : actOngCommand ( llvm : : StringRef varName ) const {
if ( varName . empty ( ) )
2013-01-17 15:27:14 +00:00
DisplayGlobals ( m_Outs , & m_Interpreter ) ;
2012-12-02 20:14:02 +00:00
else
2013-01-17 15:27:14 +00:00
DisplayGlobal ( m_Outs , & m_Interpreter , varName . str ( ) . c_str ( ) ) ;
2012-12-02 20:14:02 +00:00
}
2012-12-05 13:20:58 +00:00
void MetaSema : : actOnTypedefCommand ( llvm : : StringRef typedefName ) const {
if ( typedefName . empty ( ) )
2013-01-17 15:27:14 +00:00
DisplayTypedefs ( m_Outs , & m_Interpreter ) ;
2012-12-05 13:20:58 +00:00
else
2013-01-17 15:27:14 +00:00
DisplayTypedef ( m_Outs , & m_Interpreter , typedefName . str ( ) . c_str ( ) ) ;
2012-12-05 13:20:58 +00:00
}
2012-12-11 09:19:50 +00:00
void MetaSema : : actOnShellCommand ( llvm : : StringRef commandLine ) const {
llvm : : StringRef trimmed ( commandLine . trim ( " \t \n \v \f \r " ) ) ;
2012-12-19 09:56:37 +00:00
if ( ! trimmed . empty ( ) ) {
int ret = std : : system ( trimmed . str ( ) . c_str ( ) ) ;
( void ) ret ; // Silence warning unused return result of system.
}
2012-12-11 09:19:50 +00:00
}
2012-12-05 13:20:58 +00:00
2012-11-30 17:26:26 +00:00
} // end namespace cling