File: preprocessjob.h

package info (click to toggle)
kdevelop 4%3A4.3.1-3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 18,844 kB
  • sloc: cpp: 91,758; python: 1,095; lex: 422; ruby: 120; sh: 114; xml: 42; makefile: 38
file content (110 lines) | stat: -rw-r--r-- 3,846 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
* This file is part of KDevelop
*
* Copyright 2006 Adam Treat <treat@kde.org>
* Copyright 2007-2009 David Nolden <david.nolden.kdevelop@art-master.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

#ifndef PREPROCESSJOB_H
#define PREPROCESSJOB_H

class CPPParseJob;

#include <kurl.h>
#include <language/backgroundparser/parsejob.h>
#include <ksharedptr.h>

#include "parser/rpp/preprocessor.h"

namespace Cpp {
    class EnvironmentFile;
    typedef KSharedPtr<EnvironmentFile> EnvironmentFilePointer;
}

namespace KDevelop {
    class ParsingEnvironment;
}

namespace rpp {
    class pp;
}

class CppPreprocessEnvironment;

/**
 * The preprocess-job preprocesses the actual content and registers it at the parent-job parse-session.
 * Additional it sets CPPParseJob::contentEnvironmentFile, CPPParseJob::proxyEnvironmentFile,
 * CPPParseJob::updatingProxyContext, CPPParseJob::updatingContentContext, and CPPParseJob::keepDuchain.
 *
 * When simplified matching is enabled, all those members will be filled accordingly. Else, only contentEnvironmentFile
 * and updatingContentContext will be filled.
 * */

class PreprocessJob : public ThreadWeaver::Job, public rpp::Preprocessor
{
    Q_OBJECT
public:
    PreprocessJob(CPPParseJob* parent);
    ~PreprocessJob();

    CPPParseJob* parentJob() const;

    virtual rpp::Stream* sourceNeeded(QString& fileName, IncludeType type, int sourceLine, bool skipCurrentPath);

    virtual bool success() const;

    //Must only be called for direct parsing when the job is not queued
    virtual void run();

    virtual void headerSectionEnded(rpp::Stream& stream);
    
    virtual void foundHeaderGuard(rpp::Stream& stream, KDevelop::IndexedString guardName);
    
    /**
     * Returns the standard-environment used for parsing c++ files(all other environments are based on that one)
     * The returned environment can be dynamic_casted to rpp::Environment.
     *
     * The returned environment is created exclusively for you, and you must destroy it.
     *
     * It can be used for matching, but it cannot be used for parsing.
     * */
    static KDevelop::ParsingEnvironment* createStandardEnvironment();

    static const KDevelop::ParsingEnvironment* standardEnvironment();
private:
    void headerSectionEndedInternal(rpp::Stream* stream);
    bool checkAbort();
    bool readContents();

    CppPreprocessEnvironment* m_currentEnvironment;
    KSharedPtr<Cpp::EnvironmentFile> m_firstEnvironmentFile; //First environment-file. If simplified matching is used, this is the proxy.
    //If simplified matching is used, a separate EnvironmentFile is used for the content, as opposed to the #include statements.
    KSharedPtr<Cpp::EnvironmentFile> m_secondEnvironmentFile;
    //This is the environment-file that is currently updated. May be the proxy in the beginning, and context later after header-section ended.
    KSharedPtr<Cpp::EnvironmentFile> m_updatingEnvironmentFile;
    bool m_success;
    bool m_headerSectionEnded;
    rpp::pp* m_pp;
    QByteArray m_contents;

    static KDevelop::ParsingEnvironment* m_standardEnvironment;
};

KDevelop::ParsingEnvironment* CreateStandardEnvironment();
#endif