00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CPPCODECOMPLETION_H__
00021 #define __CPPCODECOMPLETION_H__
00022
00023 #include "cppsupportpart.h"
00024
00025 #include <ast.h>
00026 #include <codemodel.h>
00027
00028 #include <ktexteditor/viewcursorinterface.h>
00029 #include <ktexteditor/editinterface.h>
00030 #include <ktexteditor/codecompletioninterface.h>
00031
00032 #include <qobject.h>
00033 #include <qstringlist.h>
00034 #include <qtimer.h>
00035 #include <qguardedptr.h>
00036 #include <qregexp.h>
00037
00038 class CodeInformationRepository;
00039 class SimpleContext;
00040 class CppCodeCompletionData;
00041
00042 class CppCodeCompletion : public QObject
00043 {
00044 Q_OBJECT
00045 public:
00046 enum CompletionMode
00047 {
00048 NormalCompletion,
00049 SignalCompletion,
00050 SlotCompletion
00051 };
00052
00053 public:
00054 CppCodeCompletion( CppSupportPart* part );
00055 virtual ~CppCodeCompletion();
00056
00057 CodeInformationRepository* repository() { return m_repository; }
00058 CompletionMode completionMode() const { return m_completionMode; }
00059
00060 int expressionAt( const QString& text, int index );
00061 QStringList splitExpression( const QString& text );
00062 QStringList typeOf( const QString& name, const QStringList& scope );
00063 QStringList evaluateExpression( QString expr, SimpleContext* ctx );
00064
00065 static QStringList typeName( const QString& name );
00066
00067 public slots:
00068 void completeText();
00069
00070 private slots:
00071 void slotPartAdded(KParts::Part *part);
00072 void slotActivePartChanged(KParts::Part *part);
00073 void slotArgHintHided();
00074 void slotCompletionBoxHided( KTextEditor::CompletionEntry entry );
00075 void slotTextChanged();
00076 void slotFileParsed( const QString& fileName );
00077 void slotTimeout();
00078 void computeFileEntryList();
00079
00080 private:
00081 void integratePart( KParts::Part* part );
00082 void setupCodeInformationRepository();
00083 FunctionDefinitionAST* functionDefinition( AST* node );
00084 void computeRecoveryPoints();
00085
00086 QStringList evaluateExpressionInternal( QStringList& exprList, const QStringList& scope, SimpleContext* ctx=0 );
00087
00088 QStringList typeOf( const QValueList<Tag>& tags );
00089 QStringList typeOf( const QString& name, ClassDom klass );
00090 QStringList typeOf( const QString& name, NamespaceDom scope );
00091 QStringList typeOf( const QString& name, const FunctionList& methods );
00092
00094 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, SimpleContext* ctx, bool isInstance );
00095 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, const QStringList& type, bool isInstance );
00096 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, QValueList<Tag>& tags, bool isInstance );
00097 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, ClassDom klass, bool isInstance );
00098 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, NamespaceDom scope, bool isInstance );
00099 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, const FunctionList& methods, bool isInstance );
00100 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, const VariableList& attributes, bool isInstance );
00101 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, const ClassList& lst, bool isInstance );
00102 void computeCompletionEntryList( QValueList<KTextEditor::CompletionEntry>& entryList, const NamespaceList& lst, bool isInstance );
00103
00104 void computeSignatureList( QStringList& signatureList, const QString& name, const QStringList& type );
00105 void computeSignatureList( QStringList& signatureList, const QString& name, ClassDom klass );
00106 void computeSignatureList( QStringList& signatureList, const QString& name, const FunctionList& methods );
00107 void computeSignatureList( QStringList& signatureList, const QString& name, QValueList<Tag>& tags );
00108
00109 SimpleContext* computeContext( FunctionDefinitionAST* ast, int line, int col );
00110 void computeContext( SimpleContext*& ctx, StatementAST* ast, int line, int col );
00111 void computeContext( SimpleContext*& ctx, StatementListAST* ast, int line, int col );
00112 void computeContext( SimpleContext*& ctx, IfStatementAST* ast, int line, int col );
00113 void computeContext( SimpleContext*& ctx, ForStatementAST* ast, int line, int col );
00114 void computeContext( SimpleContext*& ctx, DoStatementAST* ast, int line, int col );
00115 void computeContext( SimpleContext*& ctx, WhileStatementAST* ast, int line, int col );
00116 void computeContext( SimpleContext*& ctx, SwitchStatementAST* ast, int line, int col );
00117 void computeContext( SimpleContext*& ctx, DeclarationStatementAST* ast, int line, int col );
00118 void computeContext( SimpleContext*& ctx, ConditionAST* ast, int line, int col );
00119
00120 QString getText( int startLine, int startColumn, int endLine, int endColumn );
00121
00122 ClassDom findContainer( const QString& name, NamespaceDom container=0, bool includeImports=false );
00123 QString findClass( const QString& className );
00124
00125 private:
00126 QGuardedPtr<CppSupportPart> m_pSupport;
00127 QTimer* m_ccTimer;
00128 QString m_activeFileName;
00129 KTextEditor::ViewCursorInterface* m_activeCursor;
00130 KTextEditor::EditInterface* m_activeEditor;
00131 KTextEditor::CodeCompletionInterface* m_activeCompletion;
00132
00133 bool m_bArgHintShow;
00134 bool m_bCompletionBoxShow;
00135
00136 unsigned int m_ccLine;
00137 unsigned int m_ccColumn;
00138
00139 CodeInformationRepository* m_repository;
00140 CppCodeCompletionData* d;
00141 CompletionMode m_completionMode;
00142
00143 QRegExp m_includeRx;
00144 QValueList<KTextEditor::CompletionEntry> m_fileEntryList;
00145 };
00146
00147 #endif